首页 > 编程语言 >第十届中国大学生程序设计竞赛 重庆站(CCPC 2024 Chongqing Site)

第十届中国大学生程序设计竞赛 重庆站(CCPC 2024 Chongqing Site)

时间:2024-11-13 16:19:45浏览次数:1  
标签:i64 cin int vi CCPC long Site 2024 using

B. osu!mania

按照题目的公式进行计算,注意四舍五入的精度问题。

#include <bits/stdc++.h>

using namespace std;


using i32 = int32_t;
using i64 = long long;
using ldb = long double;

using vi = vector<int>;
using pii = pair<int,int>;



void solve(){
	int ppmax;
	cin >> ppmax;

	int a, b, c, d, e, f;
	cin >> a >> b >> c >> d >> e >> f;

	ldb acc = (300.0 * a + 300 * b + 200 * c + 100 * d + 50 * e) / (300.0 *(a + b + c + d + e + f));
	ldb tpp = (320.0 * a + 300 * b + 200 * c + 100 * d + 50 * e) * 5 * ppmax / (320.0 * (a + b + c + d + e + f));
	i64 pp = max(0ll, i64(round(tpp)) - 4ll * ppmax);
	cout <<fixed << setprecision(2) << acc*100.0 << "% " << pp << "\n";
	return;	 
}

i32 main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	
	int T;
	cin >> T;
	while(T --)
		solve();

	return 0;
}	

C. 连方

如果第一行第七行都是#,则全部都都是#

如果第一行第七行只有一行都是#,则无解。

否则第二行、第六行对第一行、第七行取反,这样可以把第一行和第七行所有#都联通。

然后再第三行第第五行各找一个之和第二行第六行八联通的点,然后通过第四行联通即可。

#include <bits/stdc++.h>

using namespace std;


using i32 = int32_t;
using i64 = long long;
using ldb = long double;

using vi = vector<int>;
using pii = pair<int,int>;



void solve(){
	int n;
	cin >> n;
	vector<string> a(7);
	cin >> a[0] >> a[6];
	bool f0 = false, f6 = false;
	for(auto c : a[0])
		f0 |= (c == '.');
	for(auto c : a[6])
		f6 |= (c == '.');
	if(f0 != f6) {
		cout << "No\n";
		return;
	}
	cout << "Yes\n";
	if(f0 == false) {
		for(int i = 0; i < 7; i ++) cout << a[0] << "\n";
		return;
	}
	for(int i = 1; i < 6; i ++) a[i] = string(n, '.');
	for(int i = 0; i < n; i ++)	if(a[0][i] == '.') a[1][i] = '#';
	for(int i = 0; i < n; i ++)	if(a[6][i] == '.') a[5][i] = '#';
	int l = -1, r = -1;
	for(int i = 0; i < n and l == -1; i ++) {
		if(a[1][i] == '#') continue;
		if(i - 1 >= 0 and a[1][i - 1] == '#') l = i;
		if(i + 1 < n  and a[1][i + 1] == '#') l = i;
	}

	for(int i = 0; i < n and r == -1; i ++) {
		if(a[5][i] == '#') continue;
		if(i - 1 >= 0 and a[5][i - 1] == '#') r = i;
		if(i + 1 <  n and a[5][i + 1] == '#') r = i;
	}
	a[2][l] = a[4][r] = '#';
	if(l > r) swap(l, r);
	if(l == r or l + 1 == r ){
		a[3][l] = '#';
	} else {
		for(int i = l + 1; i < r ; i ++) a[3][i] = '#';
	}
	for(int i = 0; i < 7; i ++)
		cout << a[i] << "\n";
	return;	 
}

i32 main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	
	int T;
	cin >> T;
	while(T --)
		solve();

	return 0;
}	

D. 有限小数

对于一个分数,如果是有限小数。则分母质因数分解后一定只包含\(2,5\)。设\(w\)表示为\(b\)除了\(2,5\)外的质因子乘积。则\(d=2^x5^yw\)。找规律可以发现\(d\)一定满足\(d=2^X5^Yw\)的形势。因此有\(\frac a b + \frac c d = \frac{ad+cb}{bd}=k\)。我们要求的\(k\)一定是有限小数,则一定可以表示为\(k=\frac{z}{2^{x+X}5^{y+Y}},z\in \Z\)。因此我们只要解出丢番图方程\(c\times b - z\times w ^2 = -a\times d\)的整数解,并求出\(c\)的最小正整数解即可。

#include <bits/stdc++.h>

using namespace std;


using i64 = long long;

const i64 MAXN = 1e9;
const i64 inf = LLONG_MAX / 2;

i64 exgcd(i64 a, i64 b, i64 &x, i64 &y) {
	if(b == 0){
		x = 1, y = 0;
		return a;
	}
	i64 d = exgcd(b, a % b, y, x);
	y -= a / b * x;
	return d;
}

i64 calc(i64 a, i64 b, i64 c) {
	i64 x, y;
	i64 d = exgcd(a, b, x, y);
	if(c % d != 0) return inf;
	x *= c / d;
	i64 t = abs(b / d);
	return (x % t + t) % t;
}

void solve() {
	i64 a, b;
	cin >> a >> b;

	i64 w = b;
	while(w % 2 == 0) w /= 2;
	while(w % 5 == 0) w /= 5;
	
	if(w == 1) {
		cout << "0 1\n";
		return;
	}

	i64 resc = inf, resd;
	for(i64 p5 = w; p5 <= MAXN; p5 *= 5)
		for(i64 d = p5, c; d <= MAXN; d *= 2) {
			c = calc(b, w * w, - a * d);
			if(c < resc) resc = c, resd = d;
		}
	cout << resc << " " << resd << "\n";
	return;
}

int main() {
	int T;
	cin >> T;

	while(T --)
		solve();

	return 0;
}

E. 合成大西瓜

对于度为\(1\)的点,只能是\(x,z\)。因此能保存下的只有可能是次大值。否则,则可以是\(x,y,z\),一定可以保存下最大值。

#include <bits/stdc++.h>

using namespace std;


using i32 = int32_t;
using i64 = long long;


using vi = vector<int>;
using pii = pair<int,int>;

const int inf = INT_MAX / 2;

i32 main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int n, m;
	cin >> n >> m;
	vi a(n + 1);
	for(int i = 1; i <= n; i ++) cin >> a[i];

	vi deg(n + 1);
	for(int x, y; m; m --) {
		cin >> x >> y;
		deg[x] ++, deg[y] ++;
	}

	int leaf1 = -inf, leaf2 = -inf, node = -inf;

	for(int i = 1; i <= n; i ++) {
		if(deg[i] == 1) {
			if(a[i] > leaf1) leaf2 = leaf1, leaf1 = a[i];
			else leaf2 = max(leaf2, a[i]);
		}
		else node = max(node, a[i]);
	}

	if(leaf2 == -inf) cout << node << "\n";
	else if(node == -inf) cout << leaf2 << "\n";
	else cout << max(node, leaf2);

	return 0;
}	

I. 算术

对于任意的两个数\(x,y\),如果满足\(1 < x,y\),则一定有\(xy \ge x + y\)。因为求和操作一定是至少有一个数为\(1\)。

这样的话,考虑把卡牌分成若干组,每一组内求和,组之间求积。我们可以给每一组先分配一张卡牌,然后再给某些组进行加一。

因为一个组内不能有两个大于一的数,因此组个数的变化实际上只受到了\(1\)的影响。因此我们可以枚举有多少个\(1\)作为一组。

然后我们考虑,如果\(x < y\),则一定有\((x + 1)y = xy + y > xy + x = x(y + 1)\)。因此加一操作应是对最小的组最优。我们用优先队列维护每组的和,每次对最小的组加一即可。

考虑不同的分组方案如何比较,比较乘积无法实现,但是可以比较乘积的对数。

这样的话,完全没有分类讨论。

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;
using i64 = long long;
using ldb = long double;

#define int i64

using vi = vector<int>;
using pii = pair<int,int>;

const int mod = 998244353;


void solve() {
	vi a(10);
	for(int i = 1; i <= 9; i ++) cin >> a[i];
	
	vi res;
	ldb val = 0;

	for(int i = 0; i <= a[1]; i ++) {
		priority_queue<int,vi,greater<>> heap;
		for(int j = 0; j < i; j ++)
			heap.push(1);
		for(int j = 2; j <= 9; j ++) 
			for(int k = 0; k < a[j]; k ++)
				heap.push(j);
        if(heap.empty()) continue;


		int x = a[1] - i;
		while(x --) {
			int y = heap.top();
			heap.pop();
			heap.push(y + 1);
		}
		vi ret;
		ldb ans = 0;
		while(not heap.empty()) {
			ret.push_back((i64)heap.top()), ans += log((i64)heap.top());
			heap.pop();
		}
		if(ans > val) res = ret, val = ans;
	}
	int pi = 1;
	for(auto i : res)
		pi = pi * i % mod;
	cout << pi << "\n";
	return 	;
}

i32 main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);

	int T;
	cin >> T;
	while(T --)
		solve();

	return 0;
}	

J. 骰子

观察题目,首先起始状态底面为\(6\)。观察样例,样例证明了存在一种方案可以使得右侧第一格和下边第一个底面为\(6\)。因此一定有一种方法可以使得每一格都是\(6\)。

#include <bits/stdc++.h>

using namespace std;


using i32 = int32_t;
using i64 = long long;


using vi = vector<int>;
using pii = pair<int,int>;


i32 main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	i64 n, m;
	cin >> n >> m;
	cout << n * m * 6ll << "\n";
	return 0;
}	

K. 小 C 的神秘图形

观察生成图案的方法。如果坐标的最高位都不是\(1\),则为\(0\)。否则可以递归询问。

#include <bits/stdc++.h>

using namespace std;


using i32 = int32_t;
using i64 = long long;


using vi = vector<int>;
using pii = pair<int,int>;

i32 main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int n;
	cin >> n;

	string x, y;
	cin >> x >> y;
	ranges::reverse(x), ranges::reverse(y);

	while(true){
		if((x.back() == '1') or (y.back() == '1')) {
			if(n == 1) {
				cout << 1 << "\n";
				return 0;
			} else {
				x.pop_back(), y.pop_back(), n --;
			}
		}else {
			cout << 0 << "\n";
			return 0;
		}
	}

	return 0;
}	

标签:i64,cin,int,vi,CCPC,long,Site,2024,using
From: https://www.cnblogs.com/PHarr/p/18544241

相关文章

  • NOIP 模拟赛:2024-11-11
    T1:法一:\(O(n^2)\)的DP。\(dp[i][j][0/1]\)表示在\(i\)的子树内染色,\(i\)是红/黑,使得每个要求的结点的黑点个数都等于\(j\)。法二:\(O(n)\)的神秘做法。取出最浅的被要求结点,把深度\(\le\)它的都染成黑色,其余点都染成红色。T2:对于一个元素属于\([0,2^m)\),且互不相......
  • 找靠谱网站建设公司?看这篇就够了:2024Top10榜单揭晓
    2024年进入尾声,网站建设行业又经历了一次大浪淘沙。过去一年中,有哪些表现亮眼的网站建设公司呢?今天我们就来盘点,2024评价超高的10家网站建设公司:蒙特网站蒙特网站专注于提供高端网站建设服务。凭借其独特的设计理念和强大的技术实力,蒙特网站已成为众多知名企业的首选合作伙伴......
  • NOIP2024 前集训:NOIP2024加赛 3(欢乐赛)
    前言再次考古,现在才写。这场叫欢乐赛,搬的CF,不知道OJ哪儿来的RMJ。就记得T3一直往数据结构上想浪费好多时间,结果发现是结论题\(O(n)\)可做。T1SakurakoandWater虽然我之前不知道主对角线是什么东西,但是看完题目自动把他过滤成左上角到右下角了(不知道当时怎么想的,好......
  • 2024年美国数学竞赛12年级组A卷P21:合适的一试题
    题目设数列$\{a_n\}$的首项为$a_1=2,$且当$n\geq2$时满足递推关系式$\dfrac{a_n-1}{n-1}=\dfrac{a_{n-1}+1}{(n-1)+1}.$则不大于$\displaystyle{\sum_{n=1}^{100}a_n^2}$的最大整数为 $\textbf{(A)}338550\qquad\textbf{(B)}338551\qquad\textbf{(C)}338552\qqu......
  • 2024年美国数学竞赛12年级组A卷P25:合适的一试P8
    题目满足$y=\dfrac{ax+b}{cx+d}$的图像关于直线$y=x$对称,$|a|,|b|,|c|,|d|\le5$且$c,d$不全为$0$的整数组$(a,b,c,d)$个数为 $\textbf{(A)}1282\qquad\textbf{(B)}1292\qquad\textbf{(C)}1310\qquad\textbf{(D)}1320\qquad\textbf{(E)}1330$解 分类讨论. $1^{......
  • 2024-11-13:求出所有子序列的能量和。用go语言,给定一个整数数组nums和一个正整数k, 定义
    2024-11-13:求出所有子序列的能量和。用go语言,给定一个整数数组nums和一个正整数k,定义一个子序列的能量为子序列中任意两个元素之间的差值绝对值的最小值。找出nums中长度为k的所有子序列的能量和,对结果取模10^9+7后返回。输入:nums=[1,2,3,4],k=3。输出:4。解释:nums......
  • 2024年全新WebGIS开发学习方法
    现在每天都有越来越多的企业依靠与地理信息位置相关的数据来改善运营和增加利润,包括:客户位置、货物位置等,这些数据信息现在已经成为许多业务逻辑中不可或缺的一部分。但是,很少有人同时会GIS和编程,程序员分为很多种,但是GIS开发通常是指前端+GIS开发,大部分做前端的程序员,不会G......
  • 【JetBrains GoLand 2024软件下载与安装教程】
     1、安装包GoLand2024:链接:https://pan.quark.cn/s/578b3b1d9379提取码:pn3LGoLand2021:链接:https://pan.quark.cn/s/c4c9a3112b2c提取码:i9NfGoLand2018:链接:https://pan.quark.cn/s/5b9cc3b12cab提取码:adEW2、安装教程(建议关闭杀毒软件)1)       下载并......
  • 2024年11月13日Github流行趋势
    项目名称:dockur/windows项目维护者:@kroese@renovate@hellodword@luisgmuniz@arisudesu项目介绍:在Docker容器内运行Windows。项目star数:27,382项目fork数:1,909项目名称:exo-explore/exo项目维护者:@AlexCheema@blindcrone@DevEmilio96@GaetanLepage@ianpaul10......
  • 【JetBrains DataGrip 2024软件下载与安装教程】
    1、安装包datagrip2024:链接:https://pan.quark.cn/s/60f7993eae45提取码:TfaJdatagrip-2023.3.2:链接:https://pan.quark.cn/s/d65297b4e648提取码:6CdA2、安装教程(建议关闭杀毒软件)1)       解压下载安装包,双击datagrip-2024.1.2.exe安装,弹窗安装对话框  2)......