学习目标:
《算法笔记》第四章
学习内容:
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;
}