Codeforces Round #644 (Div. 3) 题解 (全部8题)
目录
https://codeforces.com/contest/1360
怎么回事,突然8题,我的肝啊
A. Minimal Square
直接输出
#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=(ios::sync_with_stdio(0),cin.tie(0),0);
const int N=100010; typedef long long ll;
//#define int ll
int T,a,b;
signed main(){
cin>>T;
while(T--){
cin>>a>>b;
if(a>b)swap(a,b);
cout<<(max(a+a,b))*(max(a+a,b))<<endl;
}
return 0;
}
B. Honest Coach
找最相近的两个人
#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=(ios::sync_with_stdio(0),cin.tie(0),0);
const int N=100010; typedef long long ll;
//#define int ll
int T,n,a[N];
signed main(){
cin>>T;
while(T--){
cin>>n;
repeat(i,0,n)cin>>a[i];
sort(a,a+n);
int ans=1e9;
repeat(i,0,n-1)
ans=min(ans,a[i+1]-a[i]);
cout<<ans<<endl;
}
return 0;
}
C. Similar Pairs
先判断奇数的个数(或者偶数)是否为偶数,偶数就一定yes
然后判断是否两个差为1的数,有就一定yes
第二种情况是因为,如果有两个差为1的数并且不满足第一种情况,可以把这两个数单独拎出来,然后就满足第一种情况了
#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=(ios::sync_with_stdio(0),cin.tie(0),0);
const int N=100010; typedef long long ll;
//#define int ll
int T,n,a[N];
signed main(){
cin>>T;
while(T--){
cin>>n;
repeat(i,0,n)cin>>a[i];
sort(a,a+n);
int flag=0,cnt[]={0,0};
repeat(i,0,n){
if(i!=n-1 && a[i+1]-a[i]==1)flag=1;
cnt[a[i]%2]^=1;
}
cout<<(flag || cnt[0]==0?"YES":"NO")<<endl;
}
return 0;
}
D. Buying Shovels
求 \([1,k]\) 范围内的最大的n的因数,输出n除以这个数
#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=(ios::sync_with_stdio(0),cin.tie(0),0);
const int N=100010; typedef long long ll;
//#define int ll
int T,n,k;
signed main(){
cin>>T;
while(T--){
cin>>n>>k;
int ans=1e9;
for(int i=1;i*i<=n;i++)
if(n%i==0){
if(i<=k)ans=min(ans,n/i);
if(n/i<=k)ans=min(ans,i);
}
cout<<ans<<endl;
}
return 0;
}
E. Polygon
只要判断是否出现
\[10\\
0?
\]
的情况就行了(?可以是0也可以是1)
因为这种情况,那个1一定是假的
#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=(ios::sync_with_stdio(0),cin.tie(0),0);
const int N=110; typedef long long ll;
//#define int ll
int T,n;
char s[N][N];
signed main(){
cin>>T;
while(T--){
cin>>n;
repeat(i,0,n)cin>>s[i];
repeat(i,0,n)s[i][n]=s[n][i]='1';
int f=true;
repeat(i,0,n)
repeat(j,0,n)
if(s[i][j]=='1' && s[i+1][j]=='0' && s[i][j+1]=='0')
f=false;
cout<<(f?"YES":"NO")<<endl;
}
return 0;
}
F. Spy-string
以字符串 \(s[0]\) 为模板,作最多一个字符的改动。不确定如何改动?那就枚举所有可能的情况,这样时间也是够的
\(O(n^4)\) 暴力,相信cf神机!奥利给
#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=(ios::sync_with_stdio(0),cin.tie(0),0);
const int N=110; typedef long long ll;
//#define int ll
int T,n,m;
string s[N];
string ans;
bool ok(){
repeat(i,0,n){
int cnt=0;
repeat(j,0,m)cnt+=(ans[j]!=s[i][j]);
if(cnt>1)return 0;
}
return 1;
}
void solve(){
cin>>n>>m;
repeat(i,0,n)cin>>s[i];
ans=s[0];
repeat(i,0,n)
repeat(j,0,m){
int t=ans[j];
ans[j]=s[i][j];
if(ok()){cout<<ans<<endl; return;}
ans[j]=t;
}
cout<<-1<<endl;
}
signed main(){
cin>>T;
while(T--){
solve();
}
return 0;
}
G. A/B Matrix
因为1的个数守恒,就有 \(na=mb\),不满足直接NO走人
然后只要每行放a个1,下一行接上一行的位置即可。更准确地说,第一行在 \(1,2,3,...,a\) 位置上放1,然后第二行在 \(a+1,a+2,...,2a\) 位置上放1(当然都要对m取模)。这样弄完后可以证明,每一列都有b个1
#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=(ios::sync_with_stdio(0),cin.tie(0),0);
const int N=110; typedef long long ll;
//#define int ll
int T,n,m,a,b;
string ans[N];
signed main(){
cin>>T;
while(T--){
cin>>n>>m>>a>>b;
if(n*a!=m*b){cout<<"NO"<<endl; continue;}
cout<<"YES"<<endl;
int x=0;
repeat(i,0,n){
ans[i].assign(m,'0');
repeat(j,0,a){
ans[i][(x++)%m]='1';
}
cout<<ans[i]<<endl;
}
}
return 0;
}
H. Binary Median
二分答案
对于一个数,我们可以很快算出它在给定集合中的排名,而排名又满足单调性,因此二分答案直接开莽
#include <bits/stdc++.h>
using namespace std;
#define repeat(i,a,b) for(int i=(a),_=(b);i<_;i++)
#define repeat_back(i,a,b) for(int i=(b)-1,_=(a);i>=_;i--)
int cansel_sync=(ios::sync_with_stdio(0),cin.tie(0),0);
const int N=110; typedef long long ll;
#define int ll
int T,n,m;
string s;
int a[N];
signed main(){
cin>>T;
while(T--){
cin>>n>>m;
repeat(i,0,n){
cin>>s;
a[i]=bitset<64>(s).to_ullong();
}
sort(a,a+n);
int l=0,r=1ll<<m,f=((1ll<<m)-n-1)/2;
while(l<=r){
int mid=(l+r)/2;
int cnt=mid-(upper_bound(a,a+n,mid)-a); //这个upperbound可以直接for一遍也无所谓
if(cnt<f)l=mid+1; else r=mid-1;
}
cout<<bitset<64>(l).to_string().substr(64-m,-1)<<endl;
}
return 0;
}