1. 程式人生 > >A1048 Find Coins

A1048 Find Coins

1.直接二重迴圈暴力會超時,只能得20分,要不然這題也不會是25分的題le,不過講道理20分給的太多了。
2.有兩種方法做,第一種two pointers.就是i,j分別是陣列首尾下標,然後向中間夾擠,遇到有解就停下來。
3.第二種方法有些取巧,因為題目限制了陣列元素不超過500,所以可以設定一個isIN陣列來存不同面值硬幣數量,然後對陣列走一遍迴圈,每次判斷M-c[i]是否在數組裡面,要注意可能二者值相同,要減掉一個。
兩種程式碼如下

//two pointers
#include <stdio.h>
#include <algorithm>
using namespace
std; int main(int argc, char const *argv[]) { int n,m; scanf("%d%d",&n,&m); int c[n]; for(int i=0;i<n;i++){ scanf("%d",&c[i]); } sort(c,c+n); int flag = 0; int i = 0,j = n-1; while(i<j){ if(c[i]+c[j] = m){ printf("%d %d",c[i],c[j]); flag = 1; break; } else
if(c[i]+c[j]<m)i++; else j--; } if(flag==0)printf("No Solution" ); return 0; }
//雜湊思想
#include <stdio.h>
#include <algorithm>
using namespace std;

int isIN[10010] = {0};//統計各種面值硬幣個數

int main(int argc, char const *argv[])
{
	int n,m;
	scanf("%d%d",&n,&m);
	int c[n];		
	for(int
i=0;i<n;i++){ scanf("%d",&c[i]); isIN[c[i]]++; //統計個數 } sort(c,c+n); int flag = 0; for(int i=0;i<n;i++){ int temp = m-c[i]; if(temp == c[i])isIN[temp]--;//剛好另一個跟c[i]等值,剩下的裡面temp要減一 if(isIN[temp]){ printf("%d %d",c[i],temp); flag = 1; break; } } if(flag==0)printf("No Solution" ); return 0; }