一道贪心题,思路好想,不过细节有点多
自行百度题解
附上一个dalao代码
#include<stdio.h> int main() { int n,a,b,c,d,e,f,x,y; int u[4]={0,5,3,1}; while(1) { scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f); if(a==0&&b==0&&c==0&&d==0&&e==0&&f==0) break; n=d+e+f+(c+3)/4;//懂了 y=5*d+u[c%4];//在已有n个的情况下,能装下y个2*2的 if(b>y) n+=(b-y+8)/9;//把多的2*2的弄进来 x=36*n-36*f-25*e-16*d-9*c-4*b; if(a>x) n+=(a-x+35)/36;//把1*1的弄进来 printf("%d\n",n); } return 0; }
在附上我的辣鸡代码以作比较,有很多没有的代码,但是这些没用的代码让思路更清晰
#include<iostream> #include<cstdio> #include<cmath> #include<vector> #include<algorithm> #include<queue> #include<ctime> #include<cstring> #include<stdlib.h> #include<map> using namespace std; int size[7],num,scrap[7],cost,go,i; void cut(int x) { if(x == 2) { if(size[2] > scrap[2]) { size[2] -= scrap[2]; scrap[2] = 0; } else { scrap[2] -= size[2]; size[2] = 0; scrap[1] += scrap[2]*4; scrap[2] = 0; cut(1); } return ; //1. 防止运行上面代码后,x恰好变为1 } if(x == 1) { if(size[1] > scrap[1]) { size[1] -= scrap[1]; scrap[1] = 0; } else { scrap[1] -= size[1]; size[1] = 0; } } } int main() { //freopen("1.in","r",stdin); //freopen("1.out","w",stdout); while(1) { num = 0; go = 0; memset(scrap,0,sizeof(scrap)); for(i = 1;i <= 6;i ++) { scanf("%d",&size[i]); if(size[i] != 0) go = 1; } if(!go) break; num += size[6]; size[6] = 0; num += size[5]; scrap[1] += size[5]*11; cut(1); size[5] = 0; num += size[4]; scrap[2] += size[4]*5; cut(2); size[4] = 0; num += size[3]/4; size[3] %= 4; if(size[3]) num ++; if(size[3] == 1) { scrap[2] = 5; scrap[1] = 7; cut(2); } if(size[3] == 2) { scrap[2] = 3; scrap[1] = 6; cut(2); } if(size[3] == 3) { scrap[2] = 1; scrap[1] = 5; //4. 数错数了.....数成了4 cut(2); } size[3] = 0; num += size[2]/9; size[2] %= 9; if(size[2]) { num ++; scrap[1] += (9-size[2])*4; //3.这个必须在size[2]!=0 的前提下 } cut(1); size[2] = 0; num += size[1]/36; size[1] %= 36; //2.zz一般的忘了处理size if(size[1]) num ++; printf("%d\n",num); } //fclose(stdin);fclose(stdout); return 0; }