CCPC—2021网络选拔赛
做题5min,交题2h。是从未有过的体验!~鉴于网站全程都是炸的.....故应该全程都有1W同学在线热血奋战。我愿称之为 真 · 网络选拔赛!
1001-A Cut The Wire
题目描述:
在[1,∞]的坐标轴上,问有几组跨越 n 的,满足以下条件的数对:
1. a > n AND a / 2 <= n
2. a * 3 + 1 > n AND a <= n
悲惨遭遇:
一开始算法O(n)级,从 ( n - 1 ) / 3 ~ n * 3 + 1 范围内枚举,看不到提交反馈,也不知道交没交上,鉴于发现没交上,代码给队友,大家一起交,交了好几次,于是TEL好几次。看到TEL之后开始着手优化,打了下表,规律明显,12个数一周天诶!成功签到。
#include<cstdio> using namespace std; long long int f[12] = {0, 2, 2, 4, 3, 5, 5, 7, 7, 9, 8, 10}; int main() { long long int t, n, ans; scanf("%lld", &t); while(t--) { scanf("%lld", &n); printf("%lld\n", n / 12 * 10 + f[n % 12]); } return 0; }
1006-F Power Sum
题目描述:
要求在有限区间[ 1 ,n + 2 ]内用连续平方数(1 , 4 , 9 , 16 , 25 ...)+ OR - 操作表示出给定整数 n ,并打印操作序列。
悲惨遭遇:
平方差公式,任意四个连续平方数:
a2 - (a - 1)2 - (a - 2)2 + (a - 3)2 = 4 恒成立
前四个数也可以通过构造表示出1 , 2 , 3 , 4:
1 | 4 | 9 | 16 |
1 | 3 | 4 |
2 |
5 | 6 | 4 | |
12 | 10 | ||
... | ... |
于是我们 %4 构造即可,后面补 1001,易知 4 个数可以表示 4,n + 2个数就一定够表示 n.
#include <iostream> uisng namespace std; int main() { int n, k, i, num, mod, T; scanf("%d", &T); while(T--) { scanf("%d", &n); mod = n % 4; num = (n - 1) / 4; k = (num * 4); if(mod == 1) { k += 1; printf("%d\n", k); printf("1"); } if(mod == 2) { k += 4; printf("%d\n", k); printf("0001"); } if(mod == 3) { k += 2; printf("%d\n", k); printf("01"); } if(mod == 0) { k += 4; printf("%d\n", k); printf("1001"); } for(i = 0; i < num; i ++) printf("1001"); printf("\n"); } return 0; }
1009 G应该是计数型动态规划吧,整理了这么久还是没写出来,Fw就是我了。
好了,现在就会这两题...dalao快来传送门!