题解:

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

#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. Android 如何从系统图库中选择图片

    转:http://blog.csdn.net/tody_guo/article/details/7560270 这几天我都在做Android的App,同时学习它的API,我将分享一些我学到的东西,比如 ...

  2. 前端Cannot read property 'disabled' of null 问题解决

    就是在项目中,控制台一直在报这个错,一直没找到是什么问题, 后来经过一番排查,发现是 因为在页面中使用了el-dropdown,但是在这个标签里面没有设置它的子元素,所以会报错,解决的方法就是在el- ...

  3. 微信内置浏览器video标签自动全屏的问题

    微信打开h5video视频的时候都会自动全屏播放,有时候影响用户体验 要禁止自动全屏就要加这几个属性 'x5-playsinline':'true', 'webkit-playsinline':'tr ...

  4. JS 一键复制插件应用 和 原生实现

    一.目前来说复制功能 clipboard.js基本可以兼容所有浏览器,可以任意复制文本,官方地址 https://clipboardjs.com/ 1.进入官方网站下载 然后引入 <script ...

  5. mysql any和all的用法

      1.ANY关键字假设any内部的查询语句返回的结果个数是三个,如:result1,result2,result3,那么, select ...from ... where a > any(. ...

  6. POJ 3292:Semi-prime H-numbers 筛选数

    Semi-prime H-numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8216   Accepted: 3 ...

  7. 如何使用linux查看tomcat日志

  8. ThinkCMF框架上的任意内容包含漏洞

    一.背景 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建. ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据 ...

  9. git参考

    https://github.com/NewLifeX  (redis.mq.数据海量查询.分布式任务调度)

  10. Codeforces Round #554 (Div. 2) 选做

    C. Neko does Maths 题意 给 \(a,b\) ,求一个最小的 \(k\) 使得 \(\text{lcm}(a+k,b+k)\) 最小. \(a,b\le 10^9\) 题解 \(\g ...