A
以长边为公共边并到一起再计算。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int t,a,b;
int main()
{
cin>>t;
while(t--)
{
cin>>a>>b;
if(a<b) swap(a,b);
int res=max(a,b*2);
cout<<res*res<<endl;
}
return 0;
}
B 排序就好。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int t,a[200],n;
int main()
{
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
int ans=10000;
for(int i=1;i<n;i++)
ans=min(ans,a[i+1]-a[i]);
cout<<ans<<endl;
}
return 0;
}
C 统计奇数和偶数的个数,因为总数是偶数,所以只有两个偶数和两个奇数的情况,两个偶数直接YES,两个奇数的话还需要判断是否有差为1的两个数,如果有就让他俩配一对,然后就是两个偶数了。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int t,a[200],n;
int main()
{
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
int num0=0,num1=0,num=0;
for(int i=1;i<=n;i++)
{
if(a[i+1]==a[i]+1&&i<n) num++;//注意边界情况,血的教训啊。。。
a[i]&1?num1++:num0++;
}
if((num0%2==0&&num1%2==0)||(num&&num0%2==num1%2)) puts("YES");
else puts("NO");
}
return 0;
}
D 找不大于k的最大的n的因子。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int t,a[200],n,k;
int main()
{
cin>>t;
while(t--)
{
cin>>n>>k;
vector<int> ve;
for(int i=1;i<=n/i;i++)
if(n%i==0)
{
ve.push_back(i);
ve.push_back(n/i);
}
sort(ve.begin(),ve.end());
int l=upper_bound(ve.begin(),ve.end(),k)-ve.begin();
cout<<n/ve[l-1]<<endl;
}
return 0;
}
E 判断每个非边界位置的1的右边和下边至少要有一个1.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int t,n,k;
char s[200][200];
int main()
{
cin>>t;
while(t--)
{
cin>>n;
for(int i=0;i<n;i++)
cin>>s[i];
bool flag=0;
for(int i=0;i<n-1;i++)
for(int j=0;j<n-1;j++)
if(s[i][j]=='1'&&s[i][j+1]=='0'&&s[i+1][j]=='0')
{
flag=1;
break;
}
if(!flag) puts("YES");
else puts("NO");
}
return 0;
}
F n和m都这么小直接暴力模拟即可。先判断以某个字符串是否能满足题意,不能的话再考虑替换一个字符(只替换一个,才能与原串匹配)。为增大匹配成功几率,替换的字符要是其他字符同位置上的字符。(代码非常麻烦)
O(n ^ 3 * m ^ 2 )
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int t,n,k;
string s[100];
bool check(string a,string b)
{
int cnt=0;
for(int i=0;i<a.size();i++)
{
if(a[i]!=b[i]) cnt++;
if(cnt>1) return 0;
}
return 1;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n>>k;
for(int i=0;i<n;i++)
cin>>s[i];
string ans;
bool flag=0;
for(int i=0;i<n;i++)
{
ans=s[i];
bool flag1=1;
for(int j=0;j<n;j++)
if(j!=i)
{
flag1=check(s[j],ans);
if(flag1==0) break;
}
if(flag1)
{
flag=1;
break;
}
for(int j=0;j<s[i].size();j++)//枚举替换的位置
{
for(int k=0;k<n;k++)//枚举要替换的字符串
{
if(k!=i&&s[k][j]!=s[i][j])
{
flag1=1;
ans[j]=s[k][j];//相同位置
for(int a=0;a<n;a++)//判断
if(a!=i)
{
flag1=check(ans,s[a]);
if(flag1==0) break;
}
if(flag1)
{
flag=1;
break;
}
}
if(flag) break;
}
if(flag) break;
ans[j]=s[i][j];
}
if(flag) break;
}
if(flag) cout<<ans<<endl;
else cout<<-1<<endl;
}
return 0;
}
G 每行要放a个,总共就要放na个;每列放b个总共需要放mb个,不相等就不可能实现,相等就模拟即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=210;
int t,n,m,a,b;
int s[N][N];
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m>>a>>b;
if(n*a==m*b)
{
int l=0;
memset(s,0,sizeof s);
for(int i=0;i<n;i++)
for(int j=0;j<a;j++)
{
s[i][l]=1;
l=(l+1)%m;
}
puts("YES");
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
cout<<s[i][j];
cout<<endl;
}
}
else puts("NO");
}
return 0;
}
H还没有补,这次这套题和上次div4难度差不多就是题多。。。