zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    LeetCode 382. Linked List Random Node
    LeetCode 398. Random Pick Index
    LeetCode 1002. Find Common Characters
    LeetCode 498. Diagonal Traverse
    LeetCode 825. Friends Of Appropriate Ages
    LeetCode 824. Goat Latin
    LeetCode 896. Monotonic Array
    LeetCode 987. Vertical Order Traversal of a Binary Tree
    LeetCode 689. Maximum Sum of 3 Non-Overlapping Subarrays
    LeetCode 636. Exclusive Time of Functions
  • 原文地址:https://www.cnblogs.com/titicia/p/5034058.html
Copyright © 2011-2022 走看看