JZOJ__Day 4:【普及模拟】火柴

题目描述


给定一个N位的数,将火柴棍重新排列后,能得到的最大的数是多少?
注意不能多出或者少一位, 火柴棍要全部用上.
 

输入

第一行整数T,表示数据组数
接下来T行,每行一个整数N, 然后是N位数,表示原来的数,可能会有前导0,中间用空格隔开。

输出

对于每组数据,输出一行,最大的能得到的数是多少。

样例输入

3
1 3
3 512
3 079

样例输出

5
977
997

数据范围限制

对于20%的数据:1 ≤ n ≤ 10
对于60%的数据:1 ≤ n ≤ 1000

对于100%的数据: 1 ≤ n ≤ 100000,1 ≤T≤ 10



程序:

        

const
a:array['0'..'9']of longint=(6,2,5,5,4,5,6,3,7,6);
var
t,i,n,k,l,w:longint;
h:int64;
j:char;
zfc:ansistring;
begin
    assign(input,'match.in');
    reset(input);
    assign(output,'match.out');
    rewrite(output);
    readln(t);
    for i:=1 to t do
    begin
        read(n);
        readln(zfc);
        delete(zfc,1,1);
        h:=0;
        for k:=1 to length(zfc) do
        h:=h+a[zfc[k]];
        l:=0;w:=n;
        while (2*w<=h)and(7*w>=h)and(l<=n)and(w>0)and(h>0) do
        begin
            inc(l);
            for j:='9' downto '0' do
            if (h-a[j]>=2*(w-1))and(7*(w-1)>=h-a[j])and(w>1)or(w=1)and(h=a[j])then
            begin
                dec(w);
                h:=h-a[j];
                write(j);
                break;
            end;
        end;
        writeln;
    end;
    close(input);
    close(output);
end.

posted @ 2017-07-10 14:37  银叶草  阅读(180)  评论(0编辑  收藏  举报
Live2D