2021-10-03模拟赛


1、奶酪(cheese)

算法:我最开始是深搜。由于找哪儿叉掉了导致没剪枝.jpg
代码

#include<bits/stdc++.h>
using namespace std;
int a[1001][3],n,h,r;
bool b[1001][1001];
double dist(int x1,int y1,int z1,int x2,int y2,int z2){
	double d=sqrt(pow((x1-x2),2)+pow((y1-y2),2)+pow((z1-z2),2));
	return d;
}
bool check(){
	bool v[1001];
	memset(v,0,sizeof(v));
	int k[1000],jk=0,nk;
	while(true){
		bool flag=true;
		for(int i=1;i<=n;i++){
			if(a[i][2]<=r&&(!v[i])){
				k[0]=i;
				v[i]=true;
				flag=false;
				break;
			}
		}
		if(flag)	return false;
		nk=k[jk];
		while(true){
			if(a[nk][2]+r>=h)	return true;
			for(int i=1;i<=n;i++){
				if(b[nk][i]&&(!v[i])){
					k[jk]=nk;
					jk++;
					v[i]=true;
					nk=i;
					break;
				}
			}
			if(nk==k[jk]){
				jk--;
				nk=k[jk];
			}
			if(jk==-1)	break;
		}
	}
	return true;
}
int main(){
	int T;
	scanf("%d",&T);
	for(int i=1;i<=T;i++){
		scanf("%d%d%d",&n,&h,&r);
		//memset(a[1000],0,sizeof(a[1000]));
		//memset(b[1000],0,sizeof(b[1000]));
		for(int j=1;j<=n;j++){
			for(int k=1;k<=n;k++)
				b[j][k]=false;
			for(int k=0;k<=2;k++)
				a[j][k]=0;
		}
		for(int j=1;j<=n;j++){
			scanf("%d%d%d",&a[j][0],&a[j][1],&a[j][2]);
			for(int k=1;k<j;k++){
				double d=dist(a[k][0],a[k][1],a[k][2],a[j][0],a[j][1],a[j][2]);
				if(d<=double(2*r)){
					b[j][k]=true;
					b[k][j]=true;
				}
			}
		}
		bool flag=check();
		if(flag)	printf("Yes\n");
		else	printf("No\n");
	}
	return 0;
}

又臭又长。
估分:40不到。
实际得分:30(什么,我估的还蛮准得嘛。。。)
改善思路: 宽搜;并查集;剪枝。


2、时间复杂度(complexity)

算法:没什么算法,莽就完了。
代码(0分未校对)

#include<bits/stdc++.h>
using namespace std;
int l,w,sum,fzd,cw,step;
set<char> bl;
int main(){
	int t;
	char a[10];
	scanf("%d",&t);
	for(int i=1;i<=t;i++){
		w=0;
		cw=0;
		sum=0;
		step=0;
		bl.clear();
		bool flag=true,con=true,one=false;
		scanf("%d%c%c%c%c",&l,&a[9],&a[0],&a[1],&a[2]);
		if(a[2]=='1')	scanf("%c%c",&a[3],&a[9]);
		else
			scanf("%c%d%c%c",&a[4],&w,&a[5],&a[9]);
		for(int j=1;j<=l;j++){
			scanf("%c%c",&a[0],&a[9]);
			if(a[0]=='E'){
				con=true;
				if(sum==0)	flag=false;
				sum--;
				step--;
			}
			if(a[0]=='F'){
				sum++;
				scanf("%c%c%c%c%c%c",&a[1],&a[8],&a[2],&a[7],&a[3],&a[6]);
				if(!con)	continue;
				if(bl.count(a[1]))	flag=false;
				else	bl.insert(a[1]);
				if(a[2]=='n'&&a[3]!='n'){
					con=false;
					one=true;
					continue;
				}
				if(a[2]!='n'&&a[3]=='n'){
					step++;
					cw=step;
				}
				if(a[2]!='n'&&a[3]!='n'||a[2]=='n'&&a[3]=='n')	one=true;
			}
		}
		if(!flag||sum!=0)	printf("ERR\n");
		else{
			if(cw==w&&(w!=0||one))	printf("Yes\n");
			else	printf("No\n");
		}
	}
	return 0;
}

估分:0分。
实际不用说了。
稍加改良的逊版 代码(36分)

#include<bits/stdc++.h>
using namespace std;
int l,w,sum,fzd,cw,step;
deque<char> bl;
deque<char>::iterator it;
int main(){
	int t;
	char a[10];
	string str1,str2;
	scanf("%d",&t);
	for(int i=1;i<=t;i++){
		w=0;
		cw=0;
		sum=0;
		step=0;
		bl.clear();
		memset(a,0,sizeof(a));
		bool flag=true,con=true,one=false,fa=false;
		cin>>l>>a[0]>>a[1]>>a[2];
		if(a[2]=='1')	cin>>a[3];
		else
			cin>>a[4]>>w>>a[5];
		for(int j=1;j<=l;j++){
			cin>>a[0];
			if(a[0]=='E'){
				con=true;
				if(sum==0)	flag=false;
				sum--;
				step--;
				bl.pop_back();
			}
			if(a[0]=='F'){
				sum++;
				cin>>a[1]>>str1>>str2;
				if(!con)	continue;
				for(it=bl.begin();it!=bl.end();it++){
					if(a[1]==*it){
						fa=true;
						break;
					}
				}
				if(fa)	flag=false;
				else	bl.push_back(a[1]);
				if(str1[0]=='n'&&str2[0]!='n'){
					con=false;
					one=true;
					continue;
				}
				if(str1[0]!='n'&&str2[0]=='n'){
					step++;
					cw=max(cw,step);
				}
				if(str1[0]!='n'&&str2[0]!='n'||str1[0]=='n'&&str2[0]=='n')	one=true;
			}
		}
		if(!flag||sum!=0)	printf("ERR\n");
		else{
			if(cw==w&&(w!=0||one))	printf("Yes\n");
			else	printf("No\n");
		}
	}
	return 0;
}

3、换教室(classroom)

没写……(你在干什么啊!ZJH)
思路:图论,dp


4、斗地主

算法:每日一个骗分小技巧。不是
代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int a[5],t,n,step,r;
	cin>>t>>n;
	for(int i=1;i<=t;i++){
		if(n==2){
			scanf("%d%d%d%d",&a[0],&a[4],&a[1],&a[3]);
			if(a[0]==a[1])	step=1;
			else	step=2;
		}
		else if(n==3){
			for(int i=0;i<n;i++)
				scanf("%d%d",&a[i],&r);
			if(a[0]==a[1]&&a[1]==a[2])	step=1;
			else if(a[0]==a[1]||a[1]==a[2])	step=2;
			else	step=3;
		}
		else if(n==4){
			for(int i=0;i<n;i++)
				scanf("%d%d",&a[i],&r);
			if(a[0]==a[1]&&a[1]==a[2]||a[1]==a[2]&&a[2]==a[3]||a[0]==a[1]&&a[0]==a[3])
				step=1;
			else if(a[0]==a[1]&&a[2]==a[3]||a[0]==a[2]&&a[1]==a[3]||a[0]==a[3]&&a[1]==a[2])
				step=2;
			else if(a[0]==a[1]||a[0]==a[2]||a[0]==a[3]||a[1]==a[2]||a[1]==a[3]||a[2]==a[3])
				step=3;
			else	step=4;
		}
		cout<<step<<endl;
	}
	return 0;
} 

估分:30分。
实际得分:20分。

JOJO, 在短暂的码农生涯中,我明白了一件事,人们越是追求完美算法,就越容易犯错。除非,超越算法本身。

你在说什么?

我要写暴力了!!!~~JOJO。~~我要开始骗分!!!

玩梗.jpg

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值