其他分享
首页 > 其他分享> > CCPC2020网络预选赛(vp)

CCPC2020网络预选赛(vp)

作者:互联网

比赛链接:

https://vjudge.net/contest/513012

C - Express Mail Taking

题意:

有 \(n\) 个箱子,分别在 \(a_1, a_2, ..., a_n\) 的位置,钥匙在 \(k\) 的位置,每去打开一个箱子前都要去拿一次钥匙,刚开始在 1 的位置,问最少花几步打开所有箱子后回到 1。

思路:

位置比 \(k\) 远的箱子所花的时间肯定是 \(2 * (a_i - k)\)。而在 1 到 \(k\) 之间的箱子,拿了钥匙去开最后一个箱子之后就可以直接回到起点了。
根据贪心的策略,肯定是最接近 1 的那个拿了之后直接回到起点,直接计算就行了。

代码:

#include <bits/stdc++.h>
using namespace std;
#define LL long long
void solve(){
	LL n, m, k;
	cin >> n >> m >> k;
	LL ans = k - 1, mn = 1e9;
	for (int i = 0; i < m; i ++ ){
		LL x;
		cin >> x;
		ans += 2 * abs(x - k);
		if (x < k){
			mn = min(mn, x);
		}
	}
	if (mn != 1e9){
		ans = ans - (k - mn) + mn - 1;
	}
	else{
		ans += k - 1;
	}
	cout << ans << "\n";
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);
	int T = 1;
	cin >> T;
	while(T -- ){
		solve();
	}
	return 0;
}

G - CCPC Training Class

题意:

给定一个字符串,判断哪个字母最多。

思路:

简单签到。

代码:

#include <bits/stdc++.h>
using namespace std;
#define LL long long
void solve(){
	string s;
	cin >> s;
	map <char, int> cnt;
	for (auto c : s)
		cnt[c] ++ ;
	int ans = 0;
	for (auto x : cnt)
		ans = max(ans, x.second);
	cout << ans << "\n";
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);
	int T = 1;
	cin >> T;
	for(int i = 1; i <= T; i ++ ){
		cout << "Case #" << i << ": ";
		solve();
	}
	return 0;
}

J - Reports

题意:

给定长为 \(n\) 的序列,判断有没有相邻且一样的元素。

思路:

简单签到。

代码:

#include <bits/stdc++.h>
using namespace std;
#define LL long long
void solve(){
	int n;
	cin >> n;
	vector <int> a(n);
	for (int i = 0; i < n; i ++ )
		cin >> a[i];
	for (int i = 1; i < n; i ++ ){
		if (a[i - 1] == a[i]){
			cout << "NO\n";
			return;
		}
	}
	cout << "YES\n";
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);
	int T = 1;
	cin >> T;
	while(T -- ){
		solve();
	}
	return 0;
}

K - 3x3 Convolution

题意:

给定一个 \(n * n\) 的矩阵 \(A\),3 * 3 的矩阵 \(K'\)。
\(K_{i, j} = \frac{K^{'}{i, j}}{\sum_{x = 1}^{3} \sum_{y = 1}^{3} K^{'}{x, y}}\)
定义 \(C(A, K)\) 为 \(C_{x, y} = \sum_{i = 1}^{min(n - x + 1, 3)} \sum_{j = 1}^{min(n - y + 1, 3} A_{x + i - 1, y + j - 1} K_{i, j}\)。
\(C^{m}(A, K) = C(C^{m - 1}(A, K), K), C^{1}(A, K) = C(A, K)\)。
求 \(\lim\limits_{t\rightarrow\infty}C^{t}(A, K)\)。

思路:

容易发现只有当 \(K'\) 矩阵为
x 0 0
0 0 0
0 0 0
时,最后才能得到 \(A\) 矩阵,否则,因为是趋向正无穷,所以矩阵最后每一个元素最后都会趋向 0。

代码:

#include <bits/stdc++.h>
using namespace std;
#define LL long long
void solve(){
	int n;
	cin >> n;
	vector < vector<int> > a(n + 1, vector<int>(n + 1));
	for (int i = 1; i <= n; i ++ )
		for (int j = 1; j <= n; j ++ )
			cin >> a[i][j];
	vector < vector<int> > k(4, vector<int>(4));
	int cnt1 = 0, cnt2 = 0;
	for (int i = 1; i <= 3; i ++ ){
		for (int j = 1; j <= 3; j ++ ){
			cin >> k[i][j];
			if (i == 1 && j == 1) cnt1 = k[i][j];
			else cnt2 += (k[i][j] > 0);
		}
	}
	if (cnt1 && !cnt2){
		for (int i = 1; i <= n; i ++ )
			for (int j = 1; j <= n; j ++ )
				cout << a[i][j] << " \n"[j == n];
	}
	else{
		for (int i = 1; i <= n; i ++ )
			for (int j = 1; j <= n; j ++ )
				cout << 0 << " \n"[j == n];
	}
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);
	int T = 1;
	cin >> T;
	while(T -- ){
		solve();
	}
	return 0;
}

标签:CCPC2020,int,LL,预选赛,long,vp,vector,solve,ans
来源: https://www.cnblogs.com/Hamine/p/16661610.html