CF 332 C 貪心

來源:互聯網
上載者:User

標籤: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;}*/




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.