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.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值