蓝桥杯训练 | 枚举,模拟与排序 | 04

连号区间数

#include<bits/stdc++.h>
using namespace std;

const int N = 1e4+10,INF=1<<30;
int q[N];
int res;

int main(){
	int n;
	cin >> n;
	for(int i=0;i<n;i++)cin>>q[i];
	for(int i=0;i<n;i++){
		int maxv=-INF,minv=INF;
		for(int j=i;j<n;j++){
			maxv=max(maxv,q[j]);
			minv=min(minv,q[j]);
			if(maxv-minv==j-i)res++;
		}
	}
	
	cout << res << endl;
	
	return 0;
} 

递增三元组

暴力(过了50%)

#include<iostream>
using namespace std;

const int N=1e5+10;
int a[N],b[N],c[N];
int n;
typedef long long LL;
LL cnt;
int main(){
    cin >> n;
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    for(int i=0;i<n;i++)scanf("%d",&b[i]);
    for(int i=0;i<n;i++)scanf("%d",&c[i]);
    
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            for(int k=0;k<n;k++){
                if(a[i]<b[j] && b[j]<c[k])cnt++;
            }
        }
    }
    
    cout << cnt << endl;
    
    return 0;
}

sort+二分

#include<iostream>
#include<algorithm>
using namespace std;

const int N=1e5+10;
int a[N],b[N],c[N];
int n;
typedef long long LL;
LL cnt;

int bs1(int l,int r,int x){
    while(l<r){
        int mid = l+r+1>>1;
        if(a[mid]<x)l=mid;
        else r=mid-1;
    }
    return a[l]<x?l:-1;
}

int bs2(int l,int r,int x){
    while(l<r){
        int mid = l+r>>1;
        if(c[mid]>x)r=mid;
        else l=mid+1;
    }
    return c[l]>x?l:-1;
}


int main(){
    cin >> n;
    for(int i=0;i<n;i++)scanf("%d",&a[i]);
    for(int i=0;i<n;i++)scanf("%d",&b[i]);
    for(int i=0;i<n;i++)scanf("%d",&c[i]);
    
    sort(a,a+n),sort(b,b+n),sort(c,c+n);
    
    for(int i=0;i<n;i++){
        int l = bs1(0,n-1,b[i]); 
        int r = bs2(0,n-1,b[i]);
        // printf("l:%d r:%d
",l,r);
        if(l==-1 || r==-1)continue;
        cnt += (LL)(l+1)*(n-r);
    }
    cout << cnt << endl;
    
    return 0;
}

特别数的和

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N=1e4+10;
int n;

bool check(int x){
	while(x){
		int t=x%10;
		if(t==2 || t==0 || t==1 || t==9)
			return true; 
		x/=10;
	}
	return false;
}

int main(){
	cin >> n;
	LL ans=0; 
	for(int i=1;i<=n;i++) 
		if(check(i))ans +=i;
	
	cout << ans << endl;
	return 0;
}

错误票据

#include<sstream>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;

const int N=1e5+10;
int q[N];
int t,n;

int main(){
    cin >> t;
    getchar();
    while(t--){
        string s;
        getline(cin,s);
        stringstream ssin(s);
        while(ssin >> q[n])n++;
    }
    
    sort(q,q+n);
    int a,b;
    for(int i=1;i<n;i++){
        if(q[i]==q[i-1])b=q[i];
        else if(q[i]!=q[i-1]+1)a=q[i]-1;
    }
    
    cout << a << " " << b << endl;
}

回文日期

#include<iostream>

using namespace std;

int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int res;

bool is_leap(int y){
    return y%400==0 || (y%4==0 && y%100!=0);
}

bool check(int date){
    int y=date/10000,m=date/100%100,d=date%100;
    if(m<1 || m>12)return false;
    if(d<1 ||(m!=2 && d>months[m]))return false;
    if(m==2){
        if(d<1 || d>months[m]+is_leap(y))return false;
    }
    return true;
}

int main(){
    int date1,date2;
    cin >> date1 >> date2;
    
    for(int i=1000;i<10000;i++){
        int date=i,x=i;
        while(x)date = date*10 + x%10,x/=10;
        if(date1<= date && date<=date2 && check(date))res++;
    }
    
    cout << res << endl;
    
    return 0;
}

归并排序

#include<bits/stdc++.h>
using namespace std;

const int N=1e5+10;
int n,q[N],tmp[N];


void merge_sort(int q[],int l,int r){
    if(l>=r)return;
    int mid = l+r>>1;
    merge_sort(q,l,mid),merge_sort(q,mid+1,r);
    
    int i=l,j=mid+1,k=0;
    while(i<=mid && j<=r){
        if(q[i]<=q[j])tmp[k++]=q[i++];
        else tmp[k++]=q[j++];
    }
    
    while(i<=mid)tmp[k++]=q[i++];
    while(j<=r)tmp[k++]=q[j++];
    for(i=l,j=0;i<=r;i++,j++)q[i]=tmp[j];
    
    
}

int main(){
    cin >> n;
    for(int i=0;i<n;i++)
        scanf("%d",&q[i]);
    
    merge_sort(q,0,n-1);
    for(int i=0;i<n;i++){
        printf("%d ",q[i]);
    }
    
    
    return 0;
}

移动距离

#include<iostream>
using namespace std;

int w,m,n;

int main(){
    cin >> w >> m >> n;
    m--,n--;
    int x1=m/w,y1=m%w,x2=n/w,y2=n%w;
    if(x1&1)y1=w-y1-1;
    if(x2&1)y2=w-y2-1;
    int res = abs(x1-x2) + abs(y1-y2);
    cout << res << endl;
    
    return 0;
}

日期问题

#include<iostream>
#include<cstring>

using namespace std;


int months[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

bool is_leap(int y){
    return y%400==0 || (y%4==0 && y%100!=0);
}

bool check(int y,int m,int d){
    if(m<1 || m>12)return false;
    if(d<1 || (m!=2 && d>months[m]))return false;
    if(m==2){
        if(d<1 || d>months[m]+is_leap(y))return false;
    }
    return true;
}


int main(){
    int a,b,c;
    scanf("%d/%d/%d",&a,&b,&c);
    
    for(int date=19600101;date<=20591231;date++){
        int y=date/10000,m=date/100%100,d=date%100;
        if(check(y,m,d)){
            if((y%100==a && m==b && d==c) || 
            (y%100==c && m==a && d==b) || 
            (y%100==c && m==b && d==a))
            printf("%d-%02d-%02d
",y,m,d);
        }
    }

    
    return 0;
}

航班时间

#include<iostream>

using namespace std;


int gettime(){
int h1,m1,s1,h2,m2,s2,d=0;
scanf("%d:%d:%d %d:%d:%d (+%d)",&h1,&m1,&s1,&h2,&m2,&s2,&d);
    return d*24*3600+h2*3600+m2*60+s2-(h1*3600+m1*60+s1);
}

int main(){
    int t;
    cin >> t;
    while(t--){
        int t1=gettime(),t2=gettime();
        int t=(t1+t2)/2;
        printf("%02d:%02d:%02d
",t/3600,t%3600/60,t%3600%60);
    }
    
    return 0;
}

外卖店的优先级

暴力(7/10)

#include<bits/stdc++.h>
using namespace std;

typedef pair<int,int> PII;
#define x first
#define y second

const int N=1e5+10;
int n,m,t;
vector<int> order[N]; 
int yx[N];
set<int> cache; // 缓存id 
bool st[N];
int main(){
	cin >> n >> m >> t;
	for(int i=0;i<m;i++){
		int ts,id;
		scanf("%d%d",&ts,&id);
		order[ts].push_back(id);
	}
	
	for(int i=1;i<=t;i++){ // 枚举时间
		memset(st,0,sizeof st); 
		// 该时刻有订单的店铺+2
		for(int k=0;k<order[i].size();k++){
			int id = order[i][k];
			st[id]=true;
			yx[id]+=2;
		}
		for(int i=1;i<=n;i++)
			if(!st[i] && yx[i])yx[i]-=1;
		
		// 遍历店铺,如果优先级>5加入cache,<=3踢出cache
		for(int j=1;j<=n;j++){
			if(yx[j]>5)cache.insert(j);
			if(yx[j]<=3)cache.erase(j);
		} 
	}
	cout << cache.size() << endl;
	
	return 0;
}

逆序对的数量

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N=1e5+10;
int n,q[N],tmp[N];

LL merge_sort(int q[],int l,int r){
    LL res=0;
    if(l>=r)return 0;
    int mid=l+r>>1;
    res+=merge_sort(q,l,mid)+merge_sort(q,mid+1,r);
    
    int i=l,j=mid+1,k=0;
    while(i<=mid && j<=r){
        if(q[i]<=q[j])tmp[k++]=q[i++];
        else tmp[k++]=q[j++],res+=mid-i+1;
    }
    
    while(i<=mid)tmp[k++]=q[i++];
    while(j<=r)tmp[k++]=q[j++];
    for(i=l,j=0;i<=r;i++,j++)q[i]=tmp[j];

    return res;
}

int main(){
    cin >> n;
    for(int i=0;i<n;i++)
        scanf("%d",&q[i]);
    LL res = merge_sort(q,0,n-1);
    cout << res << endl;
    
    return 0;
}
原文地址:https://www.cnblogs.com/Rowry/p/14618152.html