2021 ZUST,XCPC选拔赛

Posted 小哈里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021 ZUST,XCPC选拔赛相关的知识,希望对你有一定的参考价值。

0

加粗的已做
标号 标题 通过数 提交数 通过率
7-1 Alice’s XOR 3 4 0.75
7-2 Building Roads 4 17 0.24
7-3 Celebration 1 1 1.00
7-4 Dungeon 4 13 0.31
7-5 Exercise 4 18 0.22

7-6 FCT 0 0 0.00
7-7 Great ZUST 1 1 1.00
7-8 Happy Children’s Day 0 0 0.00
7-9 It’s a warm problem 0 0 0.00


7-2开始炸longlong,但是仍然不知道比较函数哪里炸了
7-5的多重背包开始当成贪心写了,,仍然没看懂题目的那个边界,只能缩小到两种情况试出来。
7-4最开始少了个特判,仍然不知道n/m == 1与n==m有什么区别
在这里插入图片描述

7-2

7-2 Building Roads
在遥远的星球上,有一个叫做佩尔王国的古老国度。

佩尔王国有 n 个主要城市(从 1 开始编号),第 i 个城市有 P
​i
​​ 个居民。

P
​i
​​ 代表佩尔数列的第 i 项,定义佩尔数列 : P
​0
​​ =0,P
​1
​​ =1,P
​i
​​ =2×P
​i−1
​​ +P
​i−2
​​ (i≥2)

佩尔国王想要在这 n 个城市间修建高速公路,广泛征集意见后,佩尔王国的子民们提出了 m 个方案,第 i 个方案是建造一条 u
​i
​​ 城市与 v
​i
​​ 城市之间的(无向)高速公路,建造这条高速公路将会提高 P
​u
​i
​​
​​ +P
​v
​i
​​
​​ 的便捷度。

国王想要在其中选择尽可能少的方案使得:

1.在这些方案实施后,这 n 个城市之间是连通的( i.e. 任意两个城市之间都可以通过高速公路到达)。

2.最大化方案所带来的便捷度。

3.在最大化便捷度的前提下,由于国王的特殊癖好,他希望这些城市的最大度数与最小度数的差值 D 最大 (假设 di 是第 i 个城市的度数,
D=
​1≤i≤n
​max
​​ d
​i
​​ −
​1≤i≤n
​min
​​ d
​i
​​ ),一个城市的度数定义为与这个城市直接相连的高速公路数量。

gxy作为国王最为看重的谋士,自然承担了替国王选择方案的重任,机智的gxy很快就算出了可选方案的最大便捷度,但是他急切得想要知道在方案实施后城市的 D 的最大值是多少,聪明的你能帮助他吗?

若不存在合法选择,输出 −1。

输入格式:
输入第一行给出两个整数 n,m (2≤n≤10
​5
​​ ,1≤m≤2×10
​5
​​ )
接下来的 m 行,每行两个整数 u
​i
​​ ,v
​i
​​ (1≤u
​i
​​ ,v
​i
​​ ≤n,u
​i
​​ ≠v
​i
​​ )

输出格式:
输出一个整数代表方案实施后城市的 D 的最大值,若不存在合法选择则输出 −1 。

输入样例1:
5 6
2 1
2 4
1 3
3 4
4 5
1 5
输出样例1:
2
输入样例2:
3 1
1 2
输出样例2:
-1

#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+10;
int p[maxn], in[maxn];
struct edge{//AC
	int u, v, w;
	bool operator < (const edge &B)const{
		 if (max(u, v) != max(B.u, B.v)) return max(u, v) > max(B.u, B.v);
        return min(u, v) > min(B.u, B.v);
	}
}e[maxn];
bool cmp(edge a, edge b){//WA
	if(max(a.u,a.v)!=max(b.u,b.v))max(a.u,a.v)>max(b.u,b.v);
	return min(a.u,a.v)>min(b.u,b.v);
};

int fa[maxn];
int find(int x){
	return x==fa[x]?x:fa[x] = find(fa[x]);
}
void merge(int x, int y){
	x=find(x), y=find(y);
	if(x!=y)fa[x] = y;
}

int main(){
	ios::sync_with_stdio(false);
	int n, m;  cin>>n>>m;
	p[0] = 0; p[1] = 1;
	fa[1] = 1;
	for(int i = 2; i <= n; i++){
		//p[i] = 2*p[i-1]+p[i-2]; //ll
		fa[i] = i;
	}
	for(int i = 1; i <= m; i++){
		cin>>e[i].u>>e[i].v;
		//int u, v;  cin>>u>>v;
		//e[i].u = min(u,v);
		//e[i].v = max(u,v);
		//e[i].w = p[e[i].u]+p[e[i].v];
	}
	sort(e+1,e+m+1);
	int cc = 1;
	int mx = 0, mi = 1e9+10;
	for(int i = 1; i <= m; i++){
		if(find(e[i].u)!=find(e[i].v)){
			merge(e[i].u, e[i].v);
			cc++;
			in[e[i].u]++;
			in[e[i].v]++;
			mx = max(mx, in[e[i].u]);
			mx = max(mx, in[e[i].v]);
			mi = min(mi, in[e[i].u]);
			mi = min(mi, in[e[i].v]);
		}
	}
	if(cc!=n){
		cout<<"-1";
		return 0;
	}
	if(n==1)cout<<"0\\n";
	else cout<<mx-mi<<"\\n";
	return 0;
}

7-3

7-3 Celebration
1980年10月9日,沐浴着改革开放的春风,浙江科技学院的前身浙江大学附属杭州工业专科学校应运而生。50载春秋,学校传承浙大血脉,允迪前踪,鉴往开来。升格更名、迁扩校区、提升内涵,既繁既苦、克艰克难、奋进不止。今日浙科,强化应用型办学,彰显国际化特色,力争成为浙江省乃至全国应用型大学之标杆。

海纳百川,特色迥出。50载春秋,学校延鉴德国学脉,以中德省州合作、两国政府级合作为基,强“德”字高端平台,拓法、美、澳、罗等诸国合作,育百余国来华学子。中德合作枝脉郁郁,国际化办学特色煌煌。今日浙科,为浙江省乃至全国对德教育、科技、文化交流与合作的重要窗口,列中国大学国际化竞争力百强。

砺行锵锵,春华秋实。50载春秋,学校深融浙江地脉,高举应用型大旗,一以贯之育一流应用型人才,不拘一格汇一流应用型师资,顶天立地建一流应用型学科,持之以恒逐一流应用型科技创新,桃李芬芳,硕果累累。今日浙科,承国家项目,建省部平台,高水平成果层出不穷,千余教师于地方经济社会主战场策马扬鞭,奋楫笃行,数万海内外学子在各行各业栋梁是举,藻绘江山。

请问还有多少天是浙江科技学院50周年校庆?

输入描述:
(no input)

输出描述:
输出一行包含一个整数表示答案。

样例输入:
(no input)
样例输出:
(no output)
提示:
2021-05-23到2021-05-24算经过一天

#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"3426\\n";
	return 0;
}

7-4

7-4 Dungeon
lx是集训队中codeforces黄名大佬,他总喜欢出题来迫害其他人,尤其是喜欢迫害gxy。有一次他准备出x道不同类型的题来检验一下现在集训队队员的水平,顺便找工具人来帮他验题。因为gxy是个菜鸡,很多题他都不会写,于是就和lx大佬讲道理。lx大佬说不过他,就制定了下面的规则:

1.每人只能在x题中Ban一道自己不喜欢的题(被Ban的题不会被分配到Ban这题的人);

2.lx知道每个人Ban的题后,把n位集训队队员平均分成m组,进行PK;

3.保证每一组做的是同一道题(不同组之间可能做同一道题)。

因为lx忙于打副本,没有时间来出很多题。请问他最少要准备多少题来满足这次比赛?

image-20210427163617801.png

输入描述:
输入第一行是一个整数T(1≤T≤10
​3
​​ ),表示有T组测试实例。

每组输入一行,包含两个空格分隔的正整数n和m(1≤n,m≤10
​5
​​ ,n能被m整除)。

输出描述:
对于每组输入,输出一行包含一个整数的答案。

样例输入:
1
4 2
样例输出:
3

//WA
#include<bits/stdc++.h>
using namespace std;
int main(){
	int T;  cin>>T;
	while(T--){
		int n, m;  cin>>n>>m;
		int num = n/m;
        if(num==1){ cout<<2<<"\\n"; continue;}
		if(num==n){ cout<<n+1<<"\\n"; continue;}
        cout<<3<<"\\n";
	}
	return 0;
}
//AC
#include<bits/stdc++.h>
using namespace std;
int main(){
	int T;  cin>>T;
	while(T--){
		int n, m;  cin>>n>>m;
        if(m==n){ cout<<2<<"\\n"; continue;}
		if(m==1){ cout<<n+1<<"\\n"; continue;}
        cout<<3<<"\\n";
	}
	return 0;
}

7-5

7-5 Exercise
lx大哥沉迷于RPG游戏。为了能和lx大哥一起玩游戏打副本,gxy每天做日常、打怪、氪金。有一次lx大哥打副本三缺一,gxy自告奋勇。lx大哥就想测测gxy真实的战斗力,于是就让他到训练场中测试一下伤害。

已知gxy学会了 n 个技能,他的的MP值(又叫能量值,蓝)为 m 。每个技能释放需要消耗 a 点蓝,cd(技能的冷却时间,即使用一个技能之后,都需要经过一小段时间后才能继续使用)为 b 秒,会造成 c 的伤害。请问gxy在 t s中打出的最高伤害为多少?

Note:假设技能不需要读秒(吟唱时间为无穷小 ),技能之间是独立的,互不共享cd。在游戏开始时技能不处于cd中

image-20210514132007331.png

输入描述:
第一行包括整数n,m,t 。

接下来 n 行每行包含三个整数 a ,b,c 。

输出描述:
输出一个整数,表示在规定时间内打出的最高伤害。

数据范围:
0<n≤1000, 0<m≤2000, 0<t≤100, 0<a≤2000, 0<b≤100, 0<c≤1000

样例输入:
2 5 6
2 2 2
1 3 10
样例输出:
22

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
int v[maxn], w[maxn], tot;
int f[maxn];
int main(){
	int n, m, t;  cin>>n>>m>>t;
	for(int i = 1; i <= n; i++){
		int a, b, c;  cin>>a>>b>>c; 
		//b = t/b;  if(b==0)b = 1;
		b = (t-1)/b+1;
		while(b--){ v[++tot] = a;  w[tot] = c;}
	}
	for(int i = 1; i <= tot; i++)
		for(int j = m; j >= v[i]; j--)
			f[j] = max(f[j], f[j-v[i]]+w[i]);
	cout<<f[m]<<"\\n";
	return 0;
}

7-7

7-7 Great ZUST
给定一个只有小写字母的字符串s,求从s中最多能提取多少"zust"(即求s中形如"zust"的子序列的最大个数),每个位置只能被使用一次。

输入格式:
第一行一个数字 t(1≤t≤30000) ——数据的组数

在接下来的 t 行中,每行有一个字符串 s(1≤∣s∣≤200000)

保证数据中所有字符串长度总和不超过 200000

输出格式:
对于每个字符串,输出最大能提取的子序列的数量

输入样例:
4
zustzust
zzuusstt
zzust
terraria
输出样例:
2
2
1
0

#include<bits/stdc++.h>
using namespace std;
const int maxn = 200010;
int UST[maxn], ST[maxn], T[maxn];
int main(){
	int _T;  cin>>_T; //cin.get();
	while(_T--){
		string a; //getline(cin,a);
		cin>>a;
		for(int i = a.size(); i >= 0; i--){
			UST[i] = ST[i] = T[i] = 0;
		}
		int ans = 0;
		for(int i = a.size()-1; i >= 0; i--){
			T[i] = T[i+1]; ST[i] = ST[i+1]; 
			UST[i] = UST[i+1];
			if(a[i]=='t')T[i]++;
			if(a[i]=='s'){
				if(T[i]){
					ST[i]++;
					T[i]--;
				}
			}
			if(a[i]=='u'){
				if(ST[i]){
					UST[i]++;
					ST[i]--;
				}
			}
			if(a[i]=='z'){
				if(UST[i]){
					ans++;
					UST[i]--;
				}
			}
		}
		cout<<ans<<"\\n";
	}
}

以上是关于2021 ZUST,XCPC选拔赛的主要内容,如果未能解决你的问题,请参考以下文章

C++问题 时间限制1s 内存限制65536KB 描述 XCPC 是 ICPC(Internat?

XCPC真题:Little Tiger vs. Deep Monkey|Greatest Common Divisor|Array Merge

2021CCPC网络选拔赛题解

2021-4-27 CSUST 银川选拔赛补题

2021-4-27 CSUST 银川选拔赛补题

2021-4-27 CSUST 银川选拔赛补题