Codeforces Round #644Div.3
A. Minimal Square(签到)
题意:给你两个a*b的矩形,求能包含这两个矩形的最小正方形。两个矩形要平行于正方形。
题记:想要正方形面积最小,肯定是让长的那条边重合,形成一个(a+a)*b的矩形,取这个矩形的最长的边即正方形的边长。
#include<bits/stdc++.h>
using namespace std;
int main(){
int T;
cin>>T;
while(T--){
int a,b;
cin>>a>>b;
if(a>b) swap(a,b);
if(a+a>b)
cout<<(a+a)*(a+a)<<endl;
else
cout<<b*b<<endl;
}
return 0;
}
B. Honest Coach(排序)
题意:每个运动员都有一个力量值,将n个运动员分成两组,求A组力量值最大的运动员减去B组力量值最小的运动员的值。使这个值最小。
题记:排下序,求出相邻两个数之间的差的最小值即是答案。
#include<bits/stdc++.h>
using namespace std;
const int N=100,INF=0x3f3f3f3f;
int a[N];
int main(){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1);
int ans=INF;
for(int i=2;i<=n;i++){
ans=min(a[i]-a[i-1],ans);
}
cout<<ans<<endl;
}
return 0;
}
C. Similar Pairs(思维)
题意:每两个数分为一组,当这两个数都为偶数或者都为奇数或者相差为1时才能分为一组。求是否能分完所有数。
题记:记录下奇数和偶数的数量,当出现一个奇数个奇数和奇数个偶数时,排序数组,遍历一遍看是否有相差为1的两个数,没有输出NO,其余情况都是YES。
#include<bits/stdc++.h>
using namespace std;
const int N=1010,INF=0x3f3f3f3f;
int a[N];
int main(){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
int sum1=0,sum2=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]%2==0)
sum1++;
else
sum2++;
}
if(sum1%2==1){
sort(a+1,a+1+n);
bool flag=false;
for(int i=2;i<=n;i++){
if(a[i]==a[i-1]+1){
flag=true;
break;
}
}
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
else{
cout<<"YES"<<endl;
}
}
return 0;
}
D. Buying Shovels(约数)
题意:有1到k种包装,求最少能拿多少次(同一包装)能拿到n个。
题记:只有是n的约数的包装才能拿,那么取约数中不超过k的最大值即可。
#include<bits/stdc++.h>
using namespace std;
const int N=1010,INF=0x3f3f3f3f;
int a[N];
int main(){
int T;
cin>>T;
while(T--){
int n,k;
cin>>n>>k;
vector<int>ans;
for(int i=1;i<=n/i;i++){
if(n%i==0){
ans.push_back(i);
if(i!=n/i)ans.push_back(n/i);
}
}
sort(ans.begin(),ans.end());
for(int i=ans.size()-1;i>=0;i--){
if(ans[i]<=k){
cout<<n/ans[i]<<endl;
break;
}
}
}
return 0;
}
E. Polygon(思维)
题意:有个nn的矩阵,2n个炮塔,炮弹射出时会沿直线走,直到碰到一枚炮弹或者到达地图边缘。给出一个n*n的矩阵,问是否存在这个矩阵的情况。
题记:只要判断一颗炮弹右边和下边有无炮弹或者是否边缘即可。
#include<bits/stdc++.h>
using namespace std;
const int N=60,INF=0x3f3f3f3f;
char a[N][N];
int main(){
int T;
cin>>T;
while(T--){
int n;
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
bool flag=true;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(i==n||j==n)
continue;
if(a[i][j]=='1'&&a[i][j+1]=='0'&&a[i+1][j]=='0')
flag=false;
}
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
F. Spy-string(枚举)
题意:求一个字符串,这个字符串与每个字符串只能有一个字符不同。
题记:直接暴力枚举O(n4),以第一个字符串为标准,枚举m个字符和26个字母,然后和剩下的n-1个字符串匹配一下是否符合题意。
#include<bits/stdc++.h>
using namespace std;
const int N=15;
string s[N];
string ans;
int n,m;
bool check(){
for(int i=0;i<n;i++){
int cnt=0;
for(int j=0;j<m;j++){
if(ans[j]!=s[i][j]){
cnt++;
if(cnt>1)
return false;
}
}
}
return true;
}
int main(){
int T;
cin>>T;
while(T--){
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>s[i];
ans=s[0];
bool flag=false;
for(int i=0;i<m;i++){
for(char c='a';c<='z';c++){
ans[i]=c;
if(check()){
flag=true;
break;
}
}
if(flag)break;
ans[i]=s[0][i];
}
if(flag)
cout<<ans<<endl;
else
cout<<-1<<endl;
}
return 0;
}
G. A/B Matrix(构造)
题意:n*m的网格,每行有a个1,每列有b个1
题记:要满足题目条件必须满足na=mb。如果满足就直接构造即可。
#include<bits/stdc++.h>
using namespace std;
const int N=110;
char s[N][N];
int main(){
int T;
cin>>T;
while(T--){
int n,m,a,b;
cin>>n>>m>>a>>b;
if(n*a!=m*b){
cout<<"NO"<<endl;
continue;
}
memset(s,'0',sizeof(s));
int j=0;
for(int i=0;i<n;i++){
for(int k=0;k<a;k++){
s[i][j]='1';
j++;
j%=m;
}
}
cout<<"YES"<<endl;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++)
cout<<s[i][j];
cout<<endl;
}
}
return 0;
}