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 }
看了看E,好神仙啊,完全不知道如何操作......
给你个字母矩阵,问有多少个子矩阵满足:可以只交换行内元素,使得这个子矩阵的每行每列都回文。n,m<=250