码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #311 (Div. 2)

时间:2015-07-01 20:17:46      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!