原题连接:http://codeforces.com/gym/101102/problem/B
题意:用火柴棍摆数字,保证位数不变的情况下,相同数量的火柴棍,使数值尽量大。
思路:先建立一个数组,对应每一个数字需要的火柴棍数量。外层循环枚举每一位,内层循环选数字。每一位数字最少用2根火柴棍,最多用7根,所以剩下几位,就用位数乘以2作为下限,乘以7作为上限,只需判定选用本次数值后剩下的火柴棍是否再上下限范围内,即可完成判定。
完整代码:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; #define N 100005 char s[N]; int d[10]={6,2,5,5,4,5,6,3,7,6}; int main(){ int t,n; scanf("%d",&t); while(t--){ int sum=0; scanf("%d%s",&n,s); for(int i=0;i<n;i++){ sum+=d[s[i]-'0']; } for(int i=1;i<=n;i++){ int l=(n-i)*2,r=(n-i)*7; for(int j=9;j>=0;j--){ int a=sum-d[j]; if(a>=l&&a<=r){ sum-=d[j]; printf("%d",j); break; } } } printf("\n"); } return 0; }