A1048 Find Coins
阿新 • • 發佈:2018-12-02
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;
}