【前行】◇第3站◇ Codeforces Round #512 Div2

【第3站】Codeforces Round #512 Div2

第三题莫名卡半天……一堆细节没处理,改一个发现还有一个……然后就炸了,罚了一啪啦时间

Rating又掉了……但是没什么,比上一次好多了:)

+传送门+


◇ 简单总结

前两道题非常OK,秒掉还好。心态爆炸是从第三题开始的……一开始设计的判断方法没有考虑0,然后就错了很多次,然后改了过后又没有考虑整个数要分成2个及以上的数,继续WA,最后整个程序删了重新魔改了一次终于AC。感觉最后的AC代码的复杂度要比原来高一些,但是毕竟AC了,还是不错的(似乎并不是复杂度越低越好)。

然后基本上历程是这样的:

看前两题 -> 愉快砍掉 -> 看三题 -> 好像很简单:) -> 提交 -> WA了! -> 开始改 -> 迅速发现bug -> 改了 -> 再交 -> 继续WA:( -> 上述过程重复7次QwQ -> 开始看D题 -> 看懂了 -> 好像不好做 -> 突然灵感乍现 -> 回过头做C题 -> AC了 -> 比赛结束


◇ 题目&解析

A. In Search of an Easy Problem

· [翻译]

出题人正在尝试把第一题出得更简单。于是他调查了n个人,如果第i个人觉得题比较难,出题人就会得到反馈“1”,否则得到反馈“0”。当出题人得到所有反馈都是“0”时,这道题就被认为是简单的。

输入n,表示调查人数。给出n个数 0 或 1 表示每个人的反馈。

如果该问题被认为是简单的,则输出"EASY",否则输出"HARD"。

· [解析]

依次输入,用一个bool变量判断是否有出现“1”,如果有则输出"HARD",否则输出"EASY"。

· [源代码]

/*Lucky_Glass*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int main() {
	scanf("%d",&n);
	bool x=false;
	for(int i=0,num; i<n; i++) {
		scanf("%d",&num);
		x|=num;
	}
	printf("%s\n",!x?"EASY":"HARD");
	return 0;
}

B. Vasya and Cornfield

· [翻译]

有一块边长为n的正方形的地中间有一个矩形的田,田的四角的坐标分别是(0,d),(d,0),(n,n−d)(n−d,n)。

有m个蝗虫在这块地的某些坐标上,农夫想要知道哪些蝗虫在田里。

给出 n,d,m,以及每个蝗虫的坐标(均为整数,且矩形的每一条边都大于0),判断每个蝗虫是否在田里。

· [解析]

满满的全是“if”……

大概一开始我处理了一下图——如果d是大于n/2的,我就可以将原图左右翻转一下,把n-d作为新的d的值……也就是下面这样:

强行将情况转换一下……如果要进行这个操作,我就把bool变量flag赋值为true表示需要翻转。

之后输入虫的坐标时如果flag 为true,就把 x 改成 n-x,也就是进行一次翻转

接下来按虫的纵坐标分类讨论——

① 0≤y≤d : 在田里则是 d-y≤x≤d+y

② d<y<n-d : 在田里则是 y-d≤x≤y+d

③ n-d≤y≤n : 在田里则是 y-d≤x≤2n-d-y

输出即可。

· [源代码]

/*Lucky_Glass*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,d,q;
int main() {
	scanf("%d%d%d",&n,&d,&q);
	bool flag=(n<d*2);
	if(flag) d=n-d;
	while(q--) {
		int x,y;
		scanf("%d%d",&x,&y);
		if(flag) y=n-y;
		if(y<=d) {
			if(d-y<=x && x<=d+y)
				printf("YES\n");
			else
				printf("NO\n");
		} else if(d<y && y<n-d) {
			if(y-d<=x && x<=y+d)
				printf("YES\n");
			else
				printf("NO\n");
		} else {
			if(n-d-(n-y)<=x && x<=n-d+(n-y))
				printf("YES\n");
			else
				printf("NO\n");
		}
	}
	return 0;
}

C. Vasya and Golden Ticket

· [翻译]

Vasya有一个数字串,他希望把这个数字串分成多个(≥2)不重叠子串,且每个元素至少属于一个子串,满足每个子串中的数字之和相等。

输出是否可能。

· [解析]

首先可以用字符串储存数字串。

枚举第一个子串的范围为第 1~i 个数字。假设这样可行,则可以先算出每一个子串中的数字之gal和。用 tot 统计当前子串数字之和,依次枚举每一个数字,并加入到当前子串 —— 若tot>gal,则说明无法完成,如果tot==gal且下一位不是0(如果是0就可以继续添加到当前子串),则该子串已经达到目标,tot清零,记录下一个子串,用cnt记录分成的子串的个数。如果枚举到最后一个数字,则判断tot是否等于gal。特判一下——如果gal==0,就判断整个串是否都是0。

最后可以用bool保存答案,并判断cnt是否≥2,然后输出。

· [源代码]

/*Lucky_Glass*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
char strnum[105];
int main() {
	scanf("%d%s",&n,strnum);
	int gal=0;
	for(int i=0; i<n-1; i++) {
		gal+=strnum[i]-‘0‘;
		int tot=0,cnt=0;
		bool OK=true;
		for(int j=0; j<n; j++) {
			if(gal==0){
				if(strnum[j]!=‘0‘){
					OK=false;
					break;
				}
				else
					cnt++;
			}
			else{
				tot+=strnum[j]-‘0‘;
				if(tot>gal) {
					OK=false;
					break;
				}
				if(j==n-1 && tot!=gal) {
					OK=false;
					break;
				}
				if(tot==gal && strnum[j+1]!=‘0‘) tot=0,cnt++;
			}
		}
		if(OK && cnt>=2) {
			printf("YES\n");
			return 0;
		}
	}
	printf("NO\n");
	return 0;
}

The End

Thanks for reading!

- Lucky_Glass

(Tab:如果我有没讲清楚的地方可以直接在邮箱[email protected] email我,在周末我会尽量解答并完善博客~??)

原文地址:https://www.cnblogs.com/LuckyGlass-blog/p/9699147.html

时间: 2024-08-01 03:47:19

【前行】◇第3站◇ Codeforces Round #512 Div2的相关文章

codeforces round #257 div2 C、D

本来应该认真做这场的,思路都是正确的. C题,是先该横切完或竖切完,无法满足刀数要求,再考虑横切+竖切(竖切+横切), 因为横切+竖切(或竖切+横切)会对切割的东西产生交叉份数,从而最小的部分不会尽可能的大. 代码如下,虽然比较长.比较乱,但完全可以压缩到几行,因为几乎是4小块重复的代码,自己也懒得压缩 注意一点,比如要判断最小块的时候,比如9行要分成2份,最小的剩下那份不是9取模2,而应该是4 m/(k+1)<=m-m/(k+1)*k          #include<bits/stdc+

codeforces Round #250 (div2)

a题,就不说了吧 b题,直接从大到小排序1-limit的所有数的lowbit,再从大到小贪心组成sum就行了 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #define N 200000 6 using namespace std; 7 int pos[N],a[N],s[N],f[N],la[N],b[N],i,j,k,ans,n,p

Codeforces Round#320 Div2 解题报告

Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Finding Team Member codeforces 579C A Problem about Polyline codeforces 579D "Or" Game codeforces 579E Weakness and Poorness codeforces 579F LCS Aga

Codeforces Round #254(div2)A

很有趣的题.想到了就非常简单,想不到就麻烦了. 其实就是一种逆向思维:最后结果肯定是这样子: WBWBWBWB... BWBWBWBW... WBWBWBWB... ... 里面有“-”的地方改成“-”就行了. 但是我开始是正着想的,想每个点怎么处理,这还要看它周围点的状态,越想越麻烦... 这题中体现的正难则反的逆向思维很值得学习. #include<iostream> #include<cstdio> #include<cstdlib> #include<cs

Codeforces Round #254(div2)B

就是看无向图有几个连通块,答案就是2n-num. 范围很小,就用矩阵来存图减少代码量. #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<map> #include<set> #include<vector> #include<algorithm> #inc

Codeforces Round #260(div2)C(递推)

有明显的递推关系: f[i]表示i为数列中最大值时所求结果.num[i]表示数i在数列中出现了几次. 对于数i,要么删i,要么删i-1,只有这两种情况,且子问题还是一样的思路.那么很显然递推一下就行了:f[i]=max(f[i-1],f[i-2]+i*num[i]); 这里技巧在于:为了防止麻烦,干脆就所有数的出现次数都记录一下,然后直接从2推到100000(类似于下标排序),就不用排序了,也不用模拟删除操作了.这一技巧貌似简单,但实际上临场想出来也需要点水平. #include<iostrea

Codeforces Round #289 Div2 E

Problem 给一串长度为N的字符串,对于每个字符,若字符为元音,则权值为1,否则为0.一个子串的权值定义为该串所有字符权值之和除以字符个数,一个母串的权值定义为所有子串的权值之和.求母串的权值. Limits Time Limit(ms): 1000 Memory Limit(MB): 256 N: [1, 5*10^5] 字符集: 'A'-'Z' 元音: I E A O U Y Solution 考虑每个元音字符对母串的贡献,可以找出规律. More 举"ABCDOEFGHKMN"

Codeforces Round #403 div2 C. Andryusha and Colored Balloons

题目链接:Codeforces Round #403 div2 C. Andryusha and Colored Balloons 题意: 给你一棵n个节点的树,然后让你染色,规定相连的三个 节点不能同色,问需要的最少颜色,并输出其中一种方案. 题解: 因为只有相邻3个节点不同色. 所以直接DFS,每个节点都从1开始. 然后ans[v]!=ans[u]!=ans[fa]就行. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=a;i&

CodeForces Round#229 DIV2 C 递推DP

对这道题目也只好说呵呵了,没注意k的范围最大才10,所以昨晚纠结了很久,没什么好的方法来处理,后来无奈想去翻翻题解,发现人家开头就来了句,因为k的范围比较小 所以.........我只好暂停马上回头看看题目,是的,k比较小所以完全可以先在询问前预处理DP一遍, DP就比较清晰了,dp[i][j]  (i>=0 && i<k,,,,j>=i && j <=n)代表意义呢 以i为开头的  区间[1,j]注意 是 1~j的 所需要的操作数,题目问的是最小操