P11229 [CSP-J 2024] 小木棍题解
Starmoon_dhw · · 题解
Solution
提供一种贪心的思路。
由于构造的数要求最小,所以我们要保证构造的数的位数最少,也要保证越前面的数越小,所以我们可以在可以取的情况下尽可能的取小的数。
所以我们可以一位位的填,每一位最多只有
a[1].mugun=2;
a[1].num=1;
a[2].mugun=3;
a[2].num=7;
a[3].mugun=4;
a[3].num=4;
a[4].mugun=5;
a[4].num=2;
a[5].mugun=6;
a[5].num=0;
a[6].mugun=6;
a[6].num=6;
a[7].mugun=7;
a[7].num=8;
注意由于
接下来我们需要求出构造出的数字的位数,很好求为:
注意,由于
Code
#include<bits/stdc++.h>
using namespace std;
int T,n;
struct node{
int mugun,num;
}a[15];
bool cmp(node a,node b)
{
return a.num<b.num;
}
signed main()
{
a[1].mugun=2;
a[1].num=1;
a[2].mugun=3;
a[2].num=7;
a[3].mugun=4;
a[3].num=4;
a[4].mugun=5;
a[4].num=2;
a[5].mugun=6;
a[5].num=0;
a[6].mugun=6;
a[6].num=6;
a[7].mugun=7;
a[7].num=8;
sort(a+1,a+1+7,cmp);
cin>>T;
while(T--)
{
cin>>n;
if(n==1)
{
cout<<"-1\n";
continue;
}
int ws=(n-1)/7+1;
int flag=1;
while(ws>0)
{
for(int i=1;i<=7;i++)
{
if((ws-1)*7>=n-a[i].mugun&&n>=a[i].mugun)
{
if(a[i].num==0&&flag)
continue;
ws--;
cout<<a[i].num;
flag=0;
n-=a[i].mugun;
break;
}
}
}
cout<<"\n";
}
return 0;
}