Codeforces Round #202 (Div. 2) B:http://codeforces.com/problemset/problem/349/B
题意:给你一些颜料,然后你可以用这些颜料画一些数字,画每个数字的颜料是不一样的,然后问你用这些颜料可以画出的最大的数。
题解:和容易想到,直接用贪心,数字最大,首先要使得数字的位数最多,所以要选择需要颜料最少的数字来话,此题有一个好处就是,就是不用考虑前导零的情况,数的位数确定之后,就可以用剩余的颜料来调整数字,从高位到低位,每一次把把尽可能大的数字放在高位。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int a[23],v; 7 int minn,pos,ct; 8 int ans[1000002],top; 9 int main(){ 10 while(~scanf("%d",&v)){ 11 minn=1e7; 12 for(int i=1;i<=9;i++){ 13 scanf("%d",&a[i]); 14 if(minn>=a[i]){ 15 minn=a[i]; 16 pos=i; 17 } 18 } 19 if(v<minn){ 20 printf("-1 ");continue; 21 } 22 ct=v/minn; 23 int temp=v-ct*minn; 24 for(int i=1;i<=ct;i++) 25 ans[i]=pos; 26 top=0; 27 // printf("%d %d %d ",ct,temp,minn); 28 while(temp>0){ 29 int tp=0; 30 top++; 31 if(top>ct)break; 32 for(int i=1;i<=9;i++){ 33 if(a[i]-minn<=temp) 34 tp=i; 35 } 36 if(tp==0)break; 37 else { 38 ans[top]=tp; 39 temp-=(a[tp]-minn); 40 } 41 } 42 for(int i=1;i<ct;i++){ 43 printf("%d",ans[i]); 44 } 45 printf("%d ",ans[ct]); 46 } 47 }