1. 程式人生 > >[jzoj]火柴:解題報告

[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;
}
如果你是好心人,就給我一個轉發,一個贊,一個評論……謝謝!