目录
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;
}