比赛链接:
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;
}