Codeforces Round #334 (Div. 2)

A. Uncowed Forces

题目链接:http://www.codeforces.com/contest/604/problem/A

题意:

类似CF算分,总共5道题500,1000,1500,2000,2500。

给出m1,m2,m3,m4,m5,w1,w2,w3,w4,w5。每道题根据 计算。再算上hack成功的和失败的。

模拟题,注意精度。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 double m1, m2, m3, m4, m5;
 4 double w1, w2, w3, w4, w5;
 5 double hs, hu;
 6 double fun(double x, double m, double w)
 7 {
 8     return max(x*0.3, (1-m/250)*x - 50*w);
 9 }
10 int main() 
11 {
12   //  freopen("in.txt", "r", stdin);
13   //freopen("out.txt", "w", stdout);
14     while(~scanf("%lf%lf%lf%lf%lf", &m1, &m2, &m3, &m4, &m5))
15     {
16         scanf("%lf%lf%lf%lf%lf", &w1, &w2, &w3, &w4, &w5);
17         scanf("%lf%lf", &hs, &hu);
18         double sum = fun(500, m1, w1) + fun(1000, m2, w2) + fun(1500, m3, w3) + fun(2000, m4, w4) + fun(2500, m5, w5);
19         sum += (hs*100 - hu*50);
20         cout<<int(sum)<<endl;
21     }
22     return 0;
23 }
View Code

B. More Cowbell

题目链接:http://www.codeforces.com/contest/604/problem/B

题意:给出n和k,n表示物品数目,k表示盒子数目。每个盒子最多只可以放两个物品。

给出每个物体的体积,求把物品都放进盒子后,最大的盒子的最小体积。

思路:分类讨论,当k >= n时,就是每个物品一个盒子,那么答案就是最大的物品的体积。

当k < n时,看有几个盒子需要装两个物品,大的先单个放,然后装两个的一大一小配。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n, k;
 4 int s[100010];
 5 int main() 
 6 {
 7    // freopen("in.txt", "r", stdin);  
 8     while(~scanf("%d%d", &n, &k))
 9     {
10         for(int i = 1; i <= n; i++) scanf("%d", &s[i]);
11         if(k >= n) printf("%d
", s[n]);
12         else if(k < n)
13         {
14             int cnt = n-k;  
15             if(cnt == k)
16             {
17                 int mmax = s[n];
18                 int l = 1, r = n;
19                 while(l < r)
20                 {
21                      mmax = max(mmax,s[l] + s[r]);
22                      l++; r--;
23                 }
24                 printf("%d
", mmax);
25             }
26             else
27             {
28                 int last = cnt*2;
29                 int mmax = s[n];
30                 int l = 1, r = last;
31                 while(l < r)
32                 {
33                     mmax = max(mmax, s[l] + s[r]);
34                     l++; r --;
35                 }
36                 printf("%d
", mmax);
37             }
38         }
39     }
40     return 0;
41 }
View Code

C. Alternative Thinking

题目链接:http://www.codeforces.com/contest/604/problem/C

题意:给出一个01序列,选择一个区间,把这个区间的0都变成1,1都变成0,使非连续01交替序列最长。

思路: 找规律。先统计下原来串中非连续01交替序列的长度。

    如果整个串只有1个连续两个相同字符出现 即类似:1001,那么结果只能比原来+1。

    否则可以比原来+2。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 char s[100010];
 4 int n;
 5 int main() 
 6 {
 7   //  freopen("in.txt", "r", stdin);
 8    // freopen("out.txt", "w", stdout);
 9     while(~scanf("%d", &n))
10     {
11         scanf("%s", s);
12         
13         char mark = s[0];
14         int cnt = 1; 
15         int length = 1;
16         int temp = 1;
17         int cnt2 = 0;
18         for(int i = 1; i < n; i++)
19         {
20             if(s[i] == mark) temp++; 
21             else if(s[i] != mark)
22             {
23                 mark = s[i]; cnt++;
24                 length = max(length, temp);
25                 if(temp >= 2) cnt2++;
26                 temp = 1; 
27             }
28         }
29         if(temp >= 2) cnt2++;
30         length = max(length, temp);
31         
32         if(length >= 3) cnt += 2;
33         else if(length == 2 && cnt2 >= 2) cnt += 2;
34         else if(length == 2 && cnt2 < 2) cnt += 1;
35         printf("%d
", cnt);
36     }
37     return 0;
38 }
View Code

E. Lieges of Legendre

题目链接:http://www.codeforces.com/contest/604/problem/E

题意:Kevin and Nicky要玩一个游戏。有N堆奶牛。

现在有2种操作:

1.从一堆奶牛(数量>=1)中拿走一头

2.把一堆2*x数量的奶牛边成k堆奶牛,每堆数量为x。

两个人轮流操作,只能从1或2中选一种方法,取走最后一头奶牛的人胜利。

思路:

SG函数。

因为游戏的每一步可以抽象成先挑选一个子游戏,选择一堆,然后对这堆操作,所以整个游戏可以看作每堆的和。

在k是偶数的情况下:

那么选择操作2,显然异或偶数次还是0。

g(0) = 0

状态1的后继态只有0,所以g(1) = 1。

状态2可以选择操作1或操作2 g(2) = 2。

状态3可以选择操作1变成状态2,所以g(1) = 0。

状态4可以选择操作1或操作2 g(4) = 1。

.....

所以n >= 2时,如果是奇数,只能选择操作1 g(n) = 0;如果是偶数,可以选择操作1和2 g(n) = 1。

在k是奇数的情况下:

g(0) = 0,状态1的后继态只有0,g(1) = 1。同理g(2) = 0 g(3) = 1 g(4) = 2....

在n >= 4的情况下,如果n是奇数,只能选择操作1 g(n) = 0

如果是偶数,递归求解。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n, k;
 4 int odd(int n) 
 5 {
 6     if(n == 1) return 1;
 7     if(n == 2) return 0;
 8     if(n == 3) return 1;
 9     if(n == 4) return 2;
10     if(n%2) return 0;
11     else return odd(n/2) == 1 ? 2:1; 
12 }
13 int even(int n)
14 {
15     if(n == 1) return 1;
16     if(n == 2) return 2;
17     if(n%2) return  0;
18     else return 1;
19 }
20 int main() 
21 {
22   //  freopen("in.txt", "r", stdin);
23   //  freopen("out.txt", "w", stdout);
24     while(~scanf("%d%d", &n, &k))
25     {
26         int ans = 0;
27         for(int i = 1; i <= n; i++)
28         {
29             int a; scanf("%d", &a);
30             ans ^= (k%2==0)?even(a):odd(a); 
31         }
32         if(ans) printf("Kevin
");
33         else printf("Nicky
");
34     }
35     return 0;
36 }
View Code
原文地址:https://www.cnblogs.com/titicia/p/5034058.html