高考后第一次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;
}

扛不住了,强度有点大,先鸽一下

posted @ 2024-07-10 18:17  Alaso_shuang  阅读(4)  评论(0编辑  收藏  举报
2 3
4