【codeforces】 Codeforces Round #640 (Div. 4)
F. Binary String Reconstruction
A. Sum of Round Numbers
【模拟】拆一个数,把该数的按数位分离出来,使分离出来的数相加仍为原数。
B. Same Parity Summands
【构造】\(n\)能否分解成\(k\)个正整数奇数或者偶数的和。
五种情况:
- \(k > n\):NO;
- \(n\)为奇数,\(k\)为奇数:YES,只需要前\(k-1\)个数均为1,第\(k\)个数减去\(k-1\)即可;
- \(n\)为奇数,\(k\)为偶数:NO,偶数个奇数或偶数相加必为偶数;
- \(n\)为偶数,\(k\)为奇数:(偶数个奇数之和必为偶数),因此只能用偶数相加。如果\(2*k>num\),NO,否则前\(k-1\)个数取2,最后一个数减去\(2*(k-1)\)即可;
- \(n\)为偶数,\(k\)为偶数:YES,只需要前\(k-1\)个数均为1,第\(k\)个数减去\(k-1\)即可;
从\(1\)与从\(2\)开始取起是为了方便构造。
C. K-th Not Divisible by n
【数学】这题我是找规律找出来的\(\dots\)
可以参考这位的题解 https://www.cnblogs.com/pjxpjx/p/12862956.html
大家都是O(1)\(\dots\)
D. Alice, Bob and Candies
【模拟】A从左边开始取,B从右边开始取,当前取的要比上一位取的要取到刚好多就停下来,取过的糖果不能再取(终止条件)。
E. Special Elements
【遍历】\(8000^2\)差不多有6e7,竟然过了...
找数组里[l,r]区间的和在数组里有多少个。装桶后遍历。
F. Binary String Reconstruction
【构造】写得有点复杂...
当00与11都有的时候,肯定有01:
- 如果00、01、11都有,则先写00,再写11(此时会形成一组01),最后再写01;
- 如果没有01,则只会仅有00或者11。
G. Special Permutation
【构造】构造出一个数组,相邻的数相差在[2,4]这个范围。
\(n<=4\):
- \(n<=3\),-1;
- $ n = 4$,{3 1 4 2} 样例现有的;
\(n>4\):
- \(n\)为奇数,先从小到大输出所有奇数,然后再输出第二大的偶数与第一大的偶数,最后按照从第三大的偶数从大到小输出。
- \(n\)为偶数,先从小到大输出所有偶数,然后再输出第二大的奇数与第一大的奇数,最后按照从第三大的奇数从大到小输出。
AC代码
A
#include<iostream>
#include<cstdio>
using namespace std;
int t;
int n;
int num[1003];
int main()
{
scanf("%d", &t);
while(t--){
scanf("%d", &n);
int ans = 0;
if(n / 1000 >= 1){
num[ans++] = n - n % 1000;
}
n %= 1000;
if(n / 100 >= 1){
num[ans++] = n - n % 100;
}
n %= 100;
if(n / 10 >= 1){
num[ans++] = n - n % 10;
}
n %= 10;
if(n >= 1){
num[ans++] = n;
}
printf("%d\n", ans);
for(int i = 0; i < ans; i++){
if(i != 0) printf(" ");
printf("%d", num[i]);
}
printf("\n");
}
return 0;
}
B
//
#include<iostream>
#include<cstdio>
using namespace std;
int T;
int num, k;
int main()
{
scanf("%d", &T);
while(T--){
scanf("%d %d", &num, &k);
if(num < k) printf("NO\n");
else if(num % 2 == 1){
if(k % 2 == 1){
printf("YES\n");
for(int i = 1; i <= k - 1; i++){
printf("1 ");
}
printf("%d\n", num - (k - 1));
}
else printf("NO\n");
}
else if(num % 2 == 0){
if(k % 2 == 1){
if(2 * k > num) printf("NO\n");
else {
printf("YES\n");
for(int i = 1; i <= k - 1; i++){
printf("2 ");
}
printf("%d\n", num - 2 * (k - 1));
}
}
else {
printf("YES\n");
for(int i = 1; i <= k - 1; i++){
printf("1 ");
}
printf("%d\n", num - (k - 1));
}
}
}
return 0;
}
C
//
#include<iostream>
#include<cstdio>
using namespace std;
typedef long long LL;
int T;
LL n, k;
int main()
{
scanf("%d", &T);
while(T--){
scanf("%I64d %I64d", &n, &k);
LL ans = k;
LL div = k / n;
while(true){
ans += div;
if(ans / n == div){
printf("%I64d\n", ans);
break;
}
else {
div = ans / n;
ans = k;
}
}
}
for(int i = 1; i <= 113; i++){
printf("%d\t", i);
if(i % 7 == 0) printf("\n");
}
return 0;
}
D
//
#include<iostream>
#include<cstdio>
using namespace std;
int T, n;
int num[1003];
int main()
{
scanf("%d", &T);
while(T--){
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%d", &num[i]);
}
bool flag = true; // 1:Alice 0:Bob
int pa = 0, pb = 0, sa = 1, sb = n;
int ta = 0, tb = 0;
int ans = 0;
while(true){
if(sb < sa) break;
ans++;
if(flag){
pa = 0;
while(pa <= pb && sb >= sa){
pa += num[sa++];
}
// printf("ans:%d pa:%d pb:%d sa:%d sb:%d\n", ans, pa, pb, sa, sb);
ta += pa;
if(pa > pb){
flag = false;
}
else break;
}
else {
pb = 0;
while(pb <= pa && sb >= sa){
pb += num[sb--];
}
// printf("ans:%d pb:%d pa:%d sb:%d sa:%d\n", ans, pb, pa, sb, sa);
tb += pb;
if(pb > pa){
flag = true;
}
else break;
}
}
printf("%d %d %d\n", ans, ta, tb);
}
return 0;
}
E
//
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int T, n;
int num[8003];
int take[8003];
int main()
{
scanf("%d", &T);
while(T--){
scanf("%d", &n);
memset(take, 0, sizeof(take));
for(int i = 0; i < n; i++){
scanf("%d", &num[i]);
take[num[i]]++;
}
int ans = 0;
for(int i = 0; i < n - 1; i++){
int tmp = num[i];
for(int j = i + 1; j < n; j++){
tmp += num[j];
// printf("->i:%d j:%d ans:%d tmp:%d\n", i, j, ans, tmp);
if(tmp > 8000) break;
if(take[tmp] > 0) {
// printf("i:%d j:%d ans:%d tmp:%d\n", i, j, ans, tmp);
ans += take[tmp];
take[tmp] = 0;
}
}
}
printf("%d\n", ans);
}
return 0;
}
F
//
#include<iostream>
#include<cstdio>
using namespace std;
int T;
int oo, ol, ll;
int main()
{
scanf("%d", &T);
while(T--){
scanf("%d %d %d", &oo, &ol, &ll);
if(ol != 0 && oo == 0 && ll == 0){
printf("1");
for(int i = 1; i <= ol; i++){
if(i % 2 == 1) printf("0");
else printf("1");
}
printf("\n");
}
else if(oo != 0 && ol == 0 && ll == 0){
printf("0");
for(int i = 1; i <= oo; i++) printf("0");
printf("\n");
}
else if(ll != 0 && oo == 0 && ol == 0){
printf("1");
for(int i = 1; i <= ll; i++) printf("1");
printf("\n");
}
else {
if(oo > 0 && ll > 0){
printf("0");
for(int i = 1; i <= oo; i++) printf("0");
printf("1");
for(int i = 1; i <= ll; i++) printf("1");
ol--;
for(int i = 1; i <= ol; i++){
if(i % 2 == 1) printf("0");
else printf("1");
}
printf("\n");
}
else if(oo > 0){
printf("0");
for(int i = 1; i <= oo; i++) printf("0");
for(int i = 1; i <= ol; i++){
if(i % 2 == 1) printf("1");
else printf("0");
}
printf("\n");
}
else if(ll > 0){
printf("1");
for(int i = 1; i <= ll; i++) printf("1");
for(int i = 1; i <= ol; i++){
if(i % 2 == 1) printf("0");
else printf("1");
}
printf("\n");
}
}
}
return 0;
}
G
//
#include<iostream>
#include<cstdio>
using namespace std;
int T, n;
int o[502], t[502];
int main()
{
scanf("%d", &T);
while(T--){
scanf("%d", &n);
int co = 0, ct = 0;
if(n <= 3) printf("-1\n");
else if(n == 4) printf("3 1 4 2\n");
else {
for(int i = 1; i <= n; i++){
if(i % 2) o[co++] = i;
else t[ct++] = i;
}
if(n % 2 == 1){
for(int i = 0; i < co; i++){
printf("%d ", o[i]);
}
printf("%d %d ", t[ct - 2], t[ct - 1]);
for(int i = ct - 3; i >= 0; i--){
if(i != ct - 3) printf(" ");
printf("%d", t[i]);
}
printf("\n");
}
else {
for(int i = 0; i < ct; i++){
printf("%d ", t[i]);
}
printf("%d %d ", o[co - 2], o[co - 1]);
for(int i = co - 3; i >= 0; i--){
if(i != co - 3) printf(" ");
printf("%d", o[i]);
}
printf("\n");
}
}
}
return 0;
}