2021-10-03 模拟赛

本文作者分享了参与国庆模拟赛的经历,分析了在P3958[NOIP2017提高组]奶酪问题中使用深搜和并查集算法的思路,反思了在P3952[NOIP2017提高组]时间复杂度题目上的思维混乱,并提及了P1850[NOIP2016提高组]换教室和P2668[NOIP2015提高组]斗地主两题的可能解法。作者强调了比赛中细心和清晰思维的重要性,并表达了对技术提升的渴望。
摘要由CSDN通过智能技术生成

1、P3958 [NOIP2017 提高组] 奶酪

算法思路:深搜?!
可能的思路:并查集
(代码有一处智商错误,已改正)

#include<bits/stdc++.h>

using namespace std;

int T;
int a[1010][1010];
int vis1[1010];//up
int vis2[1010];//down
int vis[1010];//colour
int n,h,r;
int x[1010],y[1010],z[1010];
bool f=false;

int cha(int tt,int t){
	if(tt>t) return tt-t;
	else return t-tt;
}

bool check(int i,int j){
	double dist=0;
	int xx=cha(x[i],x[j]);
	int yy=cha(y[i],y[j]);
	int zz=cha(z[i],z[j]);
	dist=sqrt((long double)xx*xx+(long double)yy*yy+(long double)zz*zz);
	if(dist<=2.0*r) return true;
	else return false;
}

void connect(){
	for(int i=1;i<=n;i++){
		if(z[i]+r>=h) vis1[i]=1;
		if(r>=z[i]) vis2[i]=1;
	}
	for(int i=1;i<=n;i++){
		for(int j=i+1;j<=n;j++){
			if(check(i,j)){
				a[i][j]=a[j][i]=1;
			}
		}
	}
}

void colour(int x){
	vis[x]=1;
	for(int i=1;i<=n;i++){
		if(a[x][i]&&vis[i]==0){
			colour(i);
		}
	}
}

int main(){
	//freopen("cheese.in","r",stdin);
	//freopen("cheese.out","w",stdout);
	scanf("%d",&T);
	while(T--){
		memset(a,0,sizeof(a));
		memset(vis1,0,sizeof(vis1));
		memset(vis2,0,sizeof(vis2));
		memset(vis,0,sizeof(vis));
		memset(x,0,sizeof(x));
		memset(y,0,sizeof(y));
		memset(z,0,sizeof(z));
		f=false;
		scanf("%d %d %d",&n,&h,&r);
		for(int i=1;i<=n;i++){
			scanf("%d %d %d",&x[i],&y[i],&z[i]);
		}
		connect();
		for(int i=1;i<=n;i++){
			if(vis2[i]==1){
				colour(i);
			}
		}
		for(int i=1;i<=n&&f==false;i++){
			if(vis1[i]&&vis[i]) f=true;
		}
		if(f) puts("Yes");
		else puts("No");
	}
	return 0;
}

估分:80
实际得分:10(原)=>100 ???
反思:写题目要细心!智商要在线! 还有就是在判断大多数情况的主要代码没写好时最好不要先排除一些特殊情况,防止有认为主要代码OK其实有漏洞的情况。

2、P3952 [NOIP2017 提高组] 时间复杂度

算法思路:???
可能的思路
27分代码。。。

#include<bits/stdc++.h>

using namespace std;

int t,len,comp,tot=-1,cnt;
string bin,com,body;
int name[200];
bool f=false;

int getnum(string x,int f,int r){
	int ans=0;
	for(int i=f;i<=r;i++){
		ans*=10;
		ans+=x[i-1]-'0';
	}
	return ans;
}

void clean(){
	memset(name,0,sizeof(name));
	f=false;
	tot=-1;
	cnt=0;
}

int main(){
	freopen("complexity.in","r",stdin);
	freopen("complexity.out","w",stdout);
	scanf("%d",&t);
	while(t--){
		clean();
		scanf("%d",&len);
		if(len%2!=0){
			for(int i=0;i<=len;i++) getline(cin,bin);
			puts("ERR");continue;
		}
		getchar();
		getline(cin,com);
		if(com[2]=='1') comp=0;
		else comp=getnum(com,5,com.size()-1);
		stack <char> ord;
		for(int i=1;i<=len&&f==false;i++){
			getline(cin,body);
			if(body[0]=='F'){
				ord.push('F');
				if(name[body[2]]) f=true;
				else name[body[2]]=1;
				if(body[4]=='n'){
					if(body[6]!='n') tot=cnt; 
				}
				else{
					int i=5;
					while(body[i-1]!=' ') i++;
					int l=getnum(body,5,i-1);
					i++;
					if(body[i-1]=='n'){
						ord.pop();
						ord.push('f');
						cnt++;
					}
					else{
						int r=getnum(body,i,body.size());
						if(l>r) tot=cnt;
					}
				}
			}
			else{
				if(ord.empty()) f=true;
				else {
					if(ord.top()=='f'){
						tot=max(tot,cnt);
						cnt--;
					}
					ord.pop();
				}
			}
		}
		if(!ord.empty()) f=true;
		if(f) puts("ERR");
		else{
			if(tot==-1) tot=cnt;
			if(tot==comp) puts("Yes");
			else puts("No");
		}
	}
	return 0;
}

估分:30
实际得分:27
反思:思维混乱是考场大忌,哪怕多想一点也最好不要乱写
(真的改不对。。。)

3、P1850 [NOIP2016 提高组] 换教室

算法思路:???
可能的思路:Floyd+DP

4、P2668 [NOIP2015 提高组] 斗地主

算法思路:???
可能的思路:给我搜??

总结:该骗分时要骗分,该思考时要思考。
嗑题要仔细。

蒟蒻的国庆模拟赛(一)
——2021.10.3

PS:作为一名蒟蒻,对于八方神犇的合理建议都是感激不尽的儿~~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值