0
点赞
收藏
分享

微信扫一扫

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


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


【ZJCPC2019 第16届 浙江省赛】The 16th Zhejiang Provincial Collegiate Programming Contest(GFHIJ 5题)_数学_02

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

G .Lucky 7 in the Pocket

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

  • 题意:给出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

【ZJCPC2019 第16届 浙江省赛】The 16th Zhejiang Provincial Collegiate Programming Contest(GFHIJ 5题)_数据结构_04

  • 题意:给出一个字符串,去掉元音字母(首字母不用去)输出
  • 思路:直接模拟即可

#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

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

  • 题意:
    给定一个序列,让你消除某个数,所得序列最高峰最少是多少
    例如样例 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

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

  • 题意:给你一个斐波那契数列,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

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

  • 题意:
    有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;
}


举报

相关推荐

0 条评论