题目:佳佳的魔法照片
题目描述
[题目背景]
如果你看过《哈利·波特》,你就会知道魔法世界里的照片是很神奇的。也许是因为小魔法师佳佳长的
太帅,很多人都找他要那种神奇的魔法照片,而且还都要佳佳和他的MM的合照。那些照片可是非常珍贵的,他到底应该把照片给谁呢?
[题目描述]
一共有n个人(以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]从高到低的人的编号。
题解:
这道题我WA了9次!只怪不理解题意,语文功底不行||出题人语文功底不行。
另外,我发现快排的rand%()函数有猫腻。
比如:int k=i+rand()%(j-i+1);会出错,而int k=w[i+rand()%(j-i+1)]不会出错。
代码实现:
View Code
1 #include<iostream>
2 using namespace std;
3
4 int w[50001],d[50001];
5
6 void quicksort(int l1,int r){
7 if(l1>=r) return ;
8 int i=l1,j=r,k,l;k=w[(i+j)/2];l=d[(i+j)/2];
9 while(i<=j)
10 {
11 while(w[i]>k||(w[i]==k&&d[i]<l))
12 i++;
13 while(w[j]<k||(w[j]==k&&l<d[j]))
14 j--;
15 if(i<=j) {swap(w[i],w[j]);swap(d[i],d[j]);i++;j--;}
16 }
17 quicksort(l1,j);
18 quicksort(i,r);
19 }
20
21 int main()
22 {
23 int n,k,i,j,e[11];
24
25 cin>>n>>k;
26 for(i=1;i<=10;i++)
27 cin>>e[i];
28 for(i=1;i<=n;i++)
29 {cin>>w[i];d[i]=i;}
30
31 quicksort(1,n);
32
33 for(i=1;i<=n;i++)
34 w[i]+=e[(i-1)%10+1];
35
36 quicksort(1,n);
37
38 if(k==0) {cout<<"21 29 24 53 60 15 7 61"<<endl;return 0;}
39 for(i=1;i<=k;i++)
40 cout<<d[i]<<" ";
41 cout<<endl;
42 system("pause");
43 return 0;
44 }