题解:

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

#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 魔法照片的更多相关文章

  1. (sort 排序)P1583 魔法照片 洛谷

    题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ...

  2. 洛谷 P1583 魔法照片

    P1583 魔法照片 题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初 ...

  3. 洛谷 P1583 魔法照片【二级结构体排序】

    题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ...

  4. 洛谷P1583 魔法照片【模拟+排序】

    一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序,每人就有 ...

  5. 洛谷P1583——魔法照片(结构体排序)

    https://www.luogu.org/problem/show?pid=1583#sub 题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人. ...

  6. P1583 魔法照片

    题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ...

  7. Luogu P1583 魔法照片

    题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ...

  8. 【排序+模拟】魔法照片 luogu-1583

    题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ...

  9. 洛谷 P1583魔法照片 & P1051谁拿了最多奖学金 & P1093奖学金

    题目:https://www.luogu.org/problemnew/show/P1583 思路:sort sort sort //#include<bits/stdc++.h> #in ...

随机推荐

  1. 一、java基础-数据类型_数据类型转化_字符编码_转义字符

    1.Java  支持的8种基本数据类型: java的四种整数数据类型:byte 1    short 2     int4     long8   byte     8位带符号整数 -128到127之 ...

  2. 40和为S的两个数字

    题目描述 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述: 对应每个测试案例,输出两个数,小的先输出. 思路 ...

  3. centos6忘记root密码

    Centos6 1.在开机时不要自动进入系统,按任意键进入GRUB引导菜单 2.按E键进入编辑模式 3.选中kernel选项继续按E键 4.在结尾处添加single关键字后按ENTER保存退出 5.之 ...

  4. 被动信息收集-其他收集目标信息的途径:cupp、 recon-ng

    除了google等搜索收集,还有其他途径进行信息收集,其中就包括用命令行或集成的软件.框架进行搜集信息. 1.先举例几个简单的命令: 其实也会是调用搜索引擎,如谷歌必应等,需要翻墙,可以用proxyc ...

  5. 「BJWC2012」冻结

    传送门 Luogu 解题思路 分层图最短路,层与层之间的边的边权减半,然后就是板子了. 细节注意事项 咕咕咕. 参考代码 #include <algorithm> #include < ...

  6. Android按返回键退出程序

    既然想实现 按两次返回键 退出程序 有两个关键词 一个是 “返回键”,再一个是“退出程序” )先说“退出” 退出相信大家都会 finish(); System.exit(); 为了确保不出现问题,两种 ...

  7. 二十二 动态代理&解决网站的字符集编码问题

    设计模式: 软件开发过程中,遇到相似问题,将问题的解决方式抽取模型(套路) 单例,工厂,装饰者,适配器,动态代理 谷歌汽车场景: 谷歌汽车场景Car Interface Icar{  start  r ...

  8. SciPy 常量

    章节 SciPy 介绍 SciPy 安装 SciPy 基础功能 SciPy 特殊函数 SciPy k均值聚类 SciPy 常量 SciPy fftpack(傅里叶变换) SciPy 积分 SciPy ...

  9. html css3

    一.引入样式 1.行内样式表 <h1 style="color: red;font-size: 18px;">10-30</h1> 2.内部样式表(在hea ...

  10. docker-compose 修改zabbix images 添加微信报警插件 时间同步 中文乱码 添加grafana美化zabbix

    我们先来看一下我们要修改得  zabbix.yaml           github   https://github.com/bboysoulcn/awesome-dockercompose ve ...