Luogu 1583 - 魔法照片 - [簡單排序題]

題目連接: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':' ');
}
相關文章
相關標籤/搜索