By Jalan
题干
精神小妹喜欢收集硬币,有天见到一个商店可以用硬币买东西(???黑人问号,不是收集来着吗?)
每单只能使用2个硬币需要精确的对应支付的钱数(不多不少),她有10^5个硬币,对于某单的价格她能否找到2个硬币去支付.
输入条件
第一行2个数,一个是硬币总数N[0,10^ 5],一个是需要付款的钱数M[0,10^ 3]
第二行有N个数是每个硬币的价值([0,500])
输出条件
每行升序排列硬币的价值,不唯一输出最小的第一个硬币的那一对,没有输出No Solution
题解
第一次
思路
排序一下然后去二分答案
预期时间复杂度
nlogn
编写用时
20分钟
代码
CPP
#include <cstdio>
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
int main(int argc, char const *argv[])
{
int N,M;
scanf("%d %d",&N,&M);
vector<int> coins;
coins.reserve(N+5);
for (int i = 0,temp; i < N; i++)
{
scanf("%d",&temp);
coins.push_back(temp);
}
sort(coins.begin(),coins.end());
for (int i = 0; i < N; i++)
{
if (coins[i]>M)
{
break;
}
int left=i+1,right=N;
int mid;
while (left<right)
{
mid=(left+right)/2;
if(coins[mid]+coins[i]>M)
{
right=mid;
}else if (coins[mid]+coins[i]==M)
{
printf("%d %d", coins[i], coins[mid]);
return 0;
}
else
{
left=mid+1;
}
}
}
//ouput
printf("No Solution");
return 0;
}
运行用时
第二次
思路
硬币才一共500种价值,建个数组存着一个一个试…
预期时间复杂度
n
编写用时
10分钟
代码
CPP
为什么说了硬币价值小于500还是要用一个大于1000的数组呢?
后面有个M-i在,M的范围是[0,1000],因此要后面补段错这个数组必须要大于1000;
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
#define X 1005
int main(int argc, char const *argv[])
{
//input
int N,M;
scanf("%d %d",&N,&M);
vector<int> coins;
coins.resize(X);
for (int i = 0; i < X; i++)
{
coins[i]=0;
}
int temp;
for (int i = 0; i < N; i++)
{
scanf("%d",&temp);
coins[temp]++;
}
for (int i = 0; i <= 500; i++)
{
if (coins[i])
{
coins[i]--;
if (M>i&&coins[M-i])
{
printf("%d %d",i,M-i);
return 0;
}
}
}
printf("No Solution");
return 0;
}
运行用时
结尾
看在我写了这么多注释的份上可以给我点个赞嘛,求求惹=]砰砰砰,给我加点写下去的油呀@.@