[jzoj]火柴:解题报告

       本来想向以前一样把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;
}
如果你是好心人,就给我一个转发,一个赞,一个评论……谢谢!

猜你喜欢

转载自blog.csdn.net/qq_40155097/article/details/81046837