ACM第一次练习—1005F
来源:互联网 发布:免费办公用品软件系统 编辑:程序博客网 时间:2024/05/17 00:18
题意:输入需要的钱数,手里的钱:1角,5角,1元,5元,10元(都以角为单位输入),输出凑齐需要的钱数最少需要几张纸币,最多需要几张纸币,如果手中的钱凑不齐,输出“-1 -1”.
思路:1.最少数贪心策略:优先取面值大的纸币来凑需要的钱。最大数策略:要花最多输纸币,则留在手中的的纸币要最少,假设手上有P角,价格为q角,用手上最少的纸币去凑(p-q),然后用手中的总数减去该最少数就可以了。
感想:数组的使用还存在问题,数组作为函数参数是怎么用还不会!!!通过这个题补回来了~
代码:
#include <iostream>
#include "stdio.h"
#include "string.h"
int b[10]={0,1,5,10,50,100};
int main()
{
int t;
int p,r;
int a[10],c[10],e[10];
int i,j,k,sum;
scanf("%d",&t);
while(t--)
{
sum=0;
scanf("%d",&p);
r=p;
for(i=1;i<=5;i++)
{
scanf("%d",&a[i]);
sum=sum+b[i]*a[i];
}
for(i=5;i>0;i--)
{
if(r/b[i]<a[i])
{
c[i]=r/b[i];
r=r-b[i]*c[i];
}
else
{
c[i]=a[i];
r=r-c[i]*b[i];
}
}
if(r!=0)
{
printf("-1 -1\n");
}else
{
k=sum-p;
for(i=5;i>0;i--)
{
if(k/b[i]<a[i])
{
e[i]=k/b[i];
k=k-b[i]*e[i];
}
else
{
e[i]=a[i];
k=k-e[i]*b[i];
}
}
if(k==0)
{
printf("%d %d\n",c[1]+c[2]+c[3]+c[4]+c[5],(a[1]+a[2]+a[3]+a[4]+a[5]-(e[1]+e[2]+e[3]+e[4]+e[5])));
}
}
}
}
- ACM第一次练习—1005F
- ACM第一次练习—1016
- ACM第一次练习—1000A
- ACM第一次练习—1012M
- ACM第一次练习—1006G
- ACM第一次练习—1002C
- ACM第一次练习—1010K
- ACM第一次练习—1017R
- ACM第一次练习-1004
- 第一次为了acm练习盲打
- ACM第一次练习—1001B,1008I
- ACM递归递推练习 Problem F
- ACM第二次练习—1005
- ACM第三次练习—1005
- ACM-递归递推练习F-计算组合数
- ACM第四次练习—1005
- 第一次写——ACM
- ACM(递归递推—F)
- A星算法
- [JS插件] wScratchPad.js刮刮卡效果-页面涂抹消失插件
- 30天入门 Android 开发, Google 与你一起圆梦
- 虚拟现实
- Dijkstra算法的java实现
- ACM第一次练习—1005F
- POJ 1703
- Daemon线程和Join线程
- 批处理 选项语法
- PhotoView ImageView缩放
- XSS攻击及防御
- 排序之快速排序算法
- 【PA2014Final】【BZOJ3726】Wykladzina
- yii2 随笔(七)依赖注入——(2)php依赖注入的简单实现