【算法系列学习】HDU 5527 Too Rich贪心
2024-08-31 02:54:54
http://www.cnblogs.com/AOQNRMGYXLMV/p/4934747.html
#include<iostream>
#include<cstdio>
#include<algorithm> using namespace std;
const int maxn=;
const int inf=0x3f3f3f3f;
int a[maxn];
int b[maxn];
int val[]={,,,,,,,,,};
int Solve(int t)
{
int ans=;
for(int i=;i>=;i--)
{
if(i==||i==)
{
int cnt=min(t/(val[i]*),b[i]/);
ans+=cnt*;
t-=val[i]**cnt;
}
else
{
int cnt=min(t/val[i],b[i]);
ans+=cnt;
t-=val[i]*cnt;
}
if(t==)
{
break;
}
}
if(t==)
{
return ans;
}
else
{
return inf;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int p;
scanf("%d",&p);
int tot=;
int sum=;
for(int i=;i<;i++)
{
scanf("%d",&a[i]);
tot+=a[i];
sum+=val[i]*a[i];
}
if(sum<p)
{
printf("-1\n");
continue;
}
p=sum-p;
int ans=inf;
for(int i=;i<;i++)
{
for(int k=;k<;k++)
{
int temp=p;
memcpy(b,a,sizeof(a));
if(i)
{
if(b[])
{
temp-=val[];
b[]--;
}
else
{
continue;
}
}
if(k)
{
if(b[])
{
temp-=val[];
b[]--;
}
else
{
continue;
}
}
if(temp>=)
{
ans=min(ans,Solve(temp)+i+k);
}
}
}
if(ans==inf)
{
printf("-1\n");
}
else
{
printf("%d\n",tot-ans);
}
}
return ;
}
考虑问题的反面,求最大转化为求剩余的最小。然后从大到小贪心,能多用大面值的尽量多用。特判20,50;200,500
最新文章
- MyEclipse无法删除项目下的文件
- 如何在Global.asax中判断是否是ajax请求
- 根据linux内核源码查找recv返回EBADF(errno 9)的原因
- C#中的枚举类型(enum type)
- 【CSS3】---练习制作导航菜单
- openfire的配置
- InetAddress
- 更新yum到 163
- ubuntu server 安装
- 自己做的demo---关于java控制台输入跟类型转化跟处理异常的demo
- Android RatingBar自定义替换系统图片
- java default使用
- 基于Java Mail 进行发送(带附件和压缩附件)的邮件
- 微信小程序开发《一》:阿里云tomcat免费配置https
- 超简单的jQuery前台分页,不需导包
- cmd 创建用户,并授权管理员权限就可以远程登陆了
- Python内置函数(53)——repr
- Python3基础 time 索引值访问元组中的年月日时分秒
- HDU1698 Just a Hook(线段树&;区间覆盖)题解
- [Golang学习笔记] 02 命令源码文件