標籤:blog http os io for ar art 代碼
題目連結:http://codeforces.com/problemset/problem/332/C
參考 連結: http://blog.csdn.net/cc_again/article/details/9471465
題目意思:
有n個命令,要通過p個,某主席要在通過的p個中選擇k個接受。
每個任務有兩個值ai,bi, ai表示如果該主席接受該命令,她的頭髮變灰的數量,bi表示如果該主席不接受該命令時,議員不高興值。
對於通過的p個命令,該主席要使議員的不高興值和最小,在相同的情況下,要使自己的頭髮變灰的數量儘可能的少。
讓你求出通過哪p個命令,使得該主席的頭髮變灰的數量最多,在相同的情況下,輸出使議員不高興最大的選擇。
解題思路:
非常關鍵的一點是主席的想法和我們不同,我們先選出主席一定不會通過的p-k條命令來,那麼這p-k條命令必須
unhappy最小,然後那k條必須選的選擇num(白頭髮數量)最多的,這樣頭髮多的選出來了,再更新那不選的p-k條,大致思路
說完了,看代碼吧:
/*題目意思:有n個命令,要通過p個,某主席要在通過的p個中選擇k個接受。每個任務有兩個值ai,bi, ai表示如果該主席接受該命令,她的頭髮變灰的數量,bi表示如果該主席不接受該命令時,議員不高興值。對於通過的p個命令,該主席要使議員的不高興值和最小,在相同的情況下,要使自己的頭髮變灰的數量儘可能的少。讓你求出通過哪p個命令,使得該主席的頭髮變灰的數量最多,在相同的情況下,輸出使議員不高興最大的選擇。*/// 好難的貪心#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 101000struct stud{int num,unhappy;int pos,pp;}f[N],s[N];int n,p,k,vis[N];int ans[N];int cmp1(stud a,stud b) //按照主席的習慣,先選不高興多,然後迴轉發也少的{ if(a.unhappy==b.unhappy) return a.num<b.num; return a.unhappy>b.unhappy;}int cmp2(stud a,stud b) //按照我們意願,選頭髮掉的多,為什麼unhappy大的在前面呢,請看cmp1,unhappy大的在前面, //我們找到前面的unhappy最小的越大,後面迴轉發的unhappy的選擇越大,{ if(a.num==b.num) return a.unhappy>b.unhappy; return a.num>b.num;}int main(){ int i; while(~scanf("%d%d%d",&n,&p,&k)) { for(i=1;i<=n;i++) { scanf("%d%d",&f[i].num,&f[i].unhappy); f[i].pos=i; } sort(f+1,f+n+1,cmp1);//按不高興減序,白頭髮增序 memcpy(s,f,sizeof(f)); //請記住,一定要開另一個結構體,不要像我下面的一樣,因為cmp2排序後再cmp1可能不是這個序列了 for(i=1;i<=n;i++) f[i].pp=i; sort(f+1,f+n-(p-k)+1,cmp2); //留下最少逼迫主席選前面num大的p-k個(暫時逼迫主席的,後面會更新) int j=1; for(i=1;i<=k;i++) { j=max(j,f[i].pp); if(i==1) printf("%d",f[i].pos); else printf(" %d",f[i].pos); } sort(s+j+1,s+n+1,cmp1); for(i=j+1;i<=j+p-k;i++) printf(" %d",s[i].pos); printf("\n"); } return 0;}//附上一份讓我自己寫的吐血的錯誤碼 //就是沒有開兩個數組,wa到死/*#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 100005struct stud{int hair,anger;int pos,pp;}f[N];int n,p,k;int cmp1(stud a,stud b){ if(a.anger==b.anger) return a.hair<b.hair; return a.anger>b.anger;}int cmp2(stud a,stud b){ if(a.hair==b.hair) return a.anger>b.anger; return a.hair>b.hair;}int main(){ int n,i; while(~scanf("%d%d%d",&n,&p,&k)) { for(i=1;i<=n;i++) { scanf("%d%d",&f[i].hair,&f[i].anger); f[i].pos=i; } sort(f+1,f+n+1,cmp1); for(i=1;i<=n;i++) f[i].pp=i; sort(f+1,f+n+1-(p-k),cmp2); int j=1; for(i=1;i<=k;i++) { if(i==1) printf("%d",f[i].pos); else printf(" %d",f[i].pos); j=max(j,f[i].pp); } sort(f+1,f+n+1,cmp1); sort(f+j+1,f+n+1,cmp1); for(i=j+1;i<=j+p-k;i++) printf(" %d",f[i].pos); printf("\n"); } return 0;}*/