A题代码
#include<iostream>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
string s;
cin>>s;
int ans=-1;
for(int i=0;i<s.length();i++)
{
ans=max(ans,s[i]-'0');
}
cout<<ans<<endl;
}
return 0;
}
B题思路 先做边缘上的两列 再按照题目要求补全边缘上的两行即可
B题代码
#include<bits/stdc++.h>
using namespace std;
const int N=25;
int a[N][N];
int main()
{
int T;
cin>>T;
while(T--)
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n+1;i++)
{
for(int j=1;j<=m+1;j++)
{
a[i][j]=0;
}
}
for(int i=1;i<=n;i+=2)
{
a[i][1]=1;
a[i][m]=1;
}
for(int j=1;j<=m;j++)
{
if(a[1][j+1]==0&&a[1][j-1]==0&&a[1+1][j]==0&&a[1+1][j-1]==0&&a[1+1][j+1]==0)
a[1][j]=1;
else a[1][j]=0;
if(a[n][j+1]==0&&a[n][j-1]==0&&a[n-1][j]==0&&a[n-1][j-1]==0&&a[n-1][j+1]==0)
a[n][j]=1;
else a[n][j]=0;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<a[i][j];
}
cout<<endl;
}
cout<<endl;
}
return 0;
}
C题思路见代码中的注释
C题代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],b[N],sa[N],sb[N],n,T;
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
for (int i=1;i<=n;i++) scanf("%d",&b[i]);
sort(a+1,a+n+1);
sort(b+1,b+n+1);
for (int i=1;i<=n;i++) sa[i]=sa[i-1]+a[i],sb[i]=sb[i-1]+b[i];//前缀和 因为要删的时候也是把小的那几个一起给删了
for (int suma,sumb,x=0;x<=n;x++) {
suma=sa[n]-sa[(n+x)/4]+x*100;
sumb=sb[n]-sb[max(0,(n+x)/4-x)];//因为贪心的策略 后面的数均为0 倘若要删的数字个数小于后面补全的0的个数
//那么按照题意 b就会删掉0 即 -sb[0]
//倘若要删的数字个数大于后面补全的0的个数 那么缺少了几个就删掉几个
if (suma>=sumb) {
printf("%d\n",x);
break;
}
}
}
}