首页 > 其他分享 >Educational Codeforces Round 161 (Rated for Div. 2)

Educational Codeforces Round 161 (Rated for Div. 2)

时间:2024-01-19 17:44:53浏览次数:33  
标签:s2 Educational Rated int auto s1 Codeforces cin ans

题目链接:Educational Codeforces Round 161 (Rated for Div. 2)

 

PS:A开的很快,B读个假题意,C又想歪了,导致E没时间写,最后十分钟开E思路对了但是没时间了,赛后很快过了。。。

A. Tricky Template

题意:定义模板串 t 与字符串 s :

1:如果模板串的某一项为小写字母,那么模板串与字符串的该项相同

2:如果模板串的某一项为大写字母,那么模板串和字符串的该项不同

如果同时满足以上两个条件,则字符串 s 和模板串 t 匹配成功,求是否存在模板串和给定的 a , b 串匹配,但是不和字符串 c 匹配

解题思路:读题读了一会,做法很简单,只要 c 的某一项满足既不和 a 的该项相同,又不和 b 的该项相同即可

查看代码

void solve(){
	int n;
	string s1, s2, s3;
	cin >> n >> s1 >> s2 >> s3;
	for(int i = 0; i < s1.size(); i ++){
		if(s3[i] != s2[i] && s3[i] != s1[i]){
			cout << "YES\n";
			return;
		}
	}
	cout << "NO\n";
}

 

B. Forming Triangles

题意:有 n 根木棒,每根木棒的长度为 2a[i],求能组成的最多的三角形的数量,三角形的三根木棒顺序不考虑,只考虑是不是同一根(刚开始没看见是2a[i]卡了好久)

解题思路:由于是2a[i]就很好想了,一共两种情况:

1:从同长度的木棒中任选三条,也就是 C(n, 3)

2:从同长度的木棒中任选两条,再从小于本长度的木棒中任选一条

查看代码
 void solve(){
	cin >> n;
	map<int, int> mp;
	for(int i = 1; i <= n; i ++){
		cin >> a[i];
		mp[a[i]] ++;
	}
	sort(a + 1, a + n + 1);
	int ans = 0;
	for(auto [x, y] : mp){
		if(y >= 2){
			int l = 0, r = n;
			while(l < r){
				int mid = l + r + 1 >> 1;
				if(a[mid] >= x) r = mid - 1;
				else l = mid;
			}
			ans += y * (y - 1) / 2 * l;
		}
		if(y >= 3){
			ans += y * (y - 1) * (y - 2) / 6;
		}
	}
	
	cout << ans << '\n';
}

 

C. Closest Cities

题意:一条数线上有 n 个城市,每个城市到离自己最近的城市仅消耗一枚金币,每次查询从 x 到 y 有两种选择:

1:前往任意其他城市 y,支付 |ax-ay| 枚金币

2:前往离 x 最近的城市,支付 1 枚金币

求 x 到 y 消耗的最少金币数量

解题思路:考虑用前缀和的方式求解,预处理每个城市到它后一个城市的最短距离和每一个城市到它前一个城市的最短距离,然后求前缀和

最直接的方式直达:res1 = abs(a[x] - a[y]);

1:当 x < y 也就是从 x 到它后面的城市,res2 = c[x] - c[y]

2:当 x > y 也就是从 x 到它签名档城市,res2 = b[x] - b[y]

然后答案就是 min(res1, res2)

查看代码
 int n, m, a[N], b[N], c[N];
 
void solve(){
	cin >> n;
	for(int i = 1; i <= n; i ++) cin >> a[i];
	for(int i = 2; i <= n; i ++){
		if(a[i] - a[i - 1] < a[i + 1] - a[i]) b[i] = 1;
		else b[i] = a[i] - a[i - 1];
	}
	for(int i = n - 1; i >= 1; i --){
		if(a[i + 1] - a[i] < a[i] - a[i - 1]) c[i] = 1;
		else c[i] = a[i + 1] - a[i];
	}
	c[1] = 1, b[n] = 1;
 
	for(int i = 1; i <= n; i ++) b[i] += b[i - 1];
	for(int i = n - 1; i >= 1; i --) c[i] += c[i + 1];
 
	cin >> m;
	while(m --){
		int x, y;
		cin >> x >> y;
		int res1 = abs(a[x] - a[y]), res2;
		if(x < y){
			res2 = c[x] - c[y];
		} 
		else res2 = b[x] - b[y];
		cout << min(res1, res2) << '\n';
	}
}

 

D. Berserk Monsters

题意:有 n 只怪物,每只怪物有两个参数:攻击力 a[i],防御力 d[i],进行 n 回合游戏,每个回合怪物会攻击与它相邻的怪兽,如果一只怪物在一个回合承受的伤害超过了它的防御值,那么它就会死亡,求每个回合死亡的怪物的数量

解题思路:算是模拟?链表模拟,用 set 存储,先找出第一回合会被杀死的怪物,然后把这只怪物删除,如果它的左边怪物或者右边怪物在下一回合会被杀死,那么就加入set

查看代码
 void solve(){
	int n;
	cin >> n;
	vector<int> a(n), d(n), l(n, -1), r(n, -1), ans(n);
	vector<bool> vis(n);
	for(auto &ai : a) cin >> ai;
	for(auto &di : d) cin >> di;
	for(int i = 0; i < n; i ++){
		if(i != 0) l[i] = i - 1;
		if(i != n - 1) r[i] = i + 1;
	}
	auto check = [&](int x){
		int sum = 0;
		if(l[x] != -1) sum += a[l[x]];
		if(r[x] != -1) sum += a[r[x]];
		return !vis[x] && sum > d[x];
	};//判断能不能删去这个点
	auto del = [&](int x){
		vis[x] = true;
		if(l[x] != -1) r[l[x]] = r[x];//左边节点的右节点变成当前节点的右节点 
		if(r[x] != -1) l[r[x]] = l[x];//有边界的的左节点变成当前节点的左节点 
	};//删点
	set<int> s1;
	for(int i = 0; i < n; i ++){
		if(check(i)) s1.insert(i);
	}
	for(int i = 0; i < n; i ++){
		ans[i] = s1.size();
		set<int> s2;
		for(auto v : s1) del(v);//删去每个该删去的点 
		for(auto v : s1){
			if(l[v] != -1 && check(l[v])) s2.insert(l[v]);//如果当前点存在左节点,并且左节点的下一轮会被删掉 
			if(r[v] != -1 && check(r[v])) s2.insert(r[v]);//同理 
		}
		s1 = s2;
	}
	for(auto i : ans) cout << i << ' ';
	cout << '\n';
}

 

E. Increasing Subsequences

题意:构造出一个长度不超过200的有 x 个严格上升子序列的数组,空序列和单个数字的序列也算严格上升子序列

解题思路:长度为 n 的严格递增序列有 2n个严格单调递增子序列,先构造出最接近 x 的严格递增序列,然后发现在这个序列后面按照倒序的加上对应的某一项的数字,可以增加2(i - 1)个单调递增子序列,直接构造即可

查看代码
 void solve(){
	int x;
	cin >> x;
	vector<int> v;
	int ans = 1, u = 1;
	while(ans * 2 <= x){
		v.push_back(u);
		u ++;
		ans *= 2;
	}
	ans = x - ans;
	vector<int> b;
	while(ans){
		b.push_back(ans % 2);
		ans /= 2;
	}
	reverse(b.begin(), b.end());
	int p = v.size() - (v.size() - b.size());
	for(int i = 0; i < b.size(); i ++){
		if(b[i] == 1) v.push_back(p);
		p --;
	}
	cout << v.size() << '\n';
	for(auto vi : v){
		cout << vi << ' ';
 	}
 	cout << '\n';
}

标签:s2,Educational,Rated,int,auto,s1,Codeforces,cin,ans
From: https://www.cnblogs.com/RosmontisL/p/17975080

相关文章

  • Educational Codeforces Round 161 (Rated for Div. 2)
    目录写在前面ABCDEF写在最后写在前面比赛地址:https://codeforces.com/contest/1922D没调出来亏炸了,第一次体验赛后五分钟过题的快感。痛苦的大二上终于结束了,本学期一半的痛苦都来自于傻逼大物实验。下学期课少了好多,而且早八和晚八都少的一批,集中上一波分了就。A题面太长......
  • Codeforces 920 (div3)
    Problem-A-Codeforces没什么问题,几个ifelse语句,判断一下条件;#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;intmain(){intk;cin>>k;while(k--){intx1,y1,x2,y2,x3,y3,x4,y4;......
  • Codeforces edu 161 (div2)
    Problem-A-Codeforces思维题,判断c字符串的每一位是否都能在相对应的a字符串或者b字符串里面找到;如果都能找到的话就输出NO;否则输出YES;#include<bits/stdc++.h>usingnamespacestd;intmain(){std::ios::sync_with_stdio(false);cin.tie(0);cout.tie......
  • Educational Codeforces Round 161 (Rated for Div. 2)
    EducationalCodeforcesRound161(RatedforDiv.2)比赛链接A.TrickyTemplate思路:貌似只要想到了就可以,我是记录了一下字符串c和字符串a和b之间的满足数,如果等于n表示一定不存在,否则就是存在的Code:#include<bits/stdc++.h>usingnamespacestd;#defineintlonglon......
  • CodeForces & AtCoder rating 规则简述
    译者:rui_er,转载请注明出处。(备份自2020年11月2日的同名博客)本博客为了方便自己查阅,同时也方便大家了解,但因为我英语很菜,所以难免有翻译错的地方,还请评论区纠正。未注明资料来源的均为常识积累。1CodeForcesrating规则1.1CodeForcesrating与名字颜色换算设\(r\)......
  • hey_left 8 Codeforces Round 871 (Div. 4)
    题目链接A.直接比较输入字符串和已知字符串有几个不同即可#include<bits/stdc++.h>usingnamespacestd;voidsolve(){strings;cin>>s;intans=0;stringt="codeforces";for(inti=0;i<10;i++){if(s[i]!=t[i])ans++;}cout<&......
  • hey_left 7 Codeforces Round 886 (Div. 4) 续
    题目链接F.记录下出现的数字和个数注意放置陷阱的位置1-n都有可能然后遍历1-n,对每个数进行因子分解,对于在因子的位置上有青蛙的,加上青蛙的个数,取最大即可#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=2e5+10;voidsolve(){int......
  • CodeForces 1466H Finding satisfactory solutions
    洛谷传送门CF传送门考虑给定\(b\)如何构造\(a\)。拎出基环树的环部分,把这些点连同它们的边删掉(这个环一定在答案中)。递归做即可。考虑我们在\(a\)的环上连一些在\(\{b_{i,n}\}\)中排得比\(a_i\)前的\(i\toj\)。可以将问题转化为,若干个环,缩点后连一些边使得它成......
  • hey_left 6 Codeforces Round 886 (Div. 4)
    题目链接A.判总和-最小值的差是否大等于10即可#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;voidsolve(){inta,b,c;cin>>a>>b>>c;intans=a+b+c;ans-=min({a,b,c});if(ans>=10){cout<<"YES&qu......
  • CodeForces 986F Oppa Funcan Style Remastered
    洛谷传送门CF传送门有意思的。对\(k\)分解质因数,题目实际上是想让我们解一个\(\sum\limits_{i=1}^ma_ix_i=n\)的方程。考虑\(m=1\)特判,\(m=2\)exgcd。\(m=3\)时发现\(\min\limits_{i=1}^ma_i\lek^{\frac{1}{3}}\le10^5\),所以可以跑同余最短路。......