题意:给1,5,10,50,100面值硬币个数,求最少和最多个数组成p的个数
解析:最少从最大求下来即可,最少先求sum-p最少,再用sum-去求得的数即可
#include <iostream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <algorithm>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <ctime>
using namespace std;
#define LL long long
#define clr(s,x) memset(s,x,sizeof(s))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const double e = 2.718281828459045;
const double PI = acos(-1.0);
const int maxn = 1e2 + 10;
const LL mod = 998244353;
int num[6];
int chr[6]={1,5,10,50,100};
int p;
int main()
{
int t;
cin>>t;
while(t--){
clr(num,0);
cin>>p;
int x=p;
int sum=0;
for(int i=0;i<5;i++){
cin>>num[i];
sum+=(num[i]*chr[i]);
}
int cntx=0,cnty=0;
for(int i=4;i>=0;i--){
if(chr[i]>x)continue;
if(num[i]*chr[i]>=x){
cntx+=x/chr[i];
x=(x%chr[i]);
}
else{
cntx+=num[i];
x-=(num[i]*chr[i]);
}
}
if(x!=0)cntx=-1;
x=sum-p;
for(int i=4;i>=0;i--){
if(chr[i]>x)continue;
if(num[i]*chr[i]>=x){
cnty+=x/chr[i];
x=(x%chr[i]);
}
else{
cnty+=num[i];
x-=(num[i]*chr[i]);
}
}
if(x!=0)cnty=-1;
if(cnty!=-1)cnty=(num[0]+num[1]+num[2]+num[3]+num[4]-cnty);
cout<<cntx<<" "<<cnty<<endl;
}
return 0;
}