2018蓝桥杯C/C++真题题解(三)

简介: 2018蓝桥杯C/C++真题题解


H:日志统计


题目描述

小明维护着一个程序员论坛。现在他收集了一份"点赞"日志,日志共有 N 行。其中每一行的格式是:


ts id


表示在 ts 时刻编号 id 的帖子收到一个"赞"。


现在小明想统计有哪些帖子曾经是"热帖"。如果一个帖子曾在任意一个长度为 DD 的时间段内收到不少于 KK 个赞,小明就认为这个帖子曾是"热帖"。


具体来说,如果存在某个时刻 T 满足该帖在 T,T+D) 这段时间内(注意是左闭右开区间)收到不少于 K 个赞,该帖就曾是"热帖"。


给定日志,请你帮助小明统计出所有曾是"热帖"的帖子编号。


输入描述

输入格式:


第一行包含三个整数N,D,K。


以下 N 行每行一条日志,包含两个整数 ts 和 id。


其中,1≤K≤N≤105,0≤ts≤105,0≤id≤105。


输出描述

按从小到大的顺序输出热帖 id。每个 id 一行。


输入输出样例

示例


输入

7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3

输出

1
3

运行限制

最大运行时间:1s

最大运行内存: 256M

#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
vector<int> a[100005];
int n,d,k;              //d时间有k个赞 
int ans[100005];
bool check(vector<int> x){
  sort(x.begin(),x.end());
  int y=x.size();
  int l=0,r=1;
  int cnt=0;
  while(l<=r && r<y){
    if(x[r]-x[l]<d){
      cnt=max(cnt,r-l+1);
      r++;
    }else{
      l++;
    }
    if(cnt>=k){
      return true;
    }
    if(l==r){
      r++;
    }
  }
  return false;
} 
int main(){
  cin>>n>>d>>k;
  int mm=0;
  for(int i=0;i<n;i++){
    int ts,id;
    cin>>ts>>id;
    mm=max(mm,id);
    a[id].push_back(ts);
  }
  int c=0;
  for(int i=0;i<=mm;i++){
    if(a[i].size()>=k){
      if(check(a[i])){
        cout<<i<<endl;
      }
    }
  } 
  return 0;
}

找了半天都没找出问题来。啊啊啊啊


I:全球变暖


题目描述

你有一张某海域 NxNNxN 像素的照片,"."表示海洋、"#"表示陆地,如下所示:


.......


.##....


.##....


....##.


..####.


...###.


.......


其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。


由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。


例如上图中的海域未来会变成如下样子:


.......


.......


.......


.......


....#..


.......


.......


请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。


输入描述

第一行包含一个整数  (1≤N≤1000)。


以下 N 行 N 列代表一张海域照片。


照片保证第 1 行、第 1 列、第 N 行、第 N 列的像素都是海洋。、


输出一个整数表示答案。


输入输出样例

示例


输入


7
.......
.##....
.##....
....##.
..####.
...###.
.......

输出

1

运行限制

最大运行时间:1s

最大运行内存: 256M

dfs深搜,立一个flag,没有淹没为ture

#include <iostream>
using namespace std;
int n;
char a[1005][1005];
bool flag;
int dao1;
int dao2;
bool b[1005][1005];
bool v[1005][1005];
int c[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
void dfs(int x,int y){
  if(x<0 || x>=n || y<0 || y>=n || a[x][y]!='#' || b[x][y]){
    return;
  }
  b[x][y]=1;
  if(a[x-1][y]=='.' || a[x][y-1]=='.' || a[x+1][y]=='.' ||a[x][y+1]=='.'){
    a[x][y]='T';
  }else{
    flag=true;
  }
  dfs(x-1,y);
  dfs(x,y-1);
  dfs(x+1,y);
  dfs(x,y+1);
}
int main(){
  cin>>n;
  for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
      cin>>a[i][j];
    }
  }
  for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
      if(a[i][j]=='#'&&!b[i][j]){
        flag=false;
        dfs(i,j);
        dao1++;
        if(flag){
          dao2++;
        }
      }
    }
  }
  cout<<dao1-dao2;
  return 0;
}

J:乘积最大

题目描述

给定 NN 个整数 A1,A2,⋯AN。请你从中选出 K 个数,使其乘积最大。


请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以 10^9+9109+9 的余数。


注意,如果 X<0,我们定义 X 除以 09+9 的余数是负(−X)除以 10^9+9109+9 的余数。


即:0−((0−x)%109+9)。


输入描述

输入格式:


第一行包含两个整数N,K。


以下 NN 行每行一个整数Ai。


其中,1≤K≤N≤105,−105≤Ai≤105。


输出描述

输出一个整数,表示答案。


输入输出样例

示例


输入

5 3
-100000
-10000
2
100000
10000

输出

999100009

运行限制

最大运行时间:1s

最大运行内存: 256M


分类讨论,排序后考虑都是正数,都是负数,和正负数都有

#include <iostream>
#include <algorithm>
using namespace std;
#define m 1000000009
int n,k;
int a[100005];
long long sum;
int main(){
    sum=1;
    cin>>n>>k;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    sort(a,a+n);
    if(k==n){
        for(int i=0;i<n;i++){
            sum=(sum%m*a[i]%m)%m;
        }
        cout<<sum%m;
        return 0;
    }
    if(a[0]>=0){
        for(int i=n-1;i>n-1-k;i--){
            sum=(sum%m*a[i]%m)%m;
        }
    }else if(a[n-1]<=0 && k%2==0){
        for(int i=0;i<k;i++){
            sum=(sum%m*a[i]%m)%m;
        }
    }else if(a[n-1]<=0 && k%2!=0){
        for(int i=n-1;i>n-1-k;i--){
            sum=(sum%m*a[i]%m)%m;
        }
    }else if(a[0]<0 && a[n-1]>0 && k%2==0){
        int l=0,r=n-1;
        while(k){
            long long b1=(long long)a[l]*a[l+1];
            long long b2=(long long)a[r]*a[r-1];
            if(b1>b2){
                sum=(sum%m*b1%m)%m;
                l+=2;
            }else{
                sum=(sum%m*b2%m)%m;
                r-=2;
            }
            k-=2;
        }
    }else if(a[0]<0&&a[n-1]>0&&k%2!=0){
        sum=a[n-1];
        k--;
        int l=0,r=n-2;
        while(k){
            long long b1=(long long)a[l]*a[l+1];
            long long b2=(long long)a[r]*a[r-1];
            if(b1>b2){
                sum=(sum%m*b1%m)%m;
                l+=2;
            }else{
                sum=(sum%m*b2%m)%m;
                r-=2;
            }
            k-=2;
        }
    }
    cout<<sum%m;
    return 0;
}

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10,mod=1000000009;
typedef long long ll;
ll a[N];
int main(){
    int n,k;
    cin>>n>>k;
    for(int i=0;i<n;i++)cin>>a[i];
    sort(a,a+n);
    int f=1;
    int l=0,r=n-1;
    ll res=1;
    if(k%2){
        res=a[r--];
        k--;
        if(res<0) f=-1;
    }
    while(k){
        ll x=a[l]*a[l+1];
        ll y=a[r]*a[r-1]; 
        if(x*f>y*f){
            res=x%mod*res%mod; 
            l+=2;
        }
        else {
            res=y%mod*res%mod;
            r-=2;
        }
        k-=2;
//        cout<<res<<endl;
    }
    cout<<res;
    return 0;
}

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
14天前
|
数据安全/隐私保护 C++
小唐开始刷蓝桥(九)2012年第三届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(九)2012年第三届C/C++ B组蓝桥杯省赛真题
|
15天前
|
算法 测试技术 C++
小唐开始刷蓝桥(八)2013年第四届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(八)2013年第四届C/C++ B组蓝桥杯省赛真题
|
15天前
|
算法 C++ 数据格式
小唐开始刷蓝桥(七)2014年第五届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(七)2014年第五届C/C++ B组蓝桥杯省赛真题
|
15天前
|
算法 C++
小唐开始刷蓝桥(六)2015年第六届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(六)2015年第六届C/C++ B组蓝桥杯省赛真题
|
15天前
|
算法 C++
小唐开始刷蓝桥(五)2016年第七届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(五)2016年第七届C/C++ B组蓝桥杯省赛真题
|
15天前
|
存储 人工智能 算法
小唐开始刷蓝桥(四)2017年第八届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(四)2017年第八届C/C++ B组蓝桥杯省赛真题
|
15天前
|
机器学习/深度学习 存储 人工智能
小唐开始刷蓝桥(三)2018年第九届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(三)2018年第九届C/C++ B组蓝桥杯省赛真题
|
15天前
|
存储 人工智能 Java
小唐开始刷蓝桥(二)2019年第十届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(二)2019年第十届C/C++ B组蓝桥杯省赛真题
|
15天前
|
人工智能 搜索推荐 C++
小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题
小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题
|
16天前
|
存储 人工智能 算法
第十四届蓝桥杯C++B组编程题题目以及题解
第十四届蓝桥杯C++B组编程题题目以及题解