标签:
Problem:A. Ilya and Diploma (贪心)
题目大意:
学校要举办运动会,有n个学生参加,为了鼓励学生主办方一共颁发n个证书,保证每人一本,有三种证书,每个证书都有一个颁发数目的区间,在满足上面的条件下,尽量A证书最多,B证书次之,C证书能多则多,问最后颁发三种证书各多少本?
解题思路:
先对三类证书分别颁发min本,还有学生没有证书的话,就对没有证书的同学按照A,B,C的顺序进行贪心。
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main () 4 { 5 int n; 6 while (scanf ("%d", &n) != EOF) 7 { 8 int a[3][2], num[3]; 9 for (int i=0; i<3; i++) 10 { 11 scanf ("%d %d", &a[i][0], &a[i][1]); 12 num[i] = a[i][0]; 13 a[i][1] -= a[i][0]; 14 n -= a[i][0]; 15 } 16 for (int i=0; i<3 && n>0; i++) 17 { 18 num[i] += min (n, a[i][1]); 19 n -= a[i][1]; 20 } 21 printf ("%d %d %d\n", num[0], num[1], num[2]); 22 } 23 return 0; 24 }
Problem:B. Pasha and Tea (sort)
题目大意:
有一壶开水Wml,现在有n个男生,n个女生,有2*n个杯子(杯子容量各不相同),要求在不溢出的情况下,给男生倒的水是女生的二倍,问最多可以消耗多少ml水?
解题思路:
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 200005; 4 int main () 5 { 6 int n; 7 double m, a[maxn]; 8 while (scanf ("%d %lf", &n, &m) != EOF) 9 { 10 for (int i=0; i<2*n; i++) 11 scanf ("%lf", &a[i]); 12 sort (a, a+2*n); 13 double num = min (a[0], a[n]/2) * 3 * n; 14 num = min (num, m); 15 printf ("%f\n", num); 16 } 17 return 0; 18 }
Problem:C. Arthur and Table (sort+模拟)
题目大意:
一个桌子有n条腿(八脚怪究极进化体),现在需要移除一些桌子腿使桌子变平稳(平稳是有一半以上的桌子腿的长度是未移除桌子腿中最长的),每移除一条桌子腿需要花费精力,问最少花费多少精力才能让桌子平稳?
解题思路:
先对所有的桌子腿按照按照长度升序排列,然后枚举每个出现过的长度作为使桌子平稳的桌子腿中最长的,求出所花费精力,比较得出最小。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn = 100005; 4 const int N = 210; 5 struct Leg 6 { 7 int l, d; 8 }leg[maxn]; 9 bool cmp (Leg x, Leg y) 10 { 11 return x.l < y.l; 12 } 13 int main () 14 { 15 int n; 16 while (scanf ("%d", &n) != EOF) 17 { 18 int cnt[N], total = 0; 19 memset (leg, 0, sizeof(leg)); 20 memset (cnt, 0, sizeof(cnt)); 21 22 for (int i=0; i<n; i++) 23 scanf ("%d", &leg[i].l); 24 for (int i=0; i<n; i++) 25 { 26 scanf ("%d", &leg[i].d); 27 total += leg[i].d; 28 } 29 30 sort (leg, leg+n, cmp); 31 32 int Min, num, index, cost, i; 33 Min = total; 34 i = 0; 35 36 while (i < n) 37 { 38 index = i; 39 cost = total; 40 num = 0; 41 while (index<n && leg[i].l==leg[index].l) 42 {//枚举最高leg 43 cost -= leg[index++].d; 44 num ++; 45 } 46 num --; 47 for (int j=200; j>0&&num>0; j--) 48 {//加入低一点的leg,求出花费 49 cost -= min(num, cnt[j])*j; 50 num -= cnt[j]; 51 } 52 Min = min (Min, cost); 53 index = i; 54 while (index<n && leg[i].l==leg[index].l) 55 cnt[leg[index++].d] ++;//低一点的边加入cnt,以便后面枚举更高的leg时候减小花费 56 i = index; 57 } 58 printf ("%d\n", Min); 59 } 60 return 0; 61 }
Codeforces Round #311 (Div. 2)
标签:
原文地址:http://www.cnblogs.com/alihenaixiao/p/4613929.html