ZJCPC2019 第16届 浙江省赛The 16th Zhejiang Provincial Collegiate Programming Contest(GFHIJ 5题)

Posted 小哈里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZJCPC2019 第16届 浙江省赛The 16th Zhejiang Provincial Collegiate Programming Contest(GFHIJ 5题)相关的知识,希望对你有一定的参考价值。


补题地址:https://zoj.pintia.cn/home/news
搜索16th
本文按照通过率补的题

G .Lucky 7 in the Pocket

  • 题意:给出T个数,对于每个数,找出一个能被7整除但是不能比4整除的比他大的最小的数输出。
  • 思路:直接暴力循环即可。
#include<bits/stdc++.h>
using namespace std;

int main()
    int T;  cin>>T;
    while(T--)
        int n; cin>>n;
        while(n%7!=0 || n%4==0)n++;
        cout<<n<<"\\n";
    
    return 0;



F. Abbreviation

  • 题意:给出一个字符串,去掉元音字母(首字母不用去)输出
  • 思路:直接模拟即可
#include<bits/stdc++.h>
using namespace std;

int main()
    int T;  cin>>T;
    while(T--)
        string s;  cin>>s;
        cout<<s[0];
        for(int i = 1; i < s.size(); i++)
            if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u'||s[i]=='y')continue;
            cout<<s[i];
        
        cout<<"\\n";
    
    return 0;



H. Singing Everywhere

  • 题意:
    给定一个序列,让你消除某个数,所得序列最高峰最少是多少
    例如样例 1 1 4 5 1 4 无论如何消除一个数,最后结果都是1,
    但是样例 1 9 1 9 8 1 0 只要把第三个数 1 消除,得到1 9 9 8 1 0,就没有最高峰了答案为0。
  • 思路:
    首先求出原本有多少个峰,然后每次模拟消除一个数,看最多能消除多少个,最后拿原本的减去消除最多的就可以了
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int a[maxn];

int main()
    int T;  cin>>T;
    while(T--)
        int n;  cin>>n;
        for(int i = 1; i <= n; i++)cin>>a[i];
        int sum = 0;
        for(int i = 2; i <= n-1; i++)
            if(a[i-1]<a[i] && a[i]>a[i+1])sum++;
        a[0] = a[n+1] = 1e9+10;
        int ans = 0;
        for(int i = 2; i <= n-1; i++)
            int now = 0;
            if(a[i-1]>a[i+1] && a[i-1]>a[i-2])now++;
            if(a[i+1]>a[i-1] && a[i+1]>a[i+2])now++;
            int be = 0;
            if(a[i-1]>a[i-2] && a[i-1]>a[i])be++;
            if(a[i+1]>a[i+2] && a[i+1]>a[i])be++;
            if(a[i]>a[i-1] && a[i]>a[i+1])be++;
            ans = max(ans, be-now);
        
        cout<<sum-ans<<"\\n";
    
    return 0;



I. Fibonacci in the Pocket

  • 题意:给你一个斐波那契数列,1,1,2,3,5,,,。每次询问区间[l,r]的和能否被2整除,如果可以则输出0,否则输出1。
  • 思路:斐波那契数列的奇偶性是“奇奇偶”三个一循环,而奇奇偶相加为偶数不影响结果。因此%3=1时为奇数,=2或=0时为偶数,然后就知道了前缀和的奇偶性。 区间和为f®-f(l-1)奇偶性可知。
    对于长整数,我们中学就知道一个定理:能被3整除的数其各个位数之和也能被3整除。因此判断输入的l能否被3整除,只需要直接加起来判断即可。
#include<bits/stdc++.h>
using namespace std;

int main()
    int T;  cin>>T;
    while(T--)
        string a, b;  cin>>a>>b;
        int l = 0, r = 0;
        for(int i = 0; i < a.size(); i++)l += a[i]-'0';
        for(int i = 0; i < b.size(); i++)r += b[i]-'0';
        int ans = 0;
        if(l%3==1 && r%3==1)ans = 1;
        if(l%3==2 && r%3!=1)ans = 1;
		if(l%3==0 && r%3==1)ans = 1;
        cout<<ans<<"\\n";
    
    return 0;



J. Welcome Party

  • 题意:
    有n个人m个关系,每一对关系代表这两人认识,关系不具有传递性。现在你要安排这n个人进入一个舞会,如果第i个人进入了舞会大厅但是发现没有一个认识的人,那就会不高兴。问你怎么安排顺序这n个人进入舞会大厅,使得不开心的人数最少。如果有多种方案,输出字典序最小的方案。
  • 思路:
    首先,每个连通块里肯定至少有一个人不开心,取最优就是公共祖先不开心。(用并查集维护时让字典序小的那个点当祖先)
    然后,一个字典序最先的序列,在最开始的时候建个图,把每个不开心的点都丢到优先队列(小根堆)里,然后暴力bfs找所有能联通的点输出即可。
    PE也是醉了
#include<bits/stdc++.h>
using namespace std;
#define ios ios::sync_with_stdio(0), cin.tie(0),cout.tie(0)
const int maxn = 1e6+10;
vector<int>G[maxn];

int fa[maxn+10];
void init(int n)for(int i = 0; i <= n; i++)fa[i]=i;
int find(int x)return x==fa[x]?x:fa[x]=find(fa[x]);

priority_queue<int, vector<int>, greater<int> > q;//所有不开心的人
int vis[maxn];
void bfs()
    vector<int>vc;
    while(q.size())
        int t = q.top();  q.pop();
        if(vis[t])continue;
        vis[t] = 1;        
        vc.push_back(t);
        for(int x : G[t])q.push(x);
    
    cout<<vc[0];
    for(int i = 1; i < vc.size(); i++)cout<<" "<<vc[i];
    cout<<"\\n";


int main()
    int T;  cin>>T;
    while(T--)
        int n, m;  cin>>n>>m;
        for(int i = 1; i <= n; i++)
            G[i].clear();  vis[i] = 0;
        
        init(n);
        while(m--)
            int a, b;  cin>>a>>b;
            G[a].push_back(b);
            G[b].push_back(a);
            a = find(a); b = find(b);
            if(a==b)continue;
            if(a < b)fa[b] = a;
            else fa[a] = b;
        
        for(int i = 1; i <= n; i++)
            if(fa[i]==i)q.push(i);
        cout<<q.size()<<"\\n";
        bfs();
    
    return 0;



以上是关于ZJCPC2019 第16届 浙江省赛The 16th Zhejiang Provincial Collegiate Programming Contest(GFHIJ 5题)的主要内容,如果未能解决你的问题,请参考以下文章

ZJCPC2022 第19届 浙江省赛The 19th Zhejiang Provincial Collegiate Programming Contest(CBALGMIF 8题)

ZJCPC2022 第19届 浙江省赛The 19th Zhejiang Provincial Collegiate Programming Contest(CBALGMIF 8题)

ZJCPC2018 第15届 浙江省赛The 15th Zhejiang Provincial Collegiate Programming Contest(MABLJK 6题)

ZJCPC2018 第15届 浙江省赛The 15th Zhejiang Provincial Collegiate Programming Contest(MABLJK 6题)

ZJCPC2020 第17届 浙江省赛The 17th Zhejiang Provincial Collegiate Programming Contest(ABCIK 5题)

ZJCPC2021 第18届 浙江省赛The 18th Zhejiang Provincial Collegiate Programming Contest(ACFGJLM 7题)