codeforce447 D SGU 548 貪心+優先隊列

來源:互聯網
上載者:User

標籤:style   blog   http   color   os   io   

codeforce447 D - DZY Loves Modification 
題意:
有一個n*m的矩陣,每次可以選擇一行或者一列,可以得到這行或這列的所有元素sum的積分,
然後使這一列/行的每一個元素都減少p,接著再選擇一行或一列,共操作k次,n,m<=1000,k<=1000000
求最多能得到多少積分

思路:
每次選擇sum最大的行或者列,但是時間複雜度太大,過不去~
若選擇一行,則每個列的sum一定減少p,同理;
若選擇的行數和列數確定下來了,選擇i行,k-i列,那麼行和列之間誰選選擇就沒有影響;
因為在選擇行的時候,每一列都的sum都減少p,每一列的相對大小沒有變化,前k-i大的列還是那幾列,同列。
所以可以用優先隊列O(n)預先處理出row_sum[i]和col_sum[k-i]的值。選i行則消耗了每列的i*p的大小,共k-i列,故共消耗了i*(k-i)*p,答案為
max( row_sum[i], col_sum[k-i])- i*(k-i)*p

注意:!!!!!WA了很久T.T,因為i*(k-i)*p會超過int範圍!!!

 1 /*=============================================================== 2 *   Copyright (C) 2014 All rights reserved. 3 *    4 *   File Name: codeforces447_D_greedy.cpp 5 *   Author:sunshine 6 *   Created Time: 2014年07月23日 7 * 8 ================================================================*/ 9 #include <map>10 #include <queue>11 #include <stack>12 #include <math.h>13 #include <stdio.h>14 #include <string.h>15 #include <iostream>16 #include <algorithm>17 18 using namespace std;19 20 int arr[1001][1001];21 long long row_sum[1000001];22 long long col_sum[1000001];23 24 int main(){25     int n,m,k,p;26     cin >> n >> m >> k >> p;27         28     priority_queue<int>row,col;29         30     for(int i = 0;i < n;i ++){31         long long tmp =  0;32         for(int j = 0;j < m;j ++){33             cin >> arr[i][j];34             tmp += arr[i][j];35         }36         row.push(tmp);37     }38 39     for(int j = 0;j < m;j ++){40         long long tmp = 0;41         for(int i = 0;i < n;i ++){42             tmp += arr[i][j];43         }44         col.push(tmp);45     }46         47     row_sum[0] = 0;48     for(int i = 1;i <= k;i ++){49         row_sum[i] = row_sum[i - 1] + row.top();50         row.push(row.top() - m * p);51         row.pop();52     }53 54     col_sum[0] = 0;55     for(int i = 1;i <= k;i ++){56         col_sum[i] = col_sum[i-1] + col.top();57         col.push(col.top() - n * p);58         col.pop();59     }60 61     long long res = row_sum[0] + col_sum[k];62     for(int i = 1;i <= k;i ++){63         res = max(res, row_sum[i] + col_sum[k - i] - (long long)i * (k - i) * p);64     }65     cout << res << endl;66     return 0;67 }
View Code

 

SGU 548 Dragons and Princesses
題意:
唐僧從起點1出發,依次從1到2到3……到n,第n位一定是一位公主,在2~n-1中可能是公主,也可能是龍,
d表示龍,p表示公主,每隻龍有di個金幣,每位公主有pi的美麗值,殺死一隻龍就可以得到相應的財富值。
唐僧喜歡位置為n的那位公主,所以要和位置為n的公主結婚,所以他不能被其他公主喜歡上,必須被最後一個公主喜歡。
他被公主喜歡上的條件是:在遇到位置為i的公主是,如果pi小於等於唐僧殺死的龍的數量,那麼公主
就認為唐僧很V5,會喜歡上唐僧,問題,唐僧成功和位置為n的公主結婚的情況下,最多能得到多少金幣。
如果不能結婚,輸出-1。

思路:
利用優先隊列遇到龍就吃掉,遇到公主,發現吃多了,就把多餘的小的都吐出來,當然遇到最後一個公主的時候不需要吐出來。

 1 #include <stdio.h> 2 #include <iostream> 3 #include <queue> 4 #include <algorithm> 5  6 using namespace std; 7  8 struct node{ 9     int key;10     int id;11     friend bool operator < (node a,node b){12         return a.key > b.key;13     }14 }dro;15 16 int arr[200005];17 18 int main(){19     int n;20     char ch[10];21     int key;22     int base;23     while(scanf("%d", &n) != EOF){24         25         priority_queue<node>que;26 27         for(int i = 0;i < n - 1;i ++){28             scanf("%s %d", ch, &key);29 30             if(ch[0] == ‘d‘){31                 dro.key = key;32                 dro.id = i + 2;33                 que.push(dro);34             }35             if(ch[0] == ‘p‘){36                 if(i != n - 2){37                     while(que.size() >= key){38                         que.pop();39                     }40                 }else{41                     base = key;42                 }43             }44         }45 46 47         if(que.size() < base){48             puts("-1");49         }else{50             int res = 0;51             int top = 0;52             while(que.size()){53                 dro = que.top();54                 que.pop();55             //    printf("key:%d id:%d\n",dro.key,dro.id);56                 res += dro.key;57                 arr[top++] = dro.id;58             }59 60             sort(arr,arr + top);61 62             printf("%d\n%d\n",res,top);63 64             for(int i = 0;i < top - 1;i ++){65                 printf("%d ",arr[i]);66             }67             printf("%d\n",arr[top - 1]);68         }69     }70     return 0;71 }
View Code

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.