首页 > 其他分享 >Codeforces Round 972 (Div. 2)

Codeforces Round 972 (Div. 2)

时间:2024-10-04 09:49:33浏览次数:8  
标签:const cur int scanf Codeforces return Div 字母 972

一万一参赛,VP赛时136

A. Simple Palindrome

简单构造题。字母集是 5 ,相同字母间一定构成若干回文子串。

将相同字母排列在一起,则只有相同字母可以构成回文子串。

显然,优先添加较少的字母即可。

#include<bits/stdc++.h>
using namespace std;
int T, n;
char s[5] = {'a', 'e', 'i', 'o', 'u'};

int main() {
	scanf("%d", &T);
	while(T --) {
		scanf("%d", &n);
		int flag = 0;
		int t = n / 5;
		int res = n % 5;
		for(int i = 0; i < 5; i ++) {
			if(i < res) flag = 1;
			else flag = 0;
			for(int j = 1; j <= t + flag; j ++)
				putchar(s[i]);
		}
		putchar('\n');
	}
	return 0;
}

B2. The Strict Teacher (Hard Version)

Easy Version 直接原代码提交即可。

简单模拟题。将猫和老鼠一起按位置排个序。

对于相邻猫之间的所有老鼠,他们的生存时间是相同的,都为相邻猫距离的一半(注意细节)。

注意讨论第一只猫前面的老鼠和最后一只猫后面的老鼠即可。

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int T, n, m, q, ans[N];

struct Node {
	int pos, id;
	bool operator < (const Node &t) const {
		return pos < t.pos;
	}
}a[N * 2];

int main() {
	scanf("%d", &T);
	while(T --) {
		scanf("%d%d%d", &n, &m, &q);
		for(int i = 1; i <= m; i ++)
			scanf("%d", &a[i].pos), a[i].id = 0;
		for(int i = 1; i <= q; i ++)
			scanf("%d", &a[i + m].pos), a[i + m].id = i;
		sort(a + 1, a + m + q + 1);
		vector<int> p;
		int ls = 0;
		for(int i = 1; i <= m + q; i ++) {
			if(!a[i].id) {
				for(int t = 0; t < p.size(); t ++) {
					int j = p[t];
					if(!ls) ans[a[j].id] = a[i].pos - 1;
					else ans[a[j].id] = (a[i].pos - ls) / 2;
				}
				ls = a[i].pos;
				p.clear();
			}
			else p.push_back(i);
		}
		for(int i = 0; i < p.size(); i ++) {
			int j = p[i];
			ans[a[j].id] = n - ls;
		}
		for(int i = 1; i <= q; i ++)
			printf("%d\n", ans[i]);
	}
	return 0;
}

C - Lazy Narek

各字串按顺序拼接,可取可不取,求最大可能权值。用 dp 维护即可。

具体的,f[i][j],表示考虑了前 i 个子串,当前结尾字母为第 j 个字母的最大权值。

答案为 max(f[n][j] - j) 。

#include<bits/stdc++.h>
using namespace std;
const int N = 1010;
int T, n, m, f[N][5];
char s[N], S[5] = {'n', 'a', 'r', 'e', 'k'};

int main() {
	scanf("%d", &T);
	while(T --) {
		scanf("%d%d", &n, &m);
		f[0][0] = 0;
		for(int j = 1; j < 5; j ++)
			f[0][j] = -1e9;
		for(int i = 1; i <= n; i ++) {
			scanf("%s", s);
			for(int j = 0; j < 5; j ++)
				f[i][j] = f[i - 1][j];
			for(int j = 0; j < 5; j ++) {
				int t = j, res = 0;
				for(int k = 0; k < m; k ++) {
					if(s[k] == S[t]) {
						t = (t + 1) % 5;
						if(!t) res += 5;
					}
					else {
						for(int p = 0; p < 5; p ++)
							if(s[k] == S[p]) res --;
					}
				}
				f[i][t] = max(f[i][t], f[i - 1][j] + res);
			}
		}
		int ans = 0;
		for(int i = 0; i < 5; i ++)
			ans = max(ans, f[n][i] - i);
		printf("%d\n", ans);
	}
	return 0;
}

E1. Subtangle Game (Easy Version)

数据范围 n,m,l 均为 300 ,全局状态数仅为 n3 ,记搜即可。

具体的,f[i][j][k] 表示当前选到序列第 i 个数,在表格的 (j,k) 位置,最后是谁赢。

最后答案显然是 f[1][0][0] 。

#include<bits/stdc++.h>
using namespace std;
const int N = 305;
int T, l, n, m, a[N], s[N][N];
int f[N][N][N];

bool dfs(int cur, int r, int c) {
	if(cur == l + 1) { f[cur][r][c] = !(cur & 1); return !(cur & 1); }
	if(r == n || c == m) { f[cur][r][c] = !(cur & 1); return !(cur & 1);  }
	if(f[cur][r][c] != -1) return f[cur][r][c];
	for(int i = r + 1; i <= n; i ++)
		for(int j = c + 1; j <= m; j ++) {
			if(s[i][j] == a[cur]) {
				bool flag = dfs(cur + 1, i, j);
				if(flag == (cur & 1)) {
					f[cur][r][c] = (cur & 1);
					return (cur & 1);
				}
			}
		}
	f[cur][r][c] = !(cur & 1);
	return !(cur & 1);
}

int main() {
	scanf("%d", &T);
	while(T --) {
		scanf("%d%d%d", &l, &n, &m);
		for(int i = 1; i <= l; i ++)
			scanf("%d", &a[i]);
		for(int i = 1; i <= n; i ++)
			for(int j = 1; j <= m; j ++)
				scanf("%d", &s[i][j]);
		for(int i = 0; i <= l; i ++)
			for(int j = 0; j <= n; j ++)
				for(int k = 0; k <= m; k ++)
					f[i][j][k] = -1;
		bool ans = dfs(1, 0, 0);
		puts(ans ? "T" : "N");
	}
	return 0;
}

标签:const,cur,int,scanf,Codeforces,return,Div,字母,972
From: https://www.cnblogs.com/lingo12321/p/18446336

相关文章

  • Educational Codeforces Round 95 (Rated for Div. 2) G. Three Occurrences
    首先我们随机两个数组\(valA_x,valB_x\)。对于数组\(a\),记\(cnt\)表示\(a_i\)在前缀中出现的次数。若\(cnt\equiv0\mod3\),则\(b_i=valA_x\)若\(cnt\equiv1\mod3\),则\(b_i=valB_x\)若\(cnt\equiv2\mod3\),则\(b_i=valA_x\oplusvalB_x\)记\(pre_i\)表示\(b\)的前......
  • Codeforces Round 976 (Div. 2)
    C.BitwiseBalancing(C)先求出\(b-c\)的值,再考虑\(a\)的每个二进制位取0或1对答案的影响。vp的时候不知道为什么错了很多次。voidsolve(){llb,c,d;scanf("%lld%lld%lld",&b,&c,&d);if(b-c>d){printf("-1\n");retur......
  • Codeforces Round 976 (Div. 2)
    一万五参赛,VP赛时629(唐了,E没想出来)A.FindMinimumOperations简单题。注意特判,用除法统计答案即可。#include<bits/stdc++.h>usingnamespacestd;intT,n,k;intmain(){ scanf("%d",&T); while(T--){ scanf("%d%d",&n,&k); if(k==1||n......
  • Codeforces Round 976 (Div. 2) 题解
    CodeforcesRound976(Div.2)题解2020B一个常见的想法:开关灯=异或,虽然在这道题里没啥用注意到,第i盏灯的按钮被按的次数就是i的除它本身以外的因子个数而完全平方数的因子数为奇数,其他数的因子数为偶数点击查看更多信息#include<bits/stdc++.h>usingnamespacestd;voi......
  • CodeForces - 118D - dp
    这道题的思路可能来源于步兵后面必须跟骑兵,反之亦然,那么一个兵种当前的状态肯定是由另一个兵种上一个的状态推来的(即取用该当前取用的兵种之前)。接下来就要考虑怎么控制每次取用多少个人了,由题意可知,每次取用不得超过k1或k2,我们从1-n1和从1-n2表示骑兵和步兵当前的数量表示......
  • Codeforces Round 975 (Div. 2)
    一万四参赛,VP赛时60A.MaxPlusSize一定选择最大值,若有多个最大值,优先选在奇数位置的最大值,后间隔涂上红色。#include<bits/stdc++.h>usingnamespacestd;constintN=105;intT,n,a[N];intmain(){ scanf("%d",&T); while(T--){ scanf("%d",&n); intm......
  • 【LGR-197-Div.2】洛谷 10 月月赛 I &「SFMOI」Round I(A,B,C)
    A.StrangeCakeGame对于小W,往下走最赚,对于小M往右走最赚,于是路线形成了个折线,直接对应竖坐标位置去看看横坐标符不符合要求即可#include<iostream>#include<algorithm>#include<string>#include<string.h>#include<queue>#include<deque>#include<math.h>#include<m......
  • Codeforces Global Round 19 E. Best Pair
    \(cnt\)的取值种类数不超过\(\sqrtn\)。因此我们可以枚举\(cnt\)然后贪心选最大的值。#include<bits/stdc++.h>usingnamespacestd;usingi32=int32_t;usingi64=longlong;#defineinti64usingvi=vector<int>;usingpii=pair<int,int>;voidsolve()......
  • CF2020(Codeforces Round 976 (Div. 2))
    CF2020A.FindMinimumOperations难度:红转换进制,每一位上数字相加。#include<bits/stdc++.h>#definelllonglongusingnamespacestd;llt,n,k,ans;intmain(){ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);cin>>t;while(t--){cin&......
  • [LeetCode] 1497. Check If Array Pairs Are Divisible by k
    Givenanarrayofintegersarrofevenlengthnandanintegerk.Wewanttodividethearrayintoexactlyn/2pairssuchthatthesumofeachpairisdivisiblebyk.ReturntrueIfyoucanfindawaytodothatorfalseotherwise.Example1:Input:arr......