第六届图灵杯部分题解

奔赴图灵杯现场

题解:贪心

#include<bits/stdc++.h>
using namespace std;
int main(){
	int t;cin>>t;
	while(t--){
		int n,m,x;
		cin>>n>>m>>x;
		n+=m;
		if(n%x==0) cout<<n/x-1<<endl;
		else cout<<n/x<<endl;
	} 
	return 0;
}

漫漫上学路

题解:模拟,注意黄灯之后要等红灯

#include<bits/stdc++.h>
using namespace std;
int main(){
	int r,y,g,n;
	cin>>r>>y>>g>>n; 
	int ans=0;
	for(int i=1;i<=n;i++){
		int k,t;
		cin>>k>>t;
		if(k==0||k==1) ans+=t;
		if(k==2) ans+=(t+r);
	}
	cout<<ans<<endl;
	return 0;
}

未闻mr名

题解:沙比提

#include<bits/stdc++.h>
using namespace std;
int main(){
	int t;cin>>t;
	while(t--){
		int L;cin>>L;
		string s;cin>>s;
		int flag=0;
		for(int i=0;i<L-3;i++)
			if(s[i]=='m'&&s[i+1]=='r'&&s[i+2]=='n'&&s[i+3]=='b'){
				flag=1;break;
			}
		if(flag) cout<<"1"<<endl;
		else cout<<"0"<<endl;
	}
	return 0;
}

数格子

题解:先算覆盖前的,覆盖的减去就行了

#include<bits/stdc++.h>
using namespace std;
int main(){
	int t;cin>>t;
	while(t--){
		int n,m,R,C;
		cin>>n>>m>>R>>C;
		int a,b,c;
		c=n+m-1;
		a=n*m/2;
		if(n%2&&m%2) a++;
		if(R%2) a-=(m/2+m%2);
		else a-=m/2;
		
		if(C%2) a-=(n/2+n%2);
		else a-=n/2;
		
		if((R+C)%2==0) a++;
		cout<<a<<" "<<n*m-a-c<<" "<<c<<endl; 
	}
}

境界线上的数组

题解:用map就行了,跟官方题解不同,不知道是不是数据太弱,让我卡过了
对于一个数字,先找map中是否出现,出现减一,没出现就让其和之前确定的数字相加,加入map
时间复杂度为O(nlogn)

#include<bits/stdc++.h>
using namespace std;
const int N=10000;
int ans[N],a[N];
int main(){
	int t;cin>>t;
	while(t--){
		int n;cin>>n;
		map<int,int> M;
		for(int i=1;i<=(n*n-n)/2;i++) cin>>ans[i];
		if(n==1||n==2||n==3){
			cout<<n-1<<endl;
			continue;
		}
		a[1]=ans[1];a[2]=ans[2];
		M[a[1]+a[2]]++;
		int k=3;
		for(int i=3;i<=(n*n-n)/2;i++){
			if(!M[ans[i]]){
				a[k]=ans[i];
				for(int j=k-1;j>0;j--) M[a[k]+a[j]]++;
				k++;
			}
			else{
				M[ans[i]]--;
			}
			if(k==n){
				k=i;break;
			} 
		}
		cout<<k<<endl;
	}
}

今天又是开花的一天

题解:简单搜索,注意题意,当最后的体力为零时,应该输出的是-1,而不是0,巨TM坑

#include<bits/stdc++.h>
using namespace std;
const int N=105;
int mp[N][N],vis[N][N],n,m,ans; 
int pos[4][2]={1,0,-1,0,0,1,0,-1};
void dfs(int x,int y,int res){
	if(res<0) return;
	if(mp[x][y]==3) res+=5;
	if(mp[x][y]==2) res-=3;
	if(x==n&&y==m){
		if(res>ans) ans=res;
		return;
	}
	vis[x][y]=1;
	for(int i=0;i<4;i++){
		int nx=x+pos[i][0];
		int ny=y+pos[i][1];
		if(nx<=0||ny<=0||nx>n||ny>m) continue;
		if(mp[nx][ny]==1||vis[nx][ny]) continue;
		else{
			dfs(nx,ny,res-1);
			vis[nx][ny]=0;
		}
	} 
}
int main(){
	int t;cin>>t;
	while(t--){
		cin>>n>>m;
		ans=-1;
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				cin>>mp[i][j];
		memset(vis,0,sizeof(vis));
		dfs(1,1,15);
		cout<<ans<<endl;
	}
}

二等分的签名照

题解:简单博弈,好像是什么巴什博奕。。。。

其他的什么尼姆博奕,威佐夫博弈都可以去百度看下

#include<bits/stdc++.h>
using namespace std;
int main(){
	int t;cin>>t;
	while(t--){
		int n,m;
		cin>>n>>m;
		if(n%(m+1)) cout<<"Yui"<<endl;
		else cout<<"Mio"<<endl;
	}
	return 0;
} 

我们仍未知道那天所看见的mr的名字

题解:不也是模拟吗,k为0时就直接加上t就行了,其他情况直接加上当前ans值取模判断在那个区间就行了

#include<bits/stdc++.h>
using namespace std;
int main(){
	long long r,y,g,n;
	cin>>r>>y>>g>>n; 
	long long mod=r+y+g;
	long long ans=0;
	for(int i=1;i<=n;i++){
		long long k,t;
		cin>>k>>t;
		if(k==0) ans+=t;
		else{
			long long temp;
			if(k==1) temp=ans+(r-t);
			if(k==2) temp=ans+(r+y+g-t);
			if(k==3) temp=ans+(r+g-t);
			if(temp%mod<r) ans+=(r-temp%mod);
			else if(temp%mod<r+g) continue;
			else ans+=(2*r+g+y-temp%mod);
		}
	}
	cout<<ans<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41860129/article/details/92399494