A题:
不解释,注意任意一个位置的数必须大于等于1
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define LL __int64
using namespace std;
int main()
{
int i,l1,l2;
char str[100001];
while(~scanf("%s",str))
{
int len=strlen(str);
for(i=0;i<len;i++)
{
if(str[i]=='+')l1=i;
if(str[i]=='=')l2=i;
}
int a=l1;
int b=l2-l1-1;
int c=len-l2-1;
if(a+b==c)
{
cout<<str<<endl;
}
else if((a+b+2==c)||(a+b==c+2))
{
if(a+b+2==c)
{
a++;
c--;
}
else if(a+b==c+2)
{
if(a<b)b--;
else a--;
c++;
}
for(i=0;i<a;i++)cout<<"|";
cout<<"+";
for(i=0;i<b;i++)cout<<"|";
cout<<"=";
for(i=0;i<c;i++)
{
cout<<"|";
}
cout<<endl;
}
else
{
cout<<"Impossible"<<endl;
}
}
return 0;
}
B题:
枚举最后一位,然后根据最后一位推出前面的数。
注意,当推出第一位的时候,一定要判断此时的余数,要不然就sad了。。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define LL __int64
using namespace std;
int a[1100000];
int b[1100000];
int c[1100000];
int main()
{
// freopen("data.in","r",stdin);
// freopen("data.out","w",stdout);
int i,l1,l2,h,j,n,x,ii;
int f;
char str[100001];
int leap=0;
while(~scanf("%d%d",&n,&x))
{
leap=0;
for(ii=1;ii<=9;ii++)
{
a[1]=ii;
b[1]=ii;
f=0;
for(j=2;j<=n+1;j++)
{
b[j-1]=((a[j-1]*x)%10+f);
f=0;
if(b[j-1]>9)
{
f++;
b[j-1]=(b[j-1])%10;
}
a[j]=b[j-1];
f+=(a[j-1]*x)/10;
}
if(b[n]==a[1]&&a[n]!=0&&f==0)
{
if(leap==0)
{
for(i=1;i<=n;i++)
{
c[i]=a[i];
}
leap++;
}
else
{
leap++;
int ll=0;
for(i=n;i>=1;i--)
{
if(ll==1)c[i]=a[i];
else
{
if(c[i]==a[i])c[i]=a[i];
else if(c[i]<a[i])break;
else if(c[i]>a[i])
{
ll=1;
c[i]=a[i];
}
}
}
}
}
}
if(leap==0)
{
cout<<"Impossible"<<endl;
}
else
{
for(i=n;i>=1;i--)
{
printf("%d",c[i]);
}
cout<<endl;
}
}
return 0;
}
C题:贪心
在放置牌的时候,两行一起放。
优先放01,然后下面放10,如果没有就放00,如果再没有就放11.
没有01的时候,优先放00,下面放11,没有11放00.
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define LL __int64
using namespace std;
int a[1001];
int maps[1001][1001];
int main()
{
int i,l1,l2,h,j,n,x,ii,m;
int f;
char str[100001];
int leap=0;
while(~scanf("%d%d",&n,&m))
{
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&x);
if(x==10)x=1;
a[x]++;
}
}
for(i=2;i<=n;i+=2)
{
for(j=1;j<=m;j++)
{
if(a[1]!=0)
{
maps[i-1][j]=1;
a[1]--;
if(a[1])maps[i][j]=10,a[1]--;
else if(a[0])maps[i][j]=0,a[0]--;
else maps[i][j]=11,a[11]--;
}
else if(a[11]!=0)
{
maps[i][j]=11;
a[11]--;
if(a[0])a[0]--,maps[i-1][j]=0;
else a[11]--,maps[i-1][j]=11;
}
else if(a[0]!=0)
{
maps[i][j]=0;
maps[i-1][j]=0;
}
}
}
if(n%2)
{
for(j=1;j<=m;j++)
{
if(a[1])a[1]--,maps[n][j]=1;
else if(a[0])a[0]--,maps[n][j]=0;
else a[11]--,maps[n][j]=11;
}
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
printf("%02d ",maps[i][j]);
}
cout<<endl;
}
}
return 0;
}
D题:
水题,当时竟然没看,SAD了。。。
我们可以枚举第一位的值。
然后三分倍数x。
由题意可以轻而易举的读出,随着x的增大,最终的结果是先减小后增大的。
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define INF 99999999
using namespace std;
int a[1000001];
int n;
int dos(int st,int x)
{
int mx=0;
for(int i=0;i<n;i++)
{
mx=max(mx,abs(st+x*i-a[i]));
}
return mx;
}
int main()
{
int i;
while(~scanf("%d",&n))
{
int sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
for(i=1;i<n;i++)sum+=a[i]-a[i-1];
int mid1,mid2,p1,p2;
int biao=dos(a[0],sum/(n-1));
int as,bs;
as=a[0];
bs=sum/(n-1);
//cout<<sum<<" "<<biao<<endl;
for(i=a[0]-biao;i<=a[0]+biao;i++)
{
int ll=0;
int rr=a[n-1]-a[0];
while(ll<=rr)
{
mid1=ll+(rr-ll)/3;
mid2=rr-(rr-ll)/3;
p1=dos(i,mid1);
p2=dos(i,mid2);
if(p1<p2)rr=mid2-1;
else ll=mid1+1;
}
p1=dos(i,ll-1);
if(biao>p1)
{
biao=p1;
as=i;
bs=ll-1;
}
}
cout<<biao<<endl;
cout<<as<<" "<<bs<<endl;
}
return 0;
}