CF1080

emmmm......ouuan大佬上紫了,我却没打......

首先吐槽一波家长会和机房锁门,害我只能来打虚拟赛。


写了abcd四题,还是被ouuan大佬吊打.......

264名,应该能上分吧。

A,你要做n张贺卡,每张贺卡需要2红,5黄,8蓝。

你买一张卡纸就能获得k个某种颜色。问最少买几张卡纸。

解:红色就是(2*n-1)/k+1,别的以此类推。

B,给你个数列,ai=i*(-1)^i,求L到R的和。

解:我们先两两求和,最后可能有多出来的,处理一下。

C,给你个n*m的矩阵,黑白染色。先把一块染成白色,又把一块染成黑色。求最终的黑色个数。

解:先分开处理,然后把交叉的地方的黑色加上。

D,题意比较复杂......

可以想到一种贪心就是先尽量切边缘的一条小道,直到剩余刀数不够。

然后判断别的地方空出来的能不能放下所有剩余刀数。

转化一下就是把别的地方都切了,看刀数是不是小于k。

再转化,能容纳的总刀数 - 切出来小道后小道内不能切的刀数 < k 即为不合法。

发现当n较大时,如果这个图能够容纳k刀,一定存在方案。

n比较小的时候就用公式计算。

 1 #include <bits/stdc++.h>
 2 
 3 typedef long long LL;
 4 const int N = 100010;
 5 
 6 LL n, k;
 7 
 8 inline bool check(LL n, LL k) {
 9     if(!n) {
10         return k == 0;
11     }
12     k = 3 * k + 1;
13     LL a = 1;
14     for(int i = 1; i <= n; i++) {
15         a *= 4;
16         if(a >= k) {
17             return 1;
18         }
19     }
20     return 0;
21 }
22 
23 inline LL qpow(LL a, LL b) {
24     LL ans = 1;
25     while(b) {
26         if(b & 1) {
27             ans *= a;
28         }
29         a *= a;
30         b = b >> 1;
31     }
32     return ans;
33 }
34 
35 inline void solve() {
36 
37     scanf("%lld%lld", &n, &k);
38 
39     if(!check(n, k)) {
40         printf("NO\n");
41         return;
42     }
43 
44     LL t = 0;
45     while((1ll << (t + 2)) - (t + 3) <= k && t < n) {
46         t++;
47     }
48     //k -= (1ll << (t + 2)) - (t + 3));
49     LL x = n - t;
50     if(n <= 7) {
51         LL temp = (qpow(4, n) - 1) - (qpow(2, t + 1) - 1) * (qpow(4, x) - 1);
52         k *= 3;
53         if(k <= temp) {
54             printf("YES %d\n", x);
55         }
56         else {
57             printf("NO\n");
58         }
59         return;
60     }
61     printf("YES %d\n", x);
62     return;
63 }
64 
65 int main() {
66 
67     int T;
68     scanf("%d", &T);
69     while(T--) {
70         solve();
71     }
72 
73     return 0;
74 }
AC代码

看了看E,好神仙啊,完全不知道如何操作......

给你个字母矩阵,问有多少个子矩阵满足:可以只交换行内元素,使得这个子矩阵的每行每列都回文。n,m<=250

猜你喜欢

转载自www.cnblogs.com/huyufeifei/p/10017157.html