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)