zoukankan      html  css  js  c++  java
  • A1048 Find Coins [散列、二分、two pointers]

    在这里插入图片描述
    题目大意:找出两个数相加刚好为所给的数
    思想:散列
    注意事项:注意不可以是一个数字在同一个位置,但可以是两个相同的数字在不同位置相加。

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<string>
    using namespace std;
    int main()
    {
    	int hashtable[1001] = { 0 };
    	int n, m, a;
    	cin >> n >> m;
    	for (int i = 0; i < n; i++)
    	{
    		cin >> a;
    		hashtable[a]++;
    	}
    	for (int i = 1; i < m; i++)
    	{
    		if (hashtable[i] && hashtable[m - i])
    		{
    			if (i == m - i&&hashtable[i]==1) 
    			{
    				continue;
    			}
    			cout << i << " " << m - i << endl;
    			return 0;
    		}
    	}
    	cout << "No Solution" << endl;
    	return 0;
    }
    

    思想:二分 一个解题思路

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<string>
    using namespace std;
    int a[100001] = { 0 };
    int bin(int left, int right, int key)
    {
    	int mid;
    	while (left <= right)
    	{
    		mid = (left + right) / 2;
    		if (a[mid] == key) return mid;
    		else if (a[mid] > key) right = mid - 1;
    		else  left = mid+1;
    	}
    	return -1;
    }
    int main()
    {
    	int n, m;
    	cin >> n >> m;
    	for (int i = 0; i < n; i++)
    	{
    		cin >> a[i];
    	}
    	sort(a, a + n);
    	int i;
    	for (i = 0; i < n; i++)
    	{
    		int pos=bin(i, n - 1, m-a[i]);
    		if (pos != -1 && i != pos)
    		{
    			cout << a[i] << " " << a[pos] << endl;
    			break;
    		}
    	}
    	if (i == n)
    	{
    		cout << "No Solution" << endl;
    	}
    }
    

    two pointers:

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<string>
    #include<time.h>
    using namespace std;
    const int maxn = 1000001; 
    long long int a[maxn], b[maxn], c[maxn];
    int main()
    {
    	int n, m;
    	cin >> n >> m;
    	for (int i = 0; i < n; i++)
    	{
    		cin >> a[i];
    	}
    	sort(a, a + n);
    	int i = 0, j = n - 1;
    	while (i < j)
    	{
    		if (a[i] + a[j] < m)
    			i++;
    		else if (a[i] + a[j] > m)
    			j--;
    		else
    			break;
    	}
    	if (i != j)
    		cout << a[i] << " " << a[j] << endl;
    	else
    		cout << "No Solution" << endl;
    }
    
    
    
  • 相关阅读:
    常用linux命令
    console页面进去太慢优化
    CentOS7 查看最大线程连接数
    外部ssh连接Ubuntu系统
    Ubantu 防火墙管理
    oracle 闪回
    oracle用户密码过期
    base64编码原理
    Linux 备份数据库mysql
    python静态方法-类方法
  • 原文地址:https://www.cnblogs.com/Hsiung123/p/13812074.html
Copyright © 2011-2022 走看看