Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
可能比较好理解的贪心···/** 有N种颜料的工具包,每种颜料50ml 现在给出N种颜料需要量和灰色需要量,灰色可以由任意三种颜料混合得到,问你最少需要多少颜料? 首先记录所有颜色需求里最大的,那么最大的 / 50 为至少需要 看灰色,看所有剩下颜料里是否能够混合多少灰色,实际上,混合多少灰色,为了确保利用的够好, 每次从最大的三种颜色里取(第三大变为第四大的量+1),在从变化后新的找最大的三个重复过程 **/ #include<cstdio> #include<algorithm> #include<string.h> using namespace std; int num[15],N; int main(){ while(~scanf("%d",&N) && N != 0){ int max_i = 0; for(int i = 0;i < N;++i){ scanf("%d",num+i); max_i = max_i > num[i] ? max_i : num[i]; } scanf("%d",num+N); int res = (max_i + 49) / 50; for(int i = 0;i < N;++i){ num[i] = res * 50 - num[i]; } while(num[N] > 0){ sort(num,num+N); if(num[N-3] == 0){ for(int i = 0;i < N;++i) num[i] += 50; res++; } if(N > 3 && num[N-4] != 0){ //每次从最大的三种颜色里取 第三大变为第四大的量+1(避免第3第4大相等,dead loop) //printf("before: %d %d %d %d\n",num[N-4],num[N-3],num[N-2],num[N-1]); num[N-1] -= num[N-3] - num[N-4] + 1; num[N-2] -= num[N-3] - num[N-4] + 1; num[N] -= num[N-3] - num[N-4] + 1; num[N-3] = num[N-4] - 1; //printf("after: %d %d %d %d\n",num[N-4],num[N-3],num[N-2],num[N-1]); }else{ num[N-1] -= num[N-3]; num[N-2] -= num[N-3]; num[N] -= num[N-3]; num[N-3] = 0; } } printf("%d\n",res); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator