本来想向以前一样把D组4道提的解题报告都写成博客的,但是今天实在是太累了,再是有些一我还没AC(这是重点),所以今天的D组解题报告就没了,望原谅。还有,我每天写博客要花掉将近一个小时的时间,但是即使我这么用心写,却也换不来你们的一个转发、一个赞、一条评论……
今天的文言文也没了。
开始吧!
火柴
题目描述:
给定一个N位的数,将火柴棍重新排列后,能得到的最大的数是多少?
注意不能多出或者少一位, 火柴棍要全部用上.
输入:
第一行整数T,表示数据组数
接下来T行,每行一个整数N, 然后是N位数,表示原来的数,可能会有前导0,中间用空格隔开。
输出:
对于每组数据,输出一行,最大的能得到的数是多少。
数据范围限制:
对于20%的数据:1 ≤ n ≤ 10
对于60%的数据:1 ≤ n ≤ 1000
对于100%的数据: 1 ≤ n ≤ 100000,1 ≤T≤ 10
思路:
统计每种数字需要多少火柴棒,贪心从高到低位,从大到小放数字,注意因为火柴棒要
恰好用完,且位数一样,所以要时刻检查当前火柴棒是否存在符合要求的放置方法,即检查全
部放1或者全部放8行不行。
Code:
#include <cstdio>
#include <cstring>
using namespace std;
const int cnt[10] = {6,2,5,5,4,5,6,3,7,6};
int t,n,sum,cur;
char ch;
inline bool judge(int i,int j)
{return i * 2 <= j && j <= i * 7;}
int main()
{
freopen("match.in","r",stdin);
freopen("match.out","w",stdout);
scanf("%d",&t);
while(t--)
{
sum = 0;
scanf("%d",&n);
for(register int i = 1;i <= n;++i)
{
scanf(" %c",&ch);
sum += cnt[ch - '0'];
}
for(register int i = n;i >= 1;--i)
{
cur = 9;
if(i == 1)
{
while(sum != cnt[cur])
--cur;
putchar(cur + '0');
break;
}
while(!judge(i - 1,sum - cnt[cur]))
--cur;
sum -= cnt[cur];
putchar(cur + '0');
}
puts("");
}
return 0;
}
如果你是好心人,就给我一个转发,一个赞,一个评论……谢谢!