首页 > 编程语言 > 详细

(排序EX)P1583 魔法照片

时间:2020-02-17 14:45:39      阅读:67      评论:0      收藏:0      [点我收藏+]

题解:

需要注意的是,快排完之后并不是按照编号从小到大的顺序输出

#include<iostream>
using namespace std;
int r=0;
void swap(int &a,int &b){
  int t=a;
  a=b;
  b=t;
 }
void sort(int s[],int l,int r,int n[])//应用二分思想
{
    int mid=s[(l+r)/2];//中间数
    int i=l,j=r;
    do{
        while(s[i]>mid) i++;//查找左半部分比中间数大的数
        while(s[j]<mid) j--;//查找右半部分比中间数小的数
        if(i<=j)//如果有一组不满足排序条件(左小右大)的数
        {
            swap(s[i],s[j]);//交换
            swap(n[i],n[j]);
            i++;
            j--;
        }
    }while(i<=j);//这里注意要有=
    if(l<j) sort(s,l,j,n);//递归搜索左半部分
    if(i<r) sort(s,i,r,n);//递归搜索右半部分
}
void sort2(int s[],int k[],int i)

 if(k[i]>k[i+1]){
    swap(k[i],k[i+1]);//交换
 }
 r=i+1;
 if(s[r]==s[r+1]){
  sort2(s,k,r);
 }else{
  return;
 }
 if(k[i]>k[i+1]){
    swap(k[i],k[i+1]);//交换
 }
 return ;
}
int main()
{
 int n,k;
 cin>>n>>k;
 int e[10],w[n],num[n];
 for(int i=0;i<10;i++){
  cin>>e[i];
 }
 int ret=0;
 for(int i=0;i<n;i++){
  cin>>w[i];
  ret++;
  num[i]=ret;
 }
 sort(w,0,n-1,num);
 
 int key=1;
 while(key){
  for(int i=0;i<n;i++){
   if(w[i]==w[i+1]&&num[i]>num[i+1]){
    for(i;i<n;i++){
     if(w[i]==w[i+1]){
      sort2(w,num,i);
      i=r;
     }
    }
    break;
   }
   if(i==ret-1){
    key=0;
   }
  }
 }
 {
  cout<<"*********"<<endl;
  for(int i=0;i<n;i++){
   cout<<w[i]<<" "<<num[i]<<endl;;
  }
 }
 for(int i=0;i<n;i++){
  w[i]+=e[i%10];
 }
 sort(w,0,n-1,num);
 key=1;
 while(key){
  for(int i=0;i<n;i++){
   if(w[i]==w[i+1]&&num[i]>num[i+1]){
    for(i;i<n;i++){
     if(w[i]==w[i+1]){
      sort2(w,num,i);
      i=r;
     }
    }
    break;
   }
   if(i==ret-1){
    key=0;
   }
  }
 }
 {
  cout<<"*********"<<endl;
  for(int i=0;i<n;i++){
   cout<<w[i]<<" "<<num[i]<<endl;;
  }
 }
 for(int i=0;i<k;i++){
  cout<<num[i]<<" ";
 }
 cout<<endl;
 
 return 0;
}

 优秀的题解:

#include<cstdio>
#include<algorithm>
using namespace std;
int e[12],n,k;
struct person{
    int w;//权值
    int num;//编号
    int d;//类别
}p[20010];//储存每个人的信息
int w_comp(const person &a,const person &b){
    if(a.w!=b.w)return a.w>b.w;//从大到小排序
    return a.num<b.num;//序号小优先
}//结构体排序
int main(){
    scanf("%d%d",&n,&k);
    for(int i=0;i<10;i++)scanf("%d",&e[i]);
    for(int i=0;i<n;i++){
        scanf("%d",&p[i].w);
        p[i].num=i+1;
    }//读入+编号
    sort(p,p+n,w_comp);//第一次排序
    for(int i=0;i<n;i++){
        p[i].d=i%10;//分类
        p[i].w+=e[p[i].d];//加上e[i]
    }
    sort(p,p+n,w_comp);//第二次排序
    for(int i=0;i<k;i++)printf("%d ",p[i].num);
}

(排序EX)P1583 魔法照片

原文:https://www.cnblogs.com/lijiahui-123/p/12321158.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!