《算法笔记学习》2021-01-23

学习目标:

《算法笔记》第四章

学习内容:

4.3 简单递归
4.4 简单贪心
4.5 简单二分(4.5.1)

学习时间:

2021-1-23 14.00-22.30

学习产出:

P112

#include<stdio.h>
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; 
}

P113

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

P115

#include<stdio.h>
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 x=1;x<=n;x++){
		if(hashTable[x]==false){
			P[index]=x;
			hashTable[x]=true;
			generateP(index+1);
			hashTable[x]=false;
		}
	}
}
int main(){
	n=4;
	generateP(1);
	return 0;
}

P116

#include<stdio.h>
#include<stdlib.h>
int count=0;
const int maxn=10;
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(){
	scanf("%d",&n);
	generateP(1);
	printf("%d",count);
	return 0;
}

P117

#include<stdio.h>
#include<stdlib.h>
int count=0;
const int maxn=10;
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){
			bool 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(){
	scanf("%d",&n);
	generateP(1);
	printf("%d",count);
	return 0;
}

P120

#include<stdio.h>
#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",ans);
	return 0;
}

P121

#include<stdio.h>
int main(){
	int count[10];
	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<stdio.h>
#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<stdio.h>
int binarySearch(int A[],int left,int right,int x){
	int mid;
	while(left<=right){
		mid=(left+right)/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\n",binarySearch(A,0,n-1,6),binarySearch(A,0,n-1,9));
	return 0;
}

P128

#include<stdio.h>
int lower_bound(int A[],int left,int right,int x){//第一个大于大于x的数
	int mid;
	while(left<right){
		mid=(left+right)/2;
		if(A[mid]>=x){
			right=mid;
		}else{
			left=mid+1;
		}
	}
	return left;//此时left==right
}
int upper_bound(int A[],int left,int right,int x){//第一个大于大于x的数
	int mid;
	while(left<right){
		mid=(left+right)/2;
		if(A[mid]>x){
			right=mid;
		}else{
			left=mid+1;
		}
	}
	return left;//此时left==right
}
int main(){
	int p=8;//p为要查询的数
	const int n=5;
	int A[n]={1,3,3,3,6};//案例为P127
	printf("%d %d",lower_bound(A,0,n,p),upper_bound(A,0,n,p));
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值