A1048 Find Coins (25分)

解法一:hashmap 

#include<iostream>
#include<cstdio> 
#include<cstring> 
#include<cctype>//里面有isdigit():数字字符返回true 
using namespace std; 
 
int main(){
int n,pay;
scanf("%d %d",&n,&pay);
int face;
int hashTable[1010]={0};//防止随机给数,初始化为0

for(int i=0;i<n;i++){
	scanf("%d",&face);
	hashTable[face]++;
}


for(int i=0;i<pay;i++)//面值最大是1000
{
	//循环终条件<pay 不是小于1001,因为可能会出现pay小于i 
	if(hashTable[i]&&hashTable[pay-i]){
		if(i==pay-i&&hashTable[i]<2)
		continue;
		printf("%d %d",i,pay-i);
		return 0;
	}
	
 }
 printf("No Solution") ;
 
	return 0;
}
 

注意点:

//静态全局数组和全局数组定义后,虽未初始化,但编译器默认用数值0填充; 
//静态局部数组定义后,未初始化,结果也是自动填充0; 
//局部数组就不一样,定义后不初始化,数组各元素值将用随机数值填充。

解法二:

two pointers

#include<iostream>
#include<cstdio>
#include<math.h>
#include<cstring>
#include<algorithm> 
#include<cctype>
using namespace std; 
const int maxn=100010;
int ans[maxn];
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
	cin>>ans[i];
}
int left=0,right=n-1;
sort(ans,ans+n);
while(left<right){
	if(ans[left]+ans[right]==m){
		cout<<ans[left]<<" "<<ans[right];
		return 0;
	}else if(ans[left]+ans[right]<m){
		left++;
	}else{
		right--;
	}
}
cout<<"No Solution";
    return 0;

}
 

解法三:二分法

#include<iostream>
#include<cstdio>
#include<math.h>
#include<cstring>
#include<algorithm> 
#include<cctype>
using namespace std; 
const int maxn=100010;
int ans[maxn];
int find(int left,int right,int key){
	while(left<=right){
		int mid=(right+left)/2;
		if(ans[mid]==key)return mid;
		else if(ans[mid]<key) left=mid+1;
		else right=mid-1;
	}
	return -1;//没找到 
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
	cin>>ans[i];
}

sort(ans,ans+n);
for(int i=0;i<n;i++){
	int temp=find(i+1,n-1,m-ans[i]);
	if(temp!=-1 )
	{
	cout<<ans[i]<<" "<<ans[temp];
	return 0;	
	}
}
cout<<"No Solution";
    return 0;

}
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值