zoukankan      html  css  js  c++  java
  • CCPC 2017-2018, Finals Solution

    A - Dogs and Cages

    水。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 int t;
     5 double n;
     6 
     7 int main()
     8 {
     9     scanf("%d", &t);
    10     for (int kase = 1; kase <= t; ++kase)
    11     {
    12         scanf("%lf", &n);
    13         printf("Case #%d: %.10f
    ", kase, n - 1);
    14     }
    15     return 0;
    16 }
    View Code

    B - Same Digit

    留坑。

    C - Rich Game

    题意:有两个人,A可以控制输赢,但是没有钱,B有无限的钱,他们打羽毛球,至少要获得11个点并且要比对方至少多获得两个点才能赢下当局,如果A 赢了 一个点,A要给B Y元,否则 B 给A   X 元   求他们一共打K局的情况下,A最多可以赢多少局

    思路:显然,当x > y 的时候 可以赢k局

    考虑 x <= y  的情况  根据贪心的思路,假设A 要输 t 局

    那么 必然要满足 $11yt >= (k - t)(11y - 9x)$

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 int t, x, y, k;
     5 
     6 int main()
     7 {
     8     scanf("%d", &t);
     9     for (int kase = 1; kase <= t; ++kase)
    10     {
    11         printf("Case #%d: ", kase);
    12         scanf("%d%d%d", &x, &y, &k);
    13         if (x > y) printf("%d
    ", k);
    14         else
    15         {
    16             int t = (int)ceil(k * (11 * y - 9 * x) * 1.0 / (11 * y + 2 * x));
    17             printf("%d
    ", k - t);
    18         }
    19     }
    20     return 0;
    21 }
    View Code

    D - Mr. Panda and Circles

    留坑。

    E - Evil Forest

    水。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define N 1010
     5 
     6 int t, n, sum, num;
     7 
     8 int main()
     9 {
    10     scanf("%d", &t);
    11     for (int kase = 1; kase <= t; ++kase)
    12     {
    13         scanf("%d", &n); sum = 0;
    14         for (int i = 1; i <= n; ++i)
    15         {
    16             scanf("%d", &num);
    17             sum += num;
    18             sum += (num % 10) ? (num / 10) + 1 : (num / 10);
    19         }
    20         printf("Case #%d: %d
    ", kase, sum);
    21     }
    22     return 0;
    23 }
    View Code

    F - Fair Lottery

    留坑。

    G - Alice’s Stamps

    题意:给出M个区间,选择K个区间,使得选择的元素尽量多,区间可以交叉

    思路:$dp[i][j]$ 表示 第i位,选择k个区间的时候,数量最多是多少

    三个状态转移

    $dp[i + 1][j] = max(dp[i][j], dp[i + 1][j])$

    $dp[i][j +1] = max(dp[i][j], dp[i][j + 1])$

    $dp[i + cnt][j + 1] = max(dp[i + cnt][j], dp[i][j] + cnt)$

    cnt 为 那个区间最长能到哪里

     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 #define N 2010
     6 
     7 int dp[N][N];
     8 
     9 struct node{
    10     int l, r;
    11     inline node(){}
    12     inline node(int l, int r) :l(l), r(r){}
    13     inline bool operator < (const node &b) const
    14     {
    15         return l == b.l ? r > b.r : l < b.l;
    16     }
    17 }arr[N];
    18 
    19 int n, m, k;
    20 int cnt, val;
    21 
    22 int main()
    23 {
    24     int t;
    25     scanf("%d",&t);
    26     for(int cas = 1; cas <= t; ++cas)
    27     {
    28         scanf("%d %d %d" , &n, &m, &k);
    29         for(int i = 1; i <= m; ++i)
    30         {
    31             scanf("%d %d", &arr[i].l, &arr[i].r);
    32         }
    33         sort(arr + 1, arr + 1 + m);
    34         memset(dp, 0, sizeof dp);
    35         val = 0;
    36         cnt = 1;
    37         for(int i = 0; i < n; ++i)
    38         {
    39             while(cnt <= m && arr[cnt].l == i + 1)
    40             {
    41                 val = max(val, arr[cnt].r - arr[cnt].l + 1);
    42                 cnt++;
    43             }
    44             for(int j = 0; j <= k; ++j)
    45             {
    46                 dp[i + 1][j] = max(dp[i + 1][j], dp[i][j]);
    47                 dp[i][j + 1] = max(dp[i][j], dp[i][j + 1]);
    48                 dp[i + val][j + 1] = max(dp[i + val][j + 1], dp[i][j] + val);
    49             }
    50             if(val) --val;
    51         }
    52         printf("Case #%d: %d
    ", cas, dp[n][k]);
    53     }
    54     return 0;
    55 }
    View Code

    H - Equidistance

    留坑。

    I - Inkopolis

    留坑。

    J - Subway Chasing

    留坑。

    K - Knightmare

    题意:在无限大的棋盘上,马走日,有多少个点是能够走到的

    思路:BFS找规律,二阶差分

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 
     4 #define ull unsigned long long
     5 
     6 int arr[] = {1, 9, 41, 109, 205, 325, 473};
     7 
     8 int t;
     9 ull n;
    10 
    11 int main()
    12 {
    13     scanf("%d", &t);
    14     for (int kase = 1; kase <= t; ++kase)
    15     {
    16         printf("Case #%d: ", kase);
    17         scanf("%llu", &n);
    18         if (n <= 6) printf("%d
    ", arr[n]);
    19         else
    20         {
    21             ull sum = 473; n -= 6;
    22             sum += (ull)148 * n + (ull)14 * n * (n + 1);
    23             printf("%llu
    ", sum);
    24         }
    25     }
    26     return 0;
    27 }
    View Code
  • 相关阅读:
    CSP201412-2:Z字形扫描
    CSP201409-2:画图
    CSP201403-2:窗口
    CSP201312-2:ISBN号码
    CSP201709-1:打酱油
    CSP201703-1:分蛋糕
    CSP201612-1:中间数
    LOAM笔记及A-LOAM源码阅读
    特征值、特征向量与PCA算法
    欧几里得与区域生长算法
  • 原文地址:https://www.cnblogs.com/Dup4/p/9635731.html
Copyright © 2011-2022 走看看