题目
你有n个硬币,n在105之内;然后给出这n个硬币的面值;
问能否用这n个硬币中的两个组成总价值m;若有多组解,m=a+b,输出a尽量小的。
I/O
Sample Input 1:
8 15
1 2 8 7 2 4 11 15
Sample Output 1:
4 11
Sample Input 2:
7 14
1 8 7 2 4 11 15
Sample Output 2:
No Solution
算法
维护coin状态数组。
Coin数组表示面值为i的硬币的状态,coin[i]表示面值为i的硬币的格个数。
线性时间复杂度内,对coin进行一次遍历就可以求出解。
代码
#include <cstdio>
#include <cstring>
int main()
{ int n, m;
scanf("%d%d",&n, &m);
int coin[100010];
memset(coin, 0, sizeof(coin));
int flag = 0;
while(n--)
{ int a;
scanf("%d", &a);
coin[a]++;
}
int i;
for(i = 1; i<=m/2; i++)
{ coin[i]--;
coin[m-i]--;
if(coin[i]>=0 && coin[m-i]>=0)
{ flag = 1; break;
}
}
if(flag) printf("%d %d",i, m-i);
else printf("No Solution");
return 0;
}