原题链接 PAT甲级 1048 Find Coins (25 分)
题目大意 给定n个正整数和m,判断如果n个正整数中是否有a+b=m,如果有则输出。如果有多对a、b,则输出a最小的情况。反之,输出"No Solution"。
分析 建立coin数组(int型),记录正整数a的出现次数 。使用set保存输入的正整数,set默认从小到大排列,以及不重复出现元素,这正是我们这道题所需要的。
另外,如果正整数a刚好是m的一半,即a+b=m,b=a。那么coin[a]必须大于等于2,不然就是重复使用这个硬币了。
#include<iostream>
#include<set>
using namespace std;
int coin[100010]={0};
set<int> s;
int main(){
int n, m, t;
scanf("%d%d", &n, &m);
for(int i=0;i<n;i++){
scanf("%d", &t);
coin[t]++;
s.insert(t);
}
for(auto it=s.begin();it!=s.end();it++){
if(coin[m-*it]>(2*(*it)==m?1:0)){
printf("%d %d", *it, m-*it);
return 0;
}
}
printf("No Solution");
return 0;
}
网友评论