大坑題啊大坑題
以為過了
5
2 2 2 2 2 2 2 2 3
就對了的。
結果。。。
19
9 9 9 9 9 9 5 6 8
輸出 987
哈哈哈
跟上面那種是一樣的原理。先刷小的。刷不夠了換一個小的加剩餘的 看能不能湊一個大的
但是湊了一個大的以後呢。可能還有餘數。那就還要去湊。
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#include <vector>#include <string>#include <set>#define lson num<<1,s,mid#define rson num<<1|1,mid+1,eusing namespace std;int a[15];int top;int ss[1000000];int main(){ top=0; int n; scanf("%d",&n); int Min=99999999; int k; for(int i=1;i<=9;i++)//找最小 { scanf("%d",&a[i]); if(Min>=a[i]) { Min=a[i]; k=i; } } if(Min>n) { printf("-1\n"); return 0; } bool found=true; int tmp=n%Min; while(found) //湊啊湊 湊不了了就不湊 { int sb=-1; int i; for(i=k+1;i<=9;i++) { if(tmp+Min>=a[i]) { sb=i; } } if(sb==-1)found=false; else { tmp-=(a[sb]-Min); ss[top++]=sb; } } int ttmp=n/Min; if(top!=0) ttmp-=top; sort(ss,ss+top); //printf("top =%d\n",top); for(int i=top-1;i>=0;i--) printf("%d",ss[i]); for(int i=1;i<=ttmp;i++) { printf("%d",k); } puts(""); return 0;}