链接:https://codeforces.com/contest/1360
A:
假定a为长,b为宽,那么最小正方形的边长就是a和2b的最大值。
1 #include <iostream> 2 using namespace std; 3 int main(void) 4 { 5 int t; 6 cin>>t; 7 while(t--) 8 { 9 int a,b; 10 cin>>a>>b; 11 if(a<b) 12 { 13 int temp=b; 14 b=a; 15 a=temp; 16 } 17 int k=max(a,2*b); 18 cout<<k*k<<endl; 19 20 } 21 return 0; 22 }
B:
容易知道所求为数组中两个数的最小差。
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 int main(void) 5 { 6 int t; 7 cin>>t; 8 while(t--) 9 { 10 int n; 11 int a[100]; 12 cin>>n; 13 for(int i=1;i<=n;i++)cin>>a[i]; 14 sort(a+1,a+1+n); 15 int minn=100000; 16 for(int i=2;i<=n;i++) 17 { 18 if(a[i]-a[i-1]<minn)minn=a[i]-a[i-1]; 19 } 20 cout<<minn<<endl; 21 } 22 return 0; 23 }
C:
先将奇数和偶数分成两组,如果两组的个数都是偶数,那么输出YES;否则因为总个数为偶数,必然两组个数都为奇数。若存在相差1的数,那么将一个多的数加入到少的数中,输出YES;否则输出NO。
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 int main(void) 5 { 6 int t; 7 cin>>t; 8 while(t--) 9 { 10 int n,a[1000],odd=0,even=0; 11 cin>>n; 12 for(int i=1;i<=n;i++) 13 { 14 cin>>a[i]; 15 if(a[i]%2)odd++; 16 else even++; 17 } 18 if(odd%2==0&&even%2==0) 19 { 20 cout<<"YES"<<endl; 21 } 22 else 23 { 24 sort(a+1,a+1+n); 25 int b=0; 26 for(int i=2;i<=n;i++) 27 { 28 if(a[i]-1==a[i-1]) 29 { 30 cout<<"YES"<<endl; 31 b=1; 32 break; 33 } 34 } 35 if(b==0)cout<<"NO"<<endl; 36 } 37 } 38 return 0; 39 }
D:
暴力查找,时间复杂度√n.
1 #include <iostream> 2 #include <cmath> 3 using namespace std; 4 int t,n,k; 5 int main(void) 6 { 7 cin>>t; 8 while(t--) 9 { 10 cin>>n>>k; 11 int ans=n; 12 for(int i=1;i<=k&&i*i<=n;i++) 13 { 14 if(n%i==0) 15 { 16 if(n/i<=k) 17 { 18 ans=i; 19 break; 20 } 21 ans=n/i; 22 } 23 } 24 cout<<ans<<endl; 25 } 26 return 0; 27 }
E:
查找除边界外所有的1,如果在它的右边或者下边没有1,则输出NO.
1 #include <iostream> 2 using namespace std; 3 int t,n; 4 char c[100][100]; 5 int main(void) 6 { 7 cin>>t; 8 while(t--) 9 { 10 cin>>n; 11 for(int i=0;i<n;i++) 12 { 13 cin>>c[i]; 14 } 15 int b=0; 16 for(int i=0;i<n-1;i++) 17 { 18 for(int j=0;j<n-1;j++) 19 { 20 if(c[i][j]=='1'&&!(c[i+1][j]=='1'||c[i][j+1]=='1')) 21 { 22 cout<<"NO"<<endl; 23 b=1; 24 break; 25 } 26 } 27 if(b==1)break; 28 } 29 if(b==0)cout<<"YES"<<endl; 30 } 31 return 0; 32 }
F:
(开始想着爆搜,但因为打开方式不对超时了。。)
因为m比较小,可以对第一个字符串每一个位置的所有可能构造一遍,再对剩下字符串遍历是否符合要求,符合即输出;若不存在输出-1.
1 #include <iostream> 2 using namespace std; 3 int t,n,m; 4 char s[100][100]; 5 int check(char j) 6 { 7 int dif=0; 8 for(int k=0;k<m;k++)if(s[1][k]!=s[j][k])dif++; 9 return dif>1; 10 } 11 void solve() 12 { 13 cin>>n>>m; 14 for(int i=1;i<=n;i++)cin>>s[i]; 15 for(int i=0;i<m;i++) 16 { 17 char c=s[1][i]; 18 for(int j=0;j<26;j++) 19 { 20 int b=0; 21 s[1][i]='a'+j; 22 for(int k=2;k<=n;k++) 23 { 24 if(check(k)) 25 { 26 b=1; 27 break; 28 } 29 } 30 if(b==0) 31 { 32 cout<<s[1]<<endl; 33 return; 34 } 35 } 36 s[1][i]=c; 37 } 38 cout<<"-1"<<endl; 39 } 40 int main(void) 41 { 42 cin>>t; 43 while(t--) 44 { 45 solve(); 46 } 47 return 0; 48 }
G:
若n*a!=m*b,输出NO;否则构造即可。
1 #include <iostream> 2 #include <cstring> 3 using namespace std; 4 int t,n,m,a,b; 5 char c[100][100]; 6 int main(void) 7 { 8 cin>>t; 9 while(t--) 10 { 11 cin>>n>>m>>a>>b; 12 if(n*a!=m*b) 13 { 14 cout<<"NO"<<endl; 15 continue; 16 } 17 memset(c,'0',sizeof(c)); 18 int j=0; 19 for(int i=0;i<n;i++) 20 { 21 for(int k=a;k>0;k--) 22 { 23 c[i][j]='1'; 24 j++; 25 j%=m; 26 } 27 } 28 cout<<"YES"<<endl; 29 for(int i=0;i<n;i++) 30 { 31 for(int j=0;j<m;j++)cout<<c[i][j]; 32 cout<<endl; 33 } 34 } 35 return 0; 36 }
H:
待补题。。