C++基础算法-冒泡排序,二分查表

二分查表

给定一个数组,先进行排序,然后给定一个数,利用二分法查找该数是否在数组中

#include <iostream>
#include <cstdio>
using namespace std;

int data[] = {
    
    21,43,566,89,10,9,55,22};
int size = sizeof(data)/sizeof(data[0]);
void sorder(int *p)
{
    
    
	int t,temp;
	int i,j;
	for(i = 0; i < size; i++)
	{
    
    
		t = i;
		for(j = i + 1; j < size; j++)
		{
    
    
			if(p[j] <= p[t])
			{
    
    
				t = j;
			}
		}
		temp = p[i];
		p[i] = p[t];
		p[t] = temp;
		
	}	
}
void dorder(int *p)
{
    
    
	int t,temp;
	int i,j;
	for(i = 0; i < size; i++)
	{
    
    
		t = i;
		for(j = i + 1; j < size; j++)
		{
    
    
			if(p[j] >= p[t])
			{
    
    
				t = j;
			}
		}
		temp = p[i];
		p[i] = p[t];
		p[t] = temp;
		
	}	
}
int com(int dtype,int num,int *p)//dtype=1就选取sorder,否则用dorder
{
    
    
	int count = 0;
	int left = 0;
	int right = size - 1;
	
	int i;
	if(dtype == 1)
	{
    
    
		sorder(p);
		while(left <= right)
		{
    
    
			int mid = (left + right)/2;
			count++;
			if(p[mid] == num)
			{
    
    
				return count;
			}
			else if(p[mid] > num)
			{
    
    
				right = mid - 1;;
			}
			else
			{
    
    
				left = mid + 1;
			}
			
		}
		return -1;
	}
	else
	{
    
    
		dorder(p);
		while(left <= right)
		{
    
    
			int mid = (left + right)/2;
			count++;
			if(p[mid] == num)
			{
    
    
				return count;
				
			}
			else if(p[mid] > num)
			{
    
    
				left = mid + 1;
			}
			else
			{
    
    
				right = mid - 1;
			}
			
		}
		return -1;
	}
	
 } 
int main()
{
    
    
	
	cout << com(2,9,data) << endl;
	return 0;
}

抢红包

#include <iostream>
#include <time.h>
#include <cstdlib>
using namespace std;

int main()
{
    
    
    int people,i,best = 0;
    double money,j = 0;
    cout << "the money:";
    cin >> money;
    cout << "the people:";
    cin >> people;
    float a[100];//最多100个人,得到100个人对应随机数
    float b[100];//存储每个人得到的钱
    float suma = 0;
    
    for(i = 0; i < people; i++)
    {
    
    
        a[i] = rand()%100;
        suma += a[i];
    }
    for(i = 0;i < people; i++)
    {
    
    
        b[i] = a[i]*money/suma;
        if (j <= b[i])
        {
    
    
            j = b[i];
            best = i;//手气最佳
        }
    }
    for(i = 0;i < people; i++)
    {
    
    
        printf("第%d个人得到%.2f钱:",i,b[i]);
        if (best == i)
        {
    
    
            cout << "(手气最佳)" << endl;
        }
        else
        {
    
    
            cout << endl;
        }
    }
    return 0;


}

描点问题

给一个集合有N个点,每一个点的坐标是是 a i a_i ai,标记其中一些点,使得该点周围 ( − R + a i , R + a i ) (-R+a_i,R+a_i) (R+ai,R+ai)内没其他的标记点,确定需要标记多少个点。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
using namespace std;

int main()
{
    
    
	int a[10] = {
    
    10,3,5,100,30,40,89,21,44,55};
	int i;
	sort(a,a + 10);
	for(i = 0; i < 10; i++)
	{
    
    
		cout << a[i] << endl;
	}
	int R = 25;
	vector<int> an;
	i = 0;
	while(i < 10)
	{
    
    
		int s = a[i];
		while(a[i] <= s + R && i < 10)
		{
    
    
			i++;
		}
		int p = a[i - 1];
		an.push_back(p);
		while(a[i] <= p + R && i < 10)
		{
    
    
			i++;
		}
	}
	int size = an.size();
	cout << size << endl;
	for(i = 0; i < size; i++)
	{
    
    
		cout << an[i] << endl;
	}
	
	return 0;
}

哈希表检查字母异位词

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

bool check(string a,string b,int size)
{
    
    
	int record[26] = {
    
    0};
	for(int i = 0; i < size; i++)
	{
    
    
		record[a[i] - 'a']++;
	}
	for(int j = 0; j < size; j++)
	{
    
    
		record[b[j] - 'a']--;
	}
	for(int k = 0; k < 26; k++)
	{
    
    
		if(record[k] != 0)
		{
    
    
			return false;
		}
	}
	return true;
}
int main()
{
    
    
	int size = 8;
	string a = "xiaogua";
	string b = "guanxia";
	bool out = check(a,b,size);
	cout << out << endl;
	return 0;
}

背包问题

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
using namespace std;

const int size = 8;
const int W[size] = {
    
    11,2,33,44,5,8,20,22};//重量
const int V[size] = {
    
    11,2,33,44,5,8,20,22};//价值

int rec(int i,int j)
{
    
    
	int res;
	if(i == size - 1)
	{
    
    
		res = 0;//表示挑选到最后一个物品
	}
	else if(j < W[i])//第i个物品太重,不能选
	{
    
    
		res = rec(i + 1,j);
	}
	else//第i个物品是否选取
	{
    
    
		res = max(rec(i + 1,j),rec(i + 1,j - W[i]) + V[i]);
		
	}
	return res;
}
int main()
{
    
    
	cout << rec(0,60) << endl;
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/forrestguang/article/details/120432097