PAT A1048 Find Coins

题目难度:两颗星
题目大意:有硬币序列,给定一个需要付款的钱,需要找出两个硬币可以付款,并且输出其中较小的一组(即所所有组合中,较小硬币面值最小的组合)
题目坑点:如果有三个相同面值的硬币,需要对flag数组标记自增,不能仅仅标记存在。寻找方案的时候,也应该判断为是否>=1(否则在中间一个测试点会报错)
代码如下:

#include<iostream>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<map>
#include<cstring>
using namespace std;
bool cmp(int a,int b){
	return a<b;
}
int main(){
	int N,M;
	cin>>N>>M;
	int coins[N];
	for(int i=0;i<N;i++){
		cin>>coins[i];
	}
	sort(coins,coins+N,cmp);
	int end=-1;//记录最大的值 
	int flag[1005];
	memset(flag,0,sizeof(int)*1005);
	for(int i=0;i<N;i++){
		if(coins[i]<M){
			end++;
			flag[coins[i]]++;
		}	
		else
			break;
	}
	int has=0;
	for(int i=0;i<end;i++){
		int v1=coins[i];
		flag[v1]--;
		if(flag[M-v1]>=1){//一个坑点 
			has=1;
			cout<<v1<<" "<<M-v1;
			break;
		}
	}
	if(has==0)
		cout<<"No Solution";
}

发布了18 篇原创文章 · 获赞 0 · 访问量 181

猜你喜欢

转载自blog.csdn.net/weixin_42302528/article/details/104299636