ACM第一次练习—1010K

来源:互联网 发布:js function use 编辑:程序博客网 时间:2024/05/22 06:28

题意:给出每种颜料的量,要求配出灰色,求最少需要多少颜料。这是典型的贪心算法。,对每种颜料的量进行由大到小排序。若颜料的量正好是50ml的倍数,自然简单,超过了50ml之后,就要使用下一个颜料瓶,每种颜料的剩余量也都增加了,再进行排序,直到求出所需要的颜料量。

思路:先准备好灰色以外的颜色,然后把剩余颜色从大到小排序,前三个混合为灰色,若不足三个再买一包直到凑够灰色。

感想:这道题并不难,只要理解了题意就很好做了,贪心的原则也很好把握,第一遍错的实在是无语,电脑里一直都保存着上一道题的代码,也就习惯性的保留了头文件,也对它少了些留意,最后竟因为少了头文件没有一次过,以后还是要留意一下。

代码:

#include<iostream>
#include<algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a>=b;
}
int f(int a)
{
int b;
if(a<50) b=1;
if(a>=50&&a%50==0) b=a/50;
if(a>=50&&a%50!=0) b=a/50+1;
return b;
}
int main()
{
int n;
while(cin>>n)
{
int m,d=0;
if(n==0) break;
int a[1000];
for(int i=0;i<n;i++)
cin>>a[i];
cin>>m;
int t=0;
for(int i=0;i<n;i++)
if(a[i]!=0) t++;
if(t==0&&m==0)
{
cout<<"0"<<endl;
continue;
}
int max=f(a[0]);
for(int i=1;i<n;i++)
if(f(a[i])>max) max=f(a[i]);
int b[1000];
for(int i=0;i<n;i++)
b[i]=50*max-a[i];
for(int c=0;c<m;)
{
sort(b,b+n,cmp);
if(b[2]==0)
{
   for(int i=0;i<n;i++)
    b[i]+=50;
    d++;
}
else
{b[0]--;b[1]--;b[2]--;c++;}
}
cout<<d+max<<endl;
}
return 0;

感想:这道题并不难,只要理解了题意就很好做了,


0 0
原创粉丝点击