2018年蓝桥杯软件B组省赛试题(部分)

[toc]ios

<hr>数组

第几天(简单计算)

在这里插入图片描述


明码(STL专题之bitset)

在这里插入图片描述

<font size=2 color=red>这一个题的意思就是把题目中所给的数字变成二进制的码来表示,而后每两个数字的码是在一排的.</font>spa

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<bitset>
#include<algorithm> 
using namespace std;

typedef long long LL;
const int Max_n=100005;
	
int main(){
/*	int n,m;
	while(~scanf("%d%d",&n,&m)){
		bitset<8>x;
		x=n;
		for(int i=7;i>=0;i--){
			if(x[i]) printf("1");
			else printf(" "); 
		}
		x=m;
		for(int i=7;i>=0;i--){
			if(x[i]) printf("1");
			else printf(" "); 
		}
		printf("\n");
	}*/
	//上面的显示的是:九的九次方等于多少?
	printf("%.0lf",pow(9,9)); //387420489
	return 0;
}

乘积尾零(思惟,简单计算)

在这里插入图片描述

<font size=2 color=red>找0的个数实际上就是找2和5的数量.</font>3d

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;

typedef long long LL;
const int Max_n=30;
int a[Max_n];

int main() {
    for(int i=1;i<=100;i++)
    	scanf("%d",&a[i]);
    int num1=0;
	int num2=0;
    for(int i=1;i<=100;i++){
    	int x=a[i];
    	while(x%2==0&&x){
    		x/=2;
    		num1++;
    	}
    	while(x%5==0&&x){
    		x/=5;
    		num2++;
    	}
    }
    printf("%d\n",num1>num2?num2:num1);//31
    return 0;
}

快速排序(找第k小的数)

<font size=2 color=red>代码的大概意思就是先随机生成一个数,把比这个小的都放在它的左边,比它大的数都放在右边,这个数若是是第k小的就返回,若是小于k就再向右半部分,此时就不是第k小的了,不然就向左边去找第k小的数.`</font>指针


递增三元组(STL专题之二分的应用)

在这里插入图片描述

<font size=2 color=red>这题很差想到的就是遍历b,若是遍历a复杂度最多降到O(nlogn).</font>日志

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm> 
using namespace std;

typedef long long LL;
const int Max_n=100005;
int a[Max_n],b[Max_n],c[Max_n];
	
int main(){
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for(int i=1;i<=n;i++)
		scanf("%d",&b[i]);
	for(int i=1;i<=n;i++)
		scanf("%d",&c[i]);
	sort(a+1,a+1+n);
	sort(c+1,c+1+n);
	LL ans=0;
	for(int i=1;i<=n;i++){
		int index1=lower_bound(a+1,a+1+n,b[i])-a;
		int index2=upper_bound(c+1,c+1+n,b[i])-c;
		ans+=1LL*(index1-1)*(n-index2+1);
	}
	printf("%lld\n",ans);
	return 0;
}

螺旋折线(思惟,数学)

在这里插入图片描述

在这里插入图片描述

<font size=2 color=red>把每一圈都补成一个正方形,而后讨论点落在四个方向上的状况.</font>code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<bitset>
#include<algorithm> 
using namespace std;

typedef long long LL;
const int Max_n=100005;
	
int f(int x,int y,int n){
	if(x==-n){
		if(y==-n) 
			return 8*n;//n*2*4;
		return y+n;//1+(y+n-1);
	}
	if(y==n){
		return 3*n+x;//1+2*n-1+x+n;
	}
	if(x==n){
		return 5*n-y;//1+2*n-1+2*n+n-y;
	}
	if(y==-n){
		return 7*n-x;//1+2*n-1+2*n+2*n+n-x;
	}
}

int main(){
	int x,y;
	scanf("%d%d",&x,&y);
	int n=max(abs(x),abs(y));
	LL ans=1LL*n*(n-1)*4+f(x,y,n);
	printf("%lld\n",ans);
	return 0;
}

日志统计(尺取法)

在这里插入图片描述 <font size=2 color=red>blog

  • 首先咱们先对每一个id在哪一个时间收到的赞所有保存在一个vector中,至关于一个邻接表.
  • 保存完了之后咱们先遍历每个id
  • 判断某个id在[T,T+D)内是不是热帖
    • 先判断此id对应的赞一共有多少个,也就是id对应的长度,若是小于k直接返回false,<br>若是大于k可能有知足条件的区间,咱们就对这个id对应的ts进行排序。
    • 对于知足状况的时候,咱们能够先从第一个时间开始,若是赞没有k个右指针右移,cnt++<br>若是够了k个,咱们就须要判断这些时间间隔是否在D内,若是在就返回true.若是不<br>在D内,说明时间间隔须要缩短,此时左指针左移,cnt--.
  • 若是是热帖就放入数组中,不然继续遍历id,直到结束为止.

</font>排序

<font size=2 color=blue>咱们须要明确的是:v[i]里面的一个数就表明一个赞.</font>图片

#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring> 
using namespace std;

typedef long long LL;
const int Max_n=1005;
int ans[Max_n],n,d,k;;//保存符合条件的id 
vector<int>v[Max_n];

bool judge(int id){
	int len=v[id].size();
	if(len<k) return false;
	sort(v[id].begin(),v[id].end());//按照时间从小到大排序
	int l=0,r=0;
	int cnt=0;//表示目前获得的赞.
	while(l<=r&&r<len){//某个区间,而且右端点不能超过边界.
		cnt++;//若是上一步cnt<k,那么咱们r++以后cnt是要加1的.
		//(此时一个时间就表明一个赞)若是咱们上一步是没有找到
		//合适的区间,l++,cnt--由于此时咱们的赞已经固定在k了,
		//因此咱们须要cnt++(增长时间间隔) 
		if(cnt>=k){//此时赞是够的,只须要在看时间段是否符合就行. 
			if(v[id][r]-v[id][l]<d) return true;
			else{//此时间间隔不知足说明左端点须要右移(缩短间隔)
				l++;
				cnt--; 
			} 
		}
		r++;//赞不够咱们增长赞,若是是由于时间间隔咱们须要右移左端点
		//(由于此时咱们已经将赞固定的k个了,再日后遍历,删除一个就要增长一个) 
	} 
	return false;//最后没有找到合适的时间间隔
}

int main(){
	scanf("%d%d%d",&n,&d,&k);
	while(n--){
		int id,ts;
		scanf("%d%d",&ts,&id);
		v[id].push_back(ts);
	}
	int num=0; 
	for(int i=1;i<=Max_n;i++){
		if(judge(i)){
			ans[++num]=i;
		} 
	}
	for(int i=1;i<=num;i++)
		printf("%d\n",ans[i]);
	return 0;
}

全球变暖(dfs&连通块)

在这里插入图片描述 <font size=3 color=red>此题有一个坑点,就是让求有多少岛屿被彻底淹没,而不是最终还剩下多少岛屿.</font>

#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<set> 
using namespace std;

typedef long long LL;
const int Max_n=1005;
char a[Max_n][Max_n];
int vis[Max_n][Max_n],n,vis1[Max_n][Max_n];
int net[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
set<char>s;

bool judge_border(int x,int y){
	if(x<1||x>n||y<1||y>n)
		return false;
	return true;
} 

void dfs(int x,int y,int color){//标记连通块 
	a[x][y]=color;
	for(int k=0;k<4;k++){
		int tx=x+net[k][0];
		int ty=y+net[k][1];
		if(judge_border(tx,ty)&&!vis[tx][ty]&&a[tx][ty]=='#'){
			vis[tx][ty]=1;
			dfs(tx,ty,color);
		}
	}
	return ;
}


int main(){
	char cnt='0';
	scanf("%d",&n); 
	getchar();
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			scanf(" %c",&a[i][j]);
	for(int i=1;i<=n;i++){//求连通块而且标记 
		for(int j=1;j<=n;j++){
			if(a[i][j]=='#'){
				cnt++;
				dfs(i,j,cnt);	
			}
		}
	}
	
/*	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			printf("%c",a[i][j]);
			if(j==n) printf("\n");
		}	
	}*/
		
	for(int i=1;i<=n;i++){//按照要求淹没陆地 
		for(int j=1;j<=n;j++){
			if(a[i][j]!='.'){
				for(int k=0;k<4;k++){
					int tx=i+net[k][0];
					int ty=j+net[k][1];
					if(judge_border(tx,ty)&&a[tx][ty]=='.'){//一个陆地旁边有海洋就被淹没 
						vis1[i][j]=1;
						break; 
					}
				}
			}
		}
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(vis1[i][j]) a[i][j]='.'; 
			
	/*for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			printf("%c",a[i][j]);
			if(j==n) printf("\n");
		}		
	}
	*/
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(a[i][j]!='.') s.insert(a[i][j]);
	printf("%d\n",cnt-'0'-s.size());
	return 0;
}
相关文章
相关标签/搜索