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;
}
相關文章
相關標籤/搜索