高考后第一次Codeforces Round 952 (Div. 4)
A Creating Words
思路:拿一个容器交换两数值即可
#include<bits/stdc++.h>
using namespace std;
const int N = 100001;
char a[N],b[N];
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s %s",a,b);
char jiaohuan = a[0];
a[0] = b[0];
b[0] = jiaohuan;
printf("%s %s\n",a,b);
}
return 0;
}
B. Maximum Multiple Sum
思路点拨:目的是找出一个整数 a,使得 a 到 n 之间所有 a 的倍数的和最大
对于任何小于等于 n 的整数 a,其倍数的和可以通过求和公式计算:
#include <iostream>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while (t--) {
int n;
scanf("%d",&n);
int op = 0;
int max_sum = 0;
// 遍历所有可能的a值,计算最大和
for (int a = 2; a <= n; a++)
{
int sum = 0;
int k = n / a; // 计算小于等于n的a的倍数的数量
for (int i = 1; i <= k; i++)
{
sum += i * a;
}
if (sum > max_sum)
{
max_sum = sum;
op = a;
}
}
printf("%d\n",op);
}
return 0;
}
C. Good Prefixes
大意:计算数组中“好”的非空前缀的数量。一个前缀是“好”的,如果它包含了一个元素,这个元素等于其他所有元素的和。
思路:前缀和,对于数组中的任意连续子数组,如果子数组的和减去其中的最大元素等于该最大元素本身,那么这个子数组就满足条件。
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int,int> pii;
#define all(a) a.begin(),a.end()
void solve()
{
int n;
scanf("%d",&n);
vector<int>a(n);
for(int i = 0;i < n;i++) scanf("%d",&a[i]);
int sum = 0,maxx = 0,cnt = 0;
for(int i = 0;i < n;i++)
{
sum += a[i];
maxx=max(maxx,a[i]);
if(sum - maxx == maxx) cnt++;
}
printf("%d",cnt);
}
signed main()
{
int t = 1;
scanf("%d",&t);
while(t-- )
solve();
return 0;
}
D. Manhattan Circle
突破点:寻找曼哈顿圆的中心点
思路:找到满足条件的最小的r值,然后通过这个r值来确定圆心的位置
我写的代码中存在两次遍历网格,然后代码中有 upperLeft 和 lowerRight 向量的首个元素(即假设的左上角和右下角的点)来计算圆心(圆心坐标计算为这两点坐标的average)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int n, m;
cin >> n >> m;
vector<vector<char>> grid(n, vector<char>(m));
vector<pair<int, int>> upperLeft, lowerRight;
// 遍历网格,收集所有 '#' 的位置
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> grid[i][j];
if (grid[i][j] == '#') {
upperLeft.push_back({i, j});
}
}
}
// 从上到下,从左到右,找到最后一个 '#'
for (int i = n - 1; i >= 0; --i) {
for (int j = m - 1; j >= 0; --j) {
if (grid[i][j] == '#') {
lowerRight.push_back({i, j});
break; // 找到最后一个即可
}
}
}
// 计算圆心
int centerX = (upperLeft[0].first + lowerRight[0].first) / 2;
int centerY = (upperLeft[0].second + lowerRight[0].second) / 2;
// 输出圆心坐标
cout << centerX + 1 << " " << centerY + 1 << endl;
}
return 0;
}
扛不住了,强度有点大,先鸽一下
本文来自博客园,作者:Alaso_shuang,转载请注明原文链接:https://www.cnblogs.com/Alaso687/p/18294772