1. 程式人生 > >Luogu 1583 - 魔法照片 - [簡單排序題]

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

esp 空格 names c代碼 == color i++ 正整數 如果

題目鏈接:https://www.luogu.org/problemnew/show/P1583

題目描述
一共有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]相同,編號小的優先。

輸入輸出格式
輸入格式:
第一行輸入用空格隔開的兩個整數,分別是n和k。

第二行給出了10個正整數,分別是E[1]到E[10]。

第三行給出了n個正整數,第i個數表示編號為i的人的權值W[i]。

輸出格式:
只需輸出一行用空格隔開的k個整數,分別表示最終的W[i]從高到低的人的編號。

輸入輸出樣例
輸入樣例#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 1

題解:

我們可以根據 $W[i]$ 對 $n$ 個人的編號進行排序,然後就能 $O(n)$ 的把每個人對應的額外值 $E[i]$ 其身上。

然後再做一遍根據新的 $W[i]$ 對 $n$ 個人的編號進行排序,然後輸出即可。

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: ); }

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