所谓的日常 #8 - 王司徒巧使連環計 董太師大鬧鳳儀亭
div.2
题意就是安排K个人的座位并且输出咯。
嘛,这是我以前的代码...好像比大家都长哈哈哈...
1 #include <bits/stdc++.h> 2 3 int n; 4 int A[4][50]; 5 6 void paint() { 7 for (int i = 0; n; ++ i) { 8 if (i == 0) { 9 int c = std::min(4,n); 10 for (int j = 0; j < c; ++ j) { 11 A[j][i] = 1; 12 } 13 n -= c; 14 } else { 15 int c = std::min(3,n); 16 for (int j = 0; j < c; ++ j) { 17 A[j][i] = 1; 18 } 19 std::swap(A[3][i],A[2][i]); 20 n -= c; 21 } 22 } 23 putchar('+'); 24 for (int i = 0; i < 12; ++ i) { 25 printf("--"); 26 } 27 putchar('+'); 28 puts(""); 29 for (int i = 0; i < 4; ++ i) { 30 putchar('|'); 31 for (int j = 0; j < 11; ++ j) { 32 if (i==2) { 33 if (A[i][j]) putchar('O'); 34 else if (j==0) putchar('#'); 35 else putchar('.'); 36 } else { 37 if (A[i][j]) putchar('O'); 38 else putchar('#'); 39 } 40 putchar('.'); 41 } 42 if (i==2) putchar('.'); 43 else putchar('|'); 44 if (i==0) putchar('D'); 45 else putchar('.'); 46 if (i==0 || i==3) puts("|)"); 47 else puts("|"); 48 } 49 putchar('+'); 50 for (int i = 0; i < 12; ++ i) { 51 printf("--"); 52 } 53 putchar('+'); 54 puts(""); 55 } 56 57 int main() { 58 scanf("%d",&n); 59 paint(); 60 return 0; 61 }
div.1
CodeForces 466C Number of Ways
把长度为n(<=5e5)的数组分成三段非空段且和相等 的方案数。
所以枚举第二段末尾位置,拿一个cnt记录之前有多少满足条件的第一段末尾 就好啦。
1 #include <bits/stdc++.h> 2 typedef long long LL; 3 4 const int N = 500000 + 5; 5 int A[N],n; 6 7 LL work() { 8 LL sum = std::accumulate(A,A + n,0ll); 9 if (sum % 3 != 0) return 0; 10 11 LL now = 0,ret = 0,cnt = 0; 12 for (int i = 0; i < n - 1; ++ i) { 13 now += A[i]; 14 if (now == sum / 3 * 2) { 15 ret += cnt; 16 } 17 if (now == sum / 3) { 18 cnt ++; 19 } 20 } 21 return ret; 22 } 23 24 int main() { 25 scanf("%d",&n); 26 for (int i = 0; i < n; ++ i) { 27 scanf("%d",A + i); 28 } 29 printf("%I64d\n",work()); 30 }