考场上想的贪心:先尽量取 8 ,然后看剩下的木棍数,余 1 就删掉一个 8,然后前面插入 10 (没有木棍数为 1 的数字),余2到7就取木棍数为余数的的最小的数字,余 2 就在前面插入 1 (木棍数为 2 的只有 1 ),余 3 就在前面插入 7 (木棍数为 3 的只有 7 ),余 4 在前面插入 4 (木棍数为 4 的只有 4),余 5 就在前面插入 2 (木棍数为 5 的有2、3、5 ,其中 2 最小),余 6 就在前面插入 6 (木棍数为 6 的有 0、6、9,但 0 不能放前面,所以是 6 ),然后从前往后扫,每次将第 i 位和第 i+1 位 2 个数字换成木棍数相同但是数字更小的数, i=1 时特判0不能在前面。最后输出,洛谷、小图灵、核桃编程的自测都能过。
代码:
#include<iostream>
#include<map>
using namespace std;
int T,n;
string s;
const int c[]={6,2,5,5,4,5,6,3,7,6};
map<int,pair<int,int>>mp1;
map<int,pair<int,int>>mp2;
bool cmp(int a1,int a2,int b1,int b2)
{
if(a1!=b1)return a1<b1;
return a2<b2;
}
void chushi()
{
for(int i=1;i<=14;i++)
{
for(int j=0;j<=9;j++)
{
for(int k=j;k<=9;k++)
{
if(j==0&&k==0)continue;
if(c[j]+c[k]==i)
{
if(mp1.find(i)==mp1.end())
{
if(j==0)mp1[i]={k,j};
else mp1[i]={j,k};
}
else
{
bool flag=false;
if(j==0)
{
swap(j,k);
flag=true;
}
int f1=mp1[i].first;
int f2=mp1[i].second;
if(cmp(j,k,f1,f2))
{
mp1[i]={j,k};
}
if(flag)swap(j,k);
}
}
}
}
}
for(int i=1;i<=14;i++)
{
for(int j=0;j<=9;j++)
{
for(int k=j;k<=9;k++)
{
if(c[j]+c[k]==i)
{
if(mp2.find(i)==mp2.end())
{
mp2[i]={j,k};
}
else
{
int f1=mp2[i].first;
int f2=mp2[i].second;
if(cmp(j,k,f1,f2))
{
mp2[i]={j,k};
}
}
}
}
}
}
}
int main()
{
// freopen("sticks.in","r",stdin);
// freopen("sticks.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
chushi();
cin>>T;
while(T--)
{
cin>>n;
if(n<7)
{
switch(n)
{
case 1:
{
cout<<"-1\n";
break;
}
case 2:
{
cout<<"1\n";
break;
}
case 3:
{
cout<<"7\n";
break;
}
case 4:
{
cout<<"4\n";
break;
}
case 5:
{
cout<<"2\n";
break;
}
case 6:
{
cout<<"6\n";
break;
}
}
continue;
}
s="";
for(int i=1;i<=n/7;i++)
s+='8';
switch(n%7)
{
case 0:break;
case 1:
{
s.pop_back();
s='0'+s;
s='1'+s;
break;
}
case 2:
{
s='1'+s;
break;
}
case 3:
{
s='7'+s;
break;
}
case 4:
{
s='4'+s;
break;
}
case 5:
{
s='2'+s;
break;
}
case 6:
{
s='6'+s;
break;
}
}
for(int i=0;i<(int)(s.size())-1;i++)
{
char c1=s[i],c2=s[i+1];
int quan=c[c1-'0']+c[c2-'0'];
if(i==0)
{
s[i]=mp1[quan].first+'0';
s[i+1]=mp1[quan].second+'0';
}
else
{
s[i]=mp2[quan].first+'0';
s[i+1]=mp2[quan].second+'0';
}
}
cout<<s<<"\n";
}
return 0;
}
/*
不要挂分!不要挂分!不要挂分!
rp++
rp++
rp++
rp++
rp++
*/