Codeforces Round #202 (Div. 2) B.Color the Fence
以为过了
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,e using 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; }
补充:软件开发 , C++ ,