题解:

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

#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. SDL 显示汉字

    #include "stdafx.h" #pragma comment(lib,"SDL.lib") #pragma comment(lib,"SDL ...

  2. 《O’Reilly精品图书系列共21册》azw3

    套装书目: <机器学习:实用案例解析> <利用Python进行数据分析> <社交网站的数据挖掘与分析(原书第2版)> <社会网络分析:方法与实践> &l ...

  3. JDBC--调用函数&存错过程

    1.通过Connection对象的prepareCall()方法创建CallableStatement对象的实例,在使用prepareCall()方法时需传入一个String类型的字符串,该字符串用于 ...

  4. Day2-G-Sticks-POJ1011

    George took sticks of the same length and cut them randomly until all parts became at most 50 units ...

  5. Day3-F-Buy Low Sell High-CodeForces867E

    You can perfectly predict the price of a certain stock for the next N days. You would like to profit ...

  6. 通用dao的demo

          代码片段 1. [代码]整型映射工具 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 package org.dave.common.databas ...

  7. POJ 2718 Smallest Difference dfs枚举两个数差最小

    Smallest Difference Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19528   Accepted: 5 ...

  8. OO第三次博客作业(第三单元总结)

    (1)梳理JML语言的理论基础.应用工具链情况 Java 建模语言(JML)将注释添加到 Java 代码中,这样我们就可以确定方法所执行的内容,而不必说明它们如何做到这一点.有了 JML,我们就可以描 ...

  9. 安卓10GB内存旗舰手机的普及,能成为拯救DRAM厂商的救命稻草吗?

    你对2019年手机即将展现出的全新变化,有哪些期待?是全新的处理器.更名副其实的全面屏,还是愈发强大的拍照功能,抑或折叠屏幕?但不管你有怎样的期待,手机厂商似乎总是"不解风情".常 ...

  10. Redis详解(四)——删除策略

    Redis详解(四)--删除策略 Redis中的数据特征 Redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令来获取其状态,当 key 不存在时,返回 -2 . 当 k ...