Codeforces Round #639 (Div. 2) A~D

Posted voids5

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #639 (Div. 2) A~D相关的知识,希望对你有一定的参考价值。

比赛链接:https://codeforces.com/contest/1345

A. Puzzle Pieces

题意

给定n,m;问用题中所给图片是否能拼成n行m列的大图片

观察可得当n=1或m=1或n=2且m=2时成立

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 210;
int t,n,m;

int main(){
	cin>>t;
	while(t--){
		cin>>n>>m;
		if((n==1||m==1)||(n==2&&m==2)) puts("YES");
		else puts("NO");
	}


	return 0;
}

B. Card Constructions

题意

用n张卡牌搭金字塔,每次搭的塔尽可能的大,问最多可以搭多少座塔

思路

找规律,每层塔间相差牌数是等差数列,然后打表出n层塔所需要的卡牌数,最后二分即可

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 30010;
ll t,n,m;
ll s[N];

void init(){
	s[1]=2;
	for(ll i=2;i<N;i++){
		s[i]=s[i-1]+1ll*3*i-1;
	}
}

int main(){
	init();
	cin>>t;
	while(t--){
		cin>>n;
		ll ans=0;
		while(n>1){
			ll tmp=upper_bound(s+1,s+N+1,n)-s;
			n-=s[tmp-1];
			ans++;
		}
		cout<<ans<<‘
‘;
	}


	return 0;
}

C. Hilbert‘s Hotel

题意

给每个编号的客人按公式安排房间,问是否有房间安排了多个客人

思路

统计公式计算结果即可。注意负数

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 3e5+5;
ll t,n,m,a[N];
map<ll,ll>mp;

int main(){
	cin>>t;
	while(t--){
		cin>>n;
		mp.clear();
		bool flag=0;
		for(int i=0;i<n;i++){
			cin>>a[i];
			ll x=(i+a[i]%n+n)%n;
			if(mp[x]) flag=1;
			mp[x]++;
		}
		if(flag) puts("NO");
		else puts("YES");
	}

	return 0;
}
?

D. Monopole Magnets

题意

在图中每行每列都要存在s磁极,n磁极可以经过所有黑方块,n磁极不能经过白方块。

思路

1.两个黑方块之间不能存在白方块
2.如果存在全白行(列),则必须存在全白列(行)。
不懂可以模拟一下

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int N = 1005;
ll t,n,m,a[N];
char s[N][N];
int d[4][2]={1,0,-1,0,0,1,0,-1};

void dfs(int i,int j){
	s[i][j]=‘.‘;
	for(int k=0;k<4;k++){
		int x=i+d[k][0];
		int y=j+d[k][1];
		if(s[x][y]==‘#‘){
			dfs(x,y);
		}
	}
}

bool solve(){
	int flag1=0,flag2=0;
	//判断两个黑方块之间是否存在白方块
	for(int i=1;i<=n;i++){
		int cnt=0;
		if(s[i][1]==‘#‘) cnt++;
		for(int j=2;j<=m;j++){
			if(s[i][j]!=s[i][j-1]) cnt++;
		}
		if(cnt>2) return 0;
		if(!cnt) flag1=1;
	}
	for(int j=1;j<=m;j++){
		int cnt=0;
		if(s[1][j]==‘#‘) cnt++;
		for(int i=2;i<=n;i++){
			if(s[i][j]!=s[i-1][j]) cnt++;
		}
		if(cnt>2) return 0;
		if(!cnt) flag2=1;
	}
// 判断第二个条件
	if(flag1!=flag2) return 0;
	return 1;
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++) cin>>s[i][j];
	}
	if(!solve()){
		puts("-1");
	}
	else {
		int ans=0;
		//找连通块
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				if(s[i][j]==‘#‘){
					dfs(i,j);
					ans++;
				}
			}
		}
		cout<<ans<<‘
‘;
	}

	return 0;
}
?


以上是关于Codeforces Round #639 (Div. 2) A~D的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #639 (Div. 2) 补题

Codeforces Round #639 (Div. 2) 补题

Codeforces Round #639 (Div. 2)

Codeforces Round #639 (Div. 2)

Codeforces Round #639 (Div. 2) A~D

Codeforces Round #639 (Div. 2) A~D