很绕的一题
排序也不容易啊
转载两种方法
第一种虽然没有ac但是思路很棒
#include <iostream>
#include <algorithm>
using namespace std;
int a[30000],f[3000],e[1000];//a[]为权值,f[]为序号
bool cmp(int x,int y){
return a[x]==a[y]?x<y:a[x]>a[y]; //本题排序规律
}
int main(){
int i,j,k,n;
cin>>n>>k;
for(i=1;i<=10;i++) cin>>e[i]; //输入
for(i=1;i<=n;i++) cin>>a[i],f[i]=i;//输入+初始化
sort(f+1,f+n+1,cmp); //排序
for(i=1;i<=n;i++)a[f[i]]+=e[(i-1)%10+1]; //这是题目要求
sort(f+1,f+n+1,cmp); //再排序
for(i=1;i<=k;i++) cout<<f[i]<<" ";//输出
}
第二种是AC代码
#include<cstdio>
#include<algorithm>
using namespace std;
struct Person{
int id,w;
}p[10000001]; //结构体,方便些
int n,k,E[11];
bool cmp(Person,Person); //排序的函数
int main(){
scanf("%d%d",&n,&k); //输入
for(int i=1;i<=10;i++) scanf("%d",&E[i]);
for(int i=0;i<n;i++){
scanf("%d",&p[i].w);
p[i].id=i+1;
}
sort(p,p+n,cmp); //sort函数,需带algorithm头文件
for(int i=0;i<n;i++)
p[i].w+=E[i%10+1];
sort(p,p+n,cmp);
for(int i=0;i<k;i++) printf("%d ",p[i].id); //输出
return 0;
}
bool cmp(Person a,Person b){
if(a.w==b.w) return a.id<b.id;
return a.w>b.w;
}