《算法笔记》第四章源代码

P99

#include<iostream>
using namespace std;
const int n = 8;
int a[n] = {8,7,6,5,4,3,2,1};
void selectSort();
int main(){
	selectSort();
	for(int i = 0; i < n; i++){
		printf("%d ",a[i]);
	}
	return 0;
}
void selectSort(){
	for(int i = 0; i < n; i++){
		int k = i;
		for(int j = i; j < n; j++){
			if(a[j] < a[k]){
				k = j;
			}
		}
		int temp = a[k];
		a[k] = a[i];
		a[i] = temp;
	}
}

P101

#include<iostream>
using namespace std;
const int n = 8;
int a[n] = {8,7,6,5,4,3,2,1};
void insertSort();
int main(){
	insertSort();
	for(int i = 0; i < n; i++){
		printf("%d ",a[i]);
	}
	return 0;
}
void insertSort(){
	for(int i = 1; i < n; i++){
		int j = i,temp = a[j];
		while(j > 0 && temp < a[j-1]){
			a[j] = a[j-1];
			j--;
		}
		a[j] = temp;
	}
}

P105

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct Student {
	char id[15];
	int score;
	int location_number;
	int local_rank;
}stu[30010];
bool cmp(Student a, Student b){
	if(a.score != b.score){
		return a.score > b.score;
	}else{
		return a.id < b.id;
	}
}
int main(){
	int n,k,num = 0;
	scanf("%d",&n);
	for(int i = 1; i <= n; i++){
		scanf("%d",&k);
		for(int j = 0; j < k; j++){
			scanf("%s %d",stu[num].id,&stu[num].score);
			stu[num].location_number = i;
			num++;
		}
		sort(stu + num - k, stu + num, cmp);
		stu[num - k].local_rank = 1;							//第一种排名法
		for(int j = num - k + 1; j < num; j++){					//
			if(stu[j].score == stu[j - 1].score){				//
				stu[j].local_rank = stu[j - 1].local_rank;		//
			}else{												//
				stu[j].local_rank = j + 1 - (num - k);			//
			}													//
		}
	}
	sort(stu, stu + num, cmp);
	printf("%d\n",num);
	int r = 1;													//第二种排名法
	for(int i = 0; i < num; i++){								//
		if(i > 0 && stu[i].score != stu[i - 1].score){			//
			r = i + 1;											//
		}														//
		printf("%s %d %d %d\n",stu[i].id,r,stu[i].location_number,stu[i].local_rank);
	}	
	return 0;
}

P107(1)

#include<iostream>
using namespace std;
const int maxn = 10010;
bool hashTable[maxn] = {false};
int main(){
	int n,m,x;
	scanf("%d %d",&n,&m);
	for(int i = 0; i < n; i++){
		scanf("%d",&x);
		hashTable[x] = true;
	}
	for(int i = 0; i < m; i++){
		scanf("%d",&x);
		if(hashTable[x] == true){
			printf("YES\n");
		}else{
			printf("NO\n");
		}
	}
	return 0;
}

P107(2)

#include<iostream>
using namespace std;
const int maxn = 10010;
int hashTable[maxn] = {0};
int main(){
	int n,m,x;
	scanf("%d %d",&n,&m);
	for(int i = 0; i < n; i++){
		scanf("%d",&x);
		hashTable[x]++;
	}
	for(int i = 0; i < m; i++){
		scanf("%d",&x);
		printf("%d\n",hashTable[x]);
	}
	return 0;
}

P110

#include<iostream>
using namespace std;
const int maxn = 100;
char S[maxn][5], temp[5];
int hashTable[26 * 26 * 26 + 10] = {0};
int hashFunc(char S[], int len){
	int id = 0;
	for(int i = 0; i < len; i++){
		id = id * 26 + (S[i] - 'A');
	}
	return id;
}
int main(){
	int n,m;
	scanf("%d %d",&n,&m);
	for(int i = 0; i < n; i++){
		scanf("%s",S[i]);
		int id = hashFunc(S[i], 3);
		hashTable[id]++;
	}
	for(int i = 0; i < m; i++){
		scanf("%s",temp);
		int id = hashFunc(temp, 3);
		printf("%d",hashTable[id]);
	}
	return 0;
}

P112

#include<iostream>
using namespace std;
int F(int n){
	if(n == 0){
		return 1;
	}else{
		return F(n-1)*n;
	}
}
int main(){
	int n;
	scanf("%d",&n);
	printf("%d",F(n));
	return 0;
}

P114

#include<iostream>
using namespace std;
int F(int n){
	if(n == 0 || n==1){
		return 1;
	}else{
		return F(n-2) + F(n-1);
	}
}
int main(){
	int n;
	scanf("%d",&n);
	printf("%d",F(n));
	return 0;
}

P115

#include<iostream>
using namespace std;
const int maxn = 11;
int n,P[maxn],hashTable[maxn] = {false};
void generateP(int index){
	if(index == n + 1){
		for(int i = 1; i <= n; i++){
			printf("%d ",P[i]);
		}
		printf("\n");
		return;
	}
	for(int i = 1; i <= n; i++){
		if(hashTable[i] == false){
			P[index] = i;
			hashTable[i] = true;
			generateP(index + 1);
			hashTable[i] = false;
		}
	}
}
int main(){
	n = 3;
	generateP(1);
	return 0;
}

P116

#include<iostream>
#include<math.h>
using namespace std;
int count = 0;
const int maxn = 11;
int n,P[maxn],hashTable[maxn] = {false};
void generateP(int index){
	if(index == n + 1){
		bool flag = true;
		for(int i = 1; i <= n; i++){
			for(int j = i + 1; j <= n; j++){
				if(abs(i - j) == abs(P[i] - P[j])){
					flag = false;
				}
			}		
		}
		if(flag){
			count++;
		}
		return;
	}
	for(int x = 1; x <= n; x++){
		if(hashTable[x] == false){
			P[index] = x;
			hashTable[x] = true;
			generateP(index + 1);
			hashTable[x] = false;
		}
	}
}
int main(){
	n = 8;//n皇后问题 此时 n = 8
	generateP(1);
	printf("%d",count);
	return 0;
}

P117

#include<iostream>
#include<math.h>
using namespace std;
int count = 0;
const int maxn = 11;
int n,P[maxn],hashTable[maxn] = {false};
void generateP(int index){
	if(index == n + 1){
		count++;
		return;
	}
	for(int x = 1; x <= n; x++){
		if(hashTable[x] == false){
			int flag = true;
			for(int pre = 1; pre < index; pre++){
				if(abs(pre - index) == abs(P[pre] - x)){
					flag = false;
					break;
				}
			}
			if(flag){
				P[index] = x;
				hashTable[x] = true;
				generateP(index + 1);
				hashTable[x] = false;
			}
		}
	}
}
int main(){
	n = 8;
	generateP(1);
	printf("%d",count);
	return 0;
}

P120

#include<iostream>
#include<algorithm>
using namespace std;
struct mooncake{
	double store;
	double sell;
	double price;
}cake[1010];
bool cmp(mooncake a, mooncake b){
	return a.price>b.price;
}
int main(){
	int n;
	double D;
	scanf("%d %lf",&n,&D);
	for(int i = 0; i < n; i++){
		scanf("%lf",&cake[i].store);
	}
	for(int i = 0; i < n; i++){
		scanf("%lf",&cake[i].sell);
		cake[i].price = cake[i].sell / cake[i].store ;
	}
	sort(cake, cake + n, cmp);
	double ans = 0;
	for(int i = 0; i < n; i++){
		if(cake[i].store <= D){
			D -= cake[i].store;
			ans += cake[i].sell;
		}else{
			ans += D * cake[i].price;
			break;
		}
	}
	printf("%.2f\n",ans);
	return 0;
}

P121

#include<iostream>
using namespace std;
int main(){
	int count[10];Y
	for(int i = 0; i < 10; i++){
		scanf("%d",&count[i]);
	}
	for(int i = 1; i < 10; i++){
		if(count[i] > 0){
			printf("%d",i);
			count[i]--;
			break;
		}
	}
	for(int i = 0; i < 10; i++){
		for(int j = 0; j < count[i]; j++){
			printf("%d",i);
		}
	}
	return 0;
}

P122

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 110;
struct Inteval{
	int x,y;
}I[maxn];
bool cmp(Inteval a, Inteval b){
	if(a.x != b.x){
		return a.x > b.x;
	}else{
		return a.y < b.y;
	}
}
int main(){
	int n;
	while(scanf("%d",&n), n != 0){
		for(int i = 0; i < n; i++){
			scanf("%d %d",&I[i].x,&I[i].y);
		}
		sort(I, I + n, cmp);
		int ans = 1, lastX = I[0].x;
		for(int i = 1; i < n; i++){
			if(I[i].y <= lastX){
				ans++;
				lastX = I[i].x;
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

P126(递归)

#include<iostream>
using namespace std;
int binarySearch(int A[], int left, int right, int x){
	if(left <= right){
		int mid = (right + left) / 2;
		if(x == A[mid]){
			return mid;
		}else if(x < A[mid]){
			return binarySearch(A, left, mid - 1, x);
		}else{
			return binarySearch(A, mid + 1, right, x);
		}
	}else{
		return -1;
	}
}
int main(){
	const int n = 10;
	int A[n] = {1, 3, 4, 6, 7, 8, 10, 11, 12, 15};
	printf("%d %d",binarySearch(A, 0, n - 1, 6),binarySearch(A, 0, n - 1, 9));
	return 0;
}

P126

#include<iostream>
using namespace std;
int binarySearch(int A[], int left, int right, int x){
	int mid;
	while(left <= right){
		mid = left + (right - left) / 2;
		if(A[mid] == x){
			return mid;
		}else if(A[mid] > x){
			right = mid - 1;
		}else{
			left = mid + 1;
		}
	}
	return -1;
}
int main(){
	const int n = 10;
	int A[n] = {1, 3, 4, 6, 7, 8, 10, 11, 12, 15};
	printf("%d %d",binarySearch(A, 0, n - 1, 6),binarySearch(A, 0, n - 1, 9));
	return 0;
}

P128~129

#include<iostream>
using namespace std;
int lower_bound(int A[], int left, int right, int x){
	int mid;
	while(left < right){
		mid = left + (right - left) / 2;
		if(A[mid] >= x){
			right = mid;
		}else{
			left = mid + 1;
		}
	}
	return left;
}
int upper_bound(int A[], int left, int right, int x){
	int mid;
	while(left < right){
		mid = left + (right - left) / 2;
		if(A[mid] > x){
			right = mid;
		}else{
			left = mid + 1;
		}
	}
	return left;
}
int main(){
	const int n = 5;
	int A[n] = {1, 3, 3, 3, 6};
	printf("%d %d",lower_bound(A, 0, n, 3),upper_bound(A, 0, n, 3));//以3为例
	return 0;
}

P131

#include<iostream>
#include<math.h>
using namespace std;
const double eps = 1e-5;
double f(double x){
	return x * x;
}
double calSqrt(){
	double left = 1 , right = 2 , mid;
	while(right - left > eps){
		mid = (right - left) / 2 + left;
		if(f(mid) > 2){
			right = mid;
		}else{
			left = mid;		
		}
	}
	return mid;
}
int main(){	
	printf("%lf",calSqrt());
	return 0;
}

p133

#include<iostream>
#include<math.h>
using namespace std;
const double eps = 1e-5;
const double PI = acos(-1.0);
double f(double R, double h){
	double alpha = 2 * acos((R - h) / R);
	double L = 2 * sqrt(R * R - (R - h) * (R - h));
	double S2 = PI * R * R / 2;
	double S1 = alpha * R * R / 2 - (R - h) * L / 2;
	return S1 / S2;
}
double solve(double R, double r){
	double left = 0, right = R, mid;
	while(right - left > eps){
		mid = (left + right) / 2;
		if(f(R,mid) > r){
			right = mid;
		}else{
			left = mid;
		}
	}
	return mid;
}
int main(){
	double R, r;
	scanf("%lf %lf", &R, &r);
	printf("%lf",solve(R,r));
	return 0;
}

P135


P138

#include<iostream>
using namespace std;
int a[6] = {1, 2, 3, 4, 5, 6};
int M = 8;
int main(){
	int ans = 0, i = 0, j = 5;
	while(i < j){
		if(a[i] + a[j] == M){
			ans++;
			printf("%d %d %d\n", a[i], a[j], ans);
			i++;
			j--;
		}else if(a[i] + a[j] < M){
			i++;
		}else{
			j--;
		}
	}
	printf("%d",ans);
	return 0;
}

P139

#include<iostream>
using namespace std;
int A[5] = {1, 3, 5, 7, 8}, B[5] = {2, 4, 6, 9, 10}, C[10000];
int merge(int A[], int B[], int C[],int m,int n){
	int i = 0, j = 0, index = 0;
	while(i < n && j < m){
		if(A[i] <= B[j]){
			C[index++] = A[i++];
		}else{
			C[index++] = B[j++];
		}
	}
	while(i < n){
		C[index++] = A[i++];
	}
	while(j < m){
		C[index++] = B[j++];
	}
	return index;
}
int main(){
	int max = merge(A, B, C, 5, 5);
	for(int i = 0; i < max; i++){
		printf("%d ",C[i]);
	}
	return 0;
}

P140

#include<stdio.h>
#include<algorithm>
using namespace std;
int a[10]={10,9,8,7,6,5,4,3,2,1};
void merge(int a[],int l1,int r1,int l2,int r2){//将两个相邻的段按顺序合成一个新的段
	int i=l1,j=l2,num=0;
	int temp[1000];
	while(i<=r1&&j<=r2){
		if(a[i]<=a[j]){
			temp[num++]=a[i++];
		}else{
			temp[num++]=a[j++];
		}
	}
	while(i<=r1){
		temp[num++]=a[i++];
	}
	while(j<=r2){
		temp[num++]=a[j++];
	}
	for(int i=0;i<num;i++){
		a[l1++]=temp[i];
	}
}
void select(int a[],int l,int r){
	if(l<r){
		int mid=(l+r)/2;
		select(a,l,mid);
		select(a,mid+1,r);
		merge(a,l,mid,mid+1,r);
	}
}
int main(){
	select(a,0,9);
	for(int i=0;i<10;i++){
		printf("%d  ",a[i]);
	}
	return 0;
}

P141

#include<stdio.h>
#include<algorithm>
using namespace std;
int a[10]={10,9,8,7,6,5,4,3,2,1};
void merge(int a[],int l1,int r1,int l2,int r2){//将两个相邻的段按顺序合成一个新的段
	int i=l1,j=l2,num=0;
	int temp[1000];
	while(i<=r1&&j<=r2){
		if(a[i]<=a[j]){
			temp[num++]=a[i++];
		}else{
			temp[num++]=a[j++];
		}
	}
	while(i<=r1){
		temp[num++]=a[i++];
	}
	while(j<=r2){
		temp[num++]=a[j++];
	}
	for(int i=0;i<num;i++){
		a[l1++]=temp[i];
	}
}
void select(int a[],int n){
	for(int step=2;step/2<=n;step*=2){//左边一半元素大于n时即可退出
		for(int j=0;j<n;j+=step){
			int mid=j+step/2-1;//j到mid有step/2个元素
			if(mid+1<=n){
				int k=0;
				if(n<j+step-1){//寻找此时两个段的最右元素 因为在处理最右边的两个段时 右半<=左半
					k=n;
				}else{
					k=j+step-1;
				}
				merge(a,j,mid,mid+1,k);//两个段有序合并
			}
		}
	}
}
int main(){
	select(a,9);//从0开始操作故为9
	for(int i=0;i<10;i++){
		printf("%d  ",a[i]);
	}
	return 0;
}

P143

#include<stdio.h>
int a[10]={10,9,8,7,6,5,4,3,2,1};
int part(int a[],int l,int r){
	int temp=a[l];
	while(l<r){
		while(a[r]>temp&&l<r){
			r--;
		}
		a[l]=a[r];
		while(a[l]<=temp&&l<r){
			l++;
		}
		a[r]=a[l];
	}
	a[l]=temp;
	return l;
}
void quicksort(int a[],int l,int r){
	if(l<r){
		int pos=part(a,l,r);
		quicksort(a,l,pos-1);
		quicksort(a,pos+1,r);
	}		
}
int main(){
	quicksort(a,0,9);
	for(int i=0;i<10;i++){
		printf("%d   ",a[i]);
	}
	return 0;
}

P144

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
	srand((unsigned)time(NULL));
	for(int i=0;i<7;i++){
		printf("%d  ",rand());
	}
	return 0;
}

P145(1)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
	srand((unsigned)time(NULL));
	int a,b;
	scanf("%d %d",&a,&b);
	for(int i=0;i<7;i++){
		printf("%d  ",rand()%(b-a+1)+a);
	}
	return 0;
}

P145(2)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>

int main(){
	srand((unsigned)time(NULL));
	int a,b;
	scanf("%d %d",&a,&b);
	for(int i=0;i<7;i++){
		printf("%d  ",(int)(round(1.0*rand()/RAND_MAX*(b-a)))+a);//round为四舍五入函数 
	}
	return 0;
}

P146

#include<iostream>
#include<time.h>
#include<math.h>
using namespace std;
int a[10]={10,9,8,7,6,5,4,3,2,1};
int part(int a[],int l,int r){
	int p=(round(1.0*rand()/RAND_MAX*(r-l)+l));
	swap(a[l],a[p]);
	int temp=a[l];
	while(l<r){
		while(a[r]>temp&&l<r){
			r--;
		}
		a[l]=a[r];
		while(a[l]<=temp&&l<r){
			l++;
		}
		a[r]=a[l];
	}
	a[l]=temp;
	return l;
}
void quicksort(int a[],int l,int r){
	if(l<r){
		int pos=part(a,l,r);
		quicksort(a,l,pos-1);
		quicksort(a,pos+1,r);
	}		
}
int main(){
	srand((unsigned)time(NULL));
	quicksort(a,0,9);
	for(int i=0;i<10;i++){
		printf("%d   ",a[i]);
	}
	return 0;
}

P148

#include<iostream>
#include<string.h>
using namespace std;
const int MAXN = 100010;
const int MOD = 1000000007;
char str[MAXN];
int leftNumP[MAXN] = {0};
int main(){
	gets(str);
	int len = strlen(str);
	for(int i = 0; i < len; i++){
		if(i > 0){
			leftNumP[i] = leftNumP[i - 1];
		}
		if(str[i] == 'P'){
			leftNumP[i]++;
		}
	}
	int ans = 0, rightNumT = 0;
	for(int i = len - 1; i >= 0; i--){
		if(str[i] == 'T'){
			rightNumT++;
		}else if(str[i] == 'A'){
			ans = (ans + leftNumP[i] * rightNumT) % MOD;
		}		
	}
	printf("%d\n",ans);
	return 0;
}

P149

#include<iostream>
#include<time.h>
#include<math.h>
using namespace std;
int randPartition(int A[],int left,int right){
	int p=(round(1.0*rand()/RAND_MAX*(right-left)+left));
	swap(A[p],A[left]);
	int temp=A[left];
	while(left<right){
		while(left<right&&A[right]>temp){
			right--;
		}
		A[left]=A[right];
		while(left<right&&A[left]<temp){
			left++;
		}
		A[right]=A[left];
	}
	A[left]=temp;
	return left;
}
int randSelect(int A[],int left,int right,int K){
	if(left==right){
		return A[left];
	}
	int p=randPartition(A,left,right);
	int M=p-left+1;
	if(M==K){
		return A[p];
	}else if(K<M){
		return randSelect(A,left,p-1,K);
	}else{
		return randSelect(A,p+1,right,K-M);
	}
}
int main(){
	int A[10]={5,6,8,7,9,3,1,2,4,0};
	int x=10;//查找在A数列中第x大的数  x=1 输出0 x=2 输出1 x=10 输出9
	printf("%d",randSelect(A,0,9,x));
	
	return 0;
}       

P150

#include<cstdio>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=100010;
int A[maxn],n;
int randPartition(int A[],int left,int right){
	int p=(round(1.0*rand()/RAND_MAX*(right-left)+left));
	swap(A[p],A[left]);
	int temp=A[left];
	while(left<right){
		while(left<right&&A[right]>temp){
			right--;
		}
		A[left]=A[right];
		while(left<right&&A[left]<temp){
			left++;
		}
		A[right]=A[left];
	}
	A[left]=temp;
	return left;
}
void randSelect(int A[],int left,int right,int K){
	if(left==right){
		return;
	}
	int p=randPartition(A,left,right);
	int M=p-left+1;
	if(M==K){
		return;
	}else if(K<M){
		randSelect(A,left,p-1,K);
	}else{
		randSelect(A,p+1,right,K-M);
	}
}
int main(){
	srand((unsigned)time(NULL));
	int sum=0,sum1=0;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&A[i]);
		sum+=A[i];
	}
	randSelect(A,0,n-1,n/2);
	for(int i=0;i<n/2;i++){
		sum1+=A[i];
	}
	printf("%d",(sum-sum1)-sum1);	
	return 0;
}    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值