題目連接:https://www.luogu.org/problemnew/show/P1583c++
題目描述
一共有n(n≤20000)我的(以1--n編號)向佳佳要照片,而佳佳只能把照片給其中的k我的。佳佳按照與他們的關係好壞的程度給每一個人賦予了一個初始權值W[i]。而後將初始權值從大到小進行排序,每人就有了一個序號D[i](取值一樣是1--n)。按照這個序號對10取模的值將這些人分爲10類。也就是說定義每一個人的類別序號C[i]的值爲(D[i]-1) mod 10 +1,顯然類別序號的取值爲1--10。第i類的人將會額外獲得E[i]的權值。你須要作的就是求出加上額外權值之後,最終的權值最大的k我的,並輸出他們的編號。在排序中,若是兩人的W[i]相同,編號小的優先。spa
輸入輸出格式
輸入格式:
第一行輸入用空格隔開的兩個整數,分別是n和k。code
第二行給出了10個正整數,分別是E[1]到E[10]。blog
第三行給出了n個正整數,第i個數表示編號爲i的人的權值W[i]。排序
輸出格式:
只需輸出一行用空格隔開的k個整數,分別表示最終的W[i]從高到低的人的編號。ci
輸入輸出樣例
輸入樣例#1:
10 10
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
輸出樣例#1:
10 9 8 7 6 5 4 3 2 1get
題解:it
咱們能夠根據 $W[i]$ 對 $n$ 我的的編號進行排序,而後就能 $O(n)$ 的把每一個人對應的額外值 $E[i]$ 其身上。class
而後再作一遍根據新的 $W[i]$ 對 $n$ 我的的編號進行排序,而後輸出便可。sort
AC代碼:
#include<bits/stdc++.h> using namespace std; const int maxn=2e4+10; int n,k; int e[13]; int w[maxn],d[maxn]; bool cmp(int a,int b) { return (w[a]==w[b])?(a<b):(w[a]>w[b]); } int main() { cin>>n>>k; for(int i=1;i<=10;i++) cin>>e[i]; for(int i=1;i<=n;i++) cin>>w[i], d[i]=i; sort(d+1,d+n+1,cmp); for(int i=1;i<=n;i++) w[d[i]]+=e[(i-1)%10+1]; for(int i=1;i<=n;i++) d[i]=i; sort(d+1,d+n+1,cmp); for(int i=1;i<=k;i++) cout<<d[i]<<((i==n)?'\n':' '); }