CCPC 2017-2018, Finals Solution

A - Dogs and Cagesnode

水。c++

 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\n", kase, n - 1);
14     }
15     return 0;
16 }
View Code

 

B - Same Digitgit

留坑。ide

 

C - Rich Gameui

題意:有兩我的,A能夠控制輸贏,可是沒有錢,B有無限的錢,他們打羽毛球,至少要得到11個點而且要比對方至少多得到兩個點才能贏下當局,若是A 贏了 一個點,A要給B Y元,不然 B 給A   X 元   求他們一共打K局的狀況下,A最多能夠贏多少局spa

思路:顯然,當x > y 的時候 能夠贏k局rest

考慮 x <= y  的狀況  根據貪心的思路,假設A 要輸 t 局code

那麼 必然要知足 $11yt >= (k - t)(11y - 9x)$htm

 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\n", k);
14         else
15         {
16             int t = (int)ceil(k * (11 * y - 9 * x) * 1.0 / (11 * y + 2 * x));
17             printf("%d\n", k - t);
18         }
19     }
20     return 0;
21 }
View Code

 

D - Mr. Panda and Circlesblog

留坑。

 

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\n", 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\n", 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\n", arr[n]);
19         else
20         {
21             ull sum = 473; n -= 6;
22             sum += (ull)148 * n + (ull)14 * n * (n + 1);
23             printf("%llu\n", sum);
24         }
25     }
26     return 0;
27 }
View Code
相關文章
相關標籤/搜索