牛客練習賽71——迴文數(模擬+細節)
阿新 • • 發佈:2021-01-12
牛客練習賽71——迴文數(模擬+細節)
真的細節。
思路:
記每一位的個數為num[i].根據題意可以得知:
無法構造的情況有:
1.有至少兩個num[i]為奇數。
2.num[0]>=2並且其他數位只有一個並且只出現了一次,比如050,就無法避免前導0
注意特判最後一個樣例。
正常做法分為兩類,如果num[0]==0,說明無需考慮前導零的問題,直接從小到大列舉取一半構造出前半段,翻轉得到後半段即可;否則,就要先把最小的非0位放在開始,然後再重複前面的步驟。如果num[i]%2的話,就將多出來的這個放在中間。
附上垃圾程式碼:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,ll>PLL;
typedef pair<int,int>PII;
typedef pair<double,double>PDD;
#define I_int ll
inline ll read()
{
ll x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
char F[200];
inline void out(I_int x)
{
if (x == 0)
return (void) (putchar('0'));
I_int tmp = x > 0 ? x : -x;
if (x < 0 )
putchar('-');
int cnt = 0;
while (tmp > 0)
{
F[cnt++] = tmp % 10 + '0';
tmp /= 10;
}
while (cnt > 0)
putchar(F[--cnt]);
//cout<<" ";
}
ll ksm(ll a,ll b,ll p)
{
ll res=1;
while(b)
{
if(b&1)
res=res*a%p;
a=a*a%p;
b>>=1;
}
return res;
}
const ll inf = 0x3f3f3f3f3f3f3f3f;
const int N=410,mod=1e8;
const double PI = 3.1415926535;
const double eps=1e-6;
const int maxn=1100;
int main()
{
int num[10];
int cnt=0,sum=0,pos;
for(int i=0; i<=9; i++)
{
num[i]=read();
if(num[i]&1)
cnt++,pos=i;
if(num[i]) sum++;
}
if(cnt>1||(num[0]>=2&&sum==2&&num[pos]==1))
puts("-1");
else if(sum==1&&num[0]==1) puts("0");
else
{
if(num[0]==0)
{
string s;
int flag=-1;
for(int i=0; i<=9; i++)
if(num[i])
{
for(int j=1; j<=num[i]/2; j++)
{
char t=i+'0';
s=s+t;
}
if(num[i]&1)
flag=i;
}
cout<<s;
if(flag!=-1)
cout<<flag;
reverse(s.begin(),s.end());
cout<<s<<endl;
}
else
{
string s;
int pos=1;
while(!num[pos]) pos++;
char ch=pos+'0';
s+=ch;
num[pos]-=2;
int flag=-1;
for(int i=0; i<=9; i++)
if(num[i])
{
for(int j=1; j<=num[i]/2; j++)
{
char t=i+'0';
s=s+t;
}
if(num[i]&1)
flag=i;
}
cout<<s;
if(flag!=-1)
cout<<flag;
reverse(s.begin(),s.end());
cout<<s<<endl;
}
}
return 0;
}