2019 蓝桥杯省赛 B 组模拟赛(一)

F:找质数

一天蒜头君猜想,是不是所有的偶数(除了 22),都可以用两个质数相加得到呢?于是聪明的蒜头君就找你来验证了。

输入格式

第一行输入一个整数 tt 表示测试组数。

接下来 tt 行,每行一个整数 nn。

输出格式

输出两个整数,因为答案可能有多个,所有要求输出的这两个整数是所有答案中字典序最小的。

 

这个真鸡肋,居然卡输入输出。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
#include<cstring>
#include<set>
#include<queue>
#include<stack>
#define ll long long
#define  inf 0x3f3f3f
using namespace std;
bool visit[10100000];
int prime[10000000];
int num;

void init_prim()
{
    int n=1000000;
    memset(visit, true, sizeof(visit));
    num = 0;
    for (int i = 2; i *i<= n; ++i)
    {
        if (visit[i] == true)
        {
            num++;
            prime[num] = i;
        }
        for (int j = 1; ((j <= num) && (i * prime[j] <= n));  ++j)
        {
            visit[i * prime[j]] = false;
            if (i % prime[j] == 0) break;
        }
    }
}


int main(){
    int t,n;
    init_prim();
    visit[1]=0;
    visit[0]=0;
    scanf("%d",&t);
    while(t--){
        cin>>n;
        for(int i=1;i<=num;i++){
            if(visit[prime[i]]&&visit[n-prime[i]]){
                printf("%d %d\n",prime[i],n-prime[i]);
                break;
            }
        }
    }
    return 0;
}

G:后缀字符串

一天蒜头君得到 nn 个字符串 sisi​,每个字符串的长度都不超过 1010。

蒜头君在想,在这 nn 个字符串中,以 sisi​ 为后缀的字符串有多少个呢?

这道题利用map进行预处理查找(一开始没想到暴力超时了orz)

 #include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
#include<string>
#include<set>
#include<queue>
#include<stack>
#define ll long long
#define  inf 0x3f3f3f
using namespace std;
string s[100000+10];
map<string,int>mp;
int main(){
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        cin>>s[i];
    }
    mp.clear();
    for(int i=0;i<n;i++){
        for(int j=0;j<s[i].size();j++){
            mp[s[i].substr(j)]++;
        }
    }
    for(int i=0;i<n;i++){
        printf("%d\n",mp[s[i]]);
    }
    return 0;
}

H:轻重搭配

n 个同学去动物园参观,原本每人都需要买一张门票,但售票处推出了一个优惠活动,一个体重为 xx 的人可以和体重至少为 2x2x 配对,这样两人只需买一张票。现在给出了 nn 个人的体重,请你计算他们最少需要买几张门票?

贪心,从中间位置开始查找

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
#include<cstring>
#include<set>
#include<queue>
#include<stack>
#define ll long long
#define  inf 0x3f3f3f
using namespace std;
int a[1008611];
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    sort(a,a+n);
    int mid=n/2-1;
    int j=n-1;
    int ans=0;
    for(int i=mid;i>=0;i--){
        if(a[j]<2*a[i]){
            ans++;
        }
        else{
            j--;
            ans++;
        }
    }
    if(j!=mid){
        ans+=j-mid;
    }
    cout<<ans<<endl;
    return 0;
}

I:抠图

dfs/bfs 搜索所有可达位置并标记

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
#include<string>
#include<cstring>
#include<set>
#include<queue>
#include<stack>
#define ll long long
#define  inf 0x3f3f3f
using namespace std;
int d[4][2]={0,1,0,-1,1,0,-1,0};
int mp[505][505],vis[505][505];
    int n,m;
void dfs(int x,int y){
    for(int k=0;k<4;k++){
        int dx=x+d[k][0];
        int dy=y+d[k][1];
        if(!vis[dx][dy]&&mp[dx][dy]&&dx>=0&&dx<n&&dy>=0&&dy<m){
            vis[dx][dy]=1;
            dfs(dx,dy);
        }
    }
}
int main(){
    int t;

    scanf("%d",&t);
    while(t--){
        memset(vis,0,sizeof(vis));
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                scanf("%d",&mp[i][j]);
            }
        }
        for(int i=0;i<n;i++){
           if(!vis[i][0]&&mp[i][0]){
                    dfs(i,0);
                }
            if(!vis[i][m-1]&&mp[i][m-1]){
                    dfs(i,m-1);
                }
        }
         for(int j=0;j<m;j++){
                if(!vis[0][j]&&mp[0][j]){
                    dfs(0,j);
                }
                if(!vis[n-1][j]&&mp[n-1][j]){
                    dfs(n-1,j);
                }
            }
    //dfs(0,0);
    for(int i=0;i<n;i++){
        for(int j=0;j<m-1;j++){
            if(vis[i][j]){
                printf("0 ");
            }
            else{
                printf("%d ",mp[i][j]);
            }

        }
        if(vis[i][m-1]){
                printf("0\n");
            }
            else{
                printf("%d\n",mp[i][m-1]);
            }
    }
    }
    return 0;
}


 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值