Day 27 算法笔记之算法初步4.7 其他高效算法和技巧

目录

1.有几个pat

2.随机选择算法

3.快速排序


1.有几个pat

细节依旧细节

#include <cstdio>
#include <cctype>
#include <cstring>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;

const int maxn = 10010;
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;
} 

2.随机选择算法

#include <cstdio>
#include <cctype>
#include <cstring>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <sys/time.h>
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(k==m) return;
	if(k<m){
		randselect(a,left,p-1,k);
	}else{
		randselect(a,p+1,right,k-m);
	}
}

int main(){
	srand((unsigned)time(NULL));
	int sums = 0,sum1=0;
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%d",&a[i]);
		sums+=a[i];
	}
	randselect(a,0,n-1,n/2);
	for(int i=0;i<n/2;i++){
		sum1+=a[i];
	}
	printf("%d\n",(sums-sum1)-sum1);
	return 0;
} 

3.快速排序

感觉和递推有点像

#include <cstdio>
#include <cctype>
#include <cstring>
#include <math.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <sys/time.h>
using namespace std;

int main(){
	
	int n;
	scanf("%d",&n);
	
	int martix[1000];
	for(int i=0;i<n;i++){
		scanf("%d",&martix[i]);
	}
	
	int leftmax[100]={0};
	for(int i=1;i<n;i++){
		leftmax[i] = max(leftmax[i-1],martix[i-1]);
	}
	
	int rightmin[100];
	rightmin[n-1] = 10000000;
	for(int i=n-2;i>=0;i--){
		rightmin[i] = min(rightmin[i+1],martix[i+1]);
	}
	
	int ans[100]={0},num=0;
	for(int i=0;i<n;i++){
		if(leftmax[i]<martix[i]&&rightmin[i]>martix[i]){
			ans[num++] = martix[i];
		}
	}
	
	printf("%d\n",num);
	for(int i=0;i<num;i++){
		printf("%d",ans[i]);
		if(i<num-1) printf(" ");
	}
	
	printf("\n");
	
	
	
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/aixiaoxiao13/article/details/120833375