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 }
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 }
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 }
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 }