A.
简单模拟
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long a,b,c;
scanf("%I64d %I64d %I64d",&a,&b,&c);
printf("%I64d ",(a+b)/c);
a%=c;
b%=c;
if(a+b>=c)printf("%I64d\n",c-max(a,b));
else printf("0\n");
return 0;
}
B.
从中间往两边找切点,比较两种情况的大小就好了
#include<bits/stdc++.h>
using namespace std;
const int L=1e5+10;
bool vis[L];
string s,s1,s2,ans1,ans2;
string add(string a,string b)//只限两个非负整数相加
{
string ans;
int na[L]={0},nb[L]={0};
int la=a.size(),lb=b.size();
for(int i=0;i<la;i++) na[la-1-i]=a[i]-'0';
for(int i=0;i<lb;i++) nb[lb-1-i]=b[i]-'0';
int lmax=la>lb?la:lb;
for(int i=0;i<lmax;i++) na[i]+=nb[i],na[i+1]+=na[i]/10,na[i]%=10;
if(na[lmax]) lmax++;
for(int i=lmax-1;i>=0;i--) ans+=na[i]+'0';
return ans;
}
bool cmp(string a,string b)
{ if(a[0]=='0')return true;
if(b[0]=='0')return false;
if(a.size()>b.size())return true;
else if(a.size()<b.size())return false;
return a>b;
}
int main()
{
int n;
scanf("%d",&n);
cin>>s;
int pos=n/2;
int lpos=-1,rpos=-1;
for(int i=0;i<n-1;i++)if(s[i+1]!='0')vis[i]=true;
for(int i=pos;i<n;i++)
{
if(vis[i])
{
rpos=i;
break;
}
}
for(int i=0;i<pos;i++)
{
if(vis[i])
{
lpos=i;
}
}
if(lpos==-1)
{
lpos=rpos;
}
else if(rpos==-1)
{
rpos=lpos;
}
for(int i=0;i<=lpos;i++)s1+=s[i];
for(int i=lpos+1;i<n;i++)s2+=s[i];
ans1=add(s1,s2);
//cout<<ans1<<endl;
s1="";s2="";
for(int i=0;i<=rpos;i++)s1+=s[i];
for(int i=rpos+1;i<n;i++)s2+=s[i];
ans2=add(s1,s2);
//cout<<ans2<<endl;
if(!cmp(ans1,ans2))cout<<ans1<<endl;
else cout<<ans2<<endl;
return 0;
}
C.统计高度,行的高度以及列的高度。
然后根据高度进行统计,好题!
#include<bits/stdc++.h>
using namespace std;
int n,m;
char mp[1010][1010];
int grp[1010][1010];
int h[1010][1010],c[1010][1010],ans[1010][1010];
int main()
{
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%s",mp[i]+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(mp[i][j]==mp[i-1][j])h[i][j]=h[i-1][j]+1;
else h[i][j]=1;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(mp[i][j]==mp[i][j-1])c[i][j]=c[i][j-1]+1;//列的高度
else c[i][j]=1;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
int ch=h[i][j];
if(i<3*ch)continue;
if(h[i-ch][j]!=ch||h[i-ch-ch][j]<ch||(h[i-ch-ch][j]+ch==h[i-ch][j]&&ch!=1))continue;
int val=min(min(c[i][j],c[i-ch][j]),c[i-ch-ch][j]);
for(int k=0;k<3*ch;k++)
{
val=min(val,c[i-k][j]);
}
if(val==1)ans[i][j]=1;
else ans[i][j]=ans[i][j-1]+1;
}
}
int sum=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
sum+=ans[i][j];
}
cout<<sum<<endl;
return 0;
}