题解:

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

#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. 启动kafka报错

    启动kafka时 报错: kafka-console-consumer.sh --from-beginning --zookeeper node01:8121,node02:8121,node03:8 ...

  2. 使用switch编写一个购物管理系统

    在编写过程中,可能没有做到语句的精简,这个是需要解决的事. package nzcc4; import java.util.Scanner; public class Shopmain { publi ...

  3. LATTICE 编程烧录器HW-USBN-2B使用说明

    HW-USBN-2B说明文档 1.       引脚定义 编程引脚 名称 编程设备引脚类型 描述 VCC 编程电压 输入 连接VCC到目标设备,典型的ICC=10Ma.板子设计必须考虑VCC的电流供应 ...

  4. 九:File类,文件的操作

    File的常用方法:

  5. PAT (Advanced Level) 1124~1127:1124模拟 1125优先队列 1126欧拉通路 1127中序后序求Z字形层序遍历

    1124 Raffle for Weibo Followers(20 分) 题意:微博抽奖,有M个人,标号为1~M.从第S个人开始,每N个人可以获奖,但是已获奖的人不能重复获奖,需要跳过该人把机会留给 ...

  6. Rolling Update【转】

    滚动更新是一次只更新一小部分副本,成功后,再更新更多的副本,最终完成所有副本的更新.滚动更新的最大的好处是零停机,整个更新过程始终有副本在运行,从而保证了业务的连续性. 下面我们部署三副本应用,初始镜 ...

  7. 使用 esxcli storage vmfs unmap 命令在精简置备的 LUN 上回收 VMFS 删除的块

    官方原文链接: https://kb.vmware.com/s/article/2057513?lang=zh_CN 本文介绍如何通过运行 esxcli storage vmfs unmap 命令回收 ...

  8. mongodb - 关联字段

    1,博客表结构  Blog.js var mongoose = require('mongoose') mongoose.connect('mongodb://localhost/test',{ us ...

  9. Day6-T2

    原题目 给你一个长度为n的序列A,请求出最大的一对数(Ai ,Aj),使Ai&Aj最大. 第一行为n,接下来n行,每一个数表示Ai. 输出最大的“and”. S1: Input: Output ...

  10. python的super()以及父类继承

    Python中子类调用父类的方法有两种方法能够实现:调用父类构造方法,或者使用super函数(两者不要混用). 使用“super”时经常会出现代码“super(FooChild,self).__ini ...