二分查表
给定一个数组,先进行排序,然后给定一个数,利用二分法查找该数是否在数组中;
#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;
}