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\n", 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\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 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\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

 

转载于:https://www.cnblogs.com/Dup4/p/9635731.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值