codeforces round #644 div3

链接: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:

待补题。。

猜你喜欢

转载自www.cnblogs.com/yanying7/p/12958230.html