CODEFORCES ROUND 1127 DIV2

CODEFORCES ROUND 1127 DIV2

A对称变换

由题意知道 是求一个p点的坐标 是的原位置pos = 0 的整数在与 p a1 a2 a3 ... an 做对称后为0

关键是知道一个数关于另一个数对称 比如 a 关于 b 对称 对称点的坐标为 2b - a;

复制代码
#include <iostream>
#include <vector>
using namespace std;
int main(){
	int t ; cin >> t;
	while(t--){
		int n ; cin >> n;
		vector<int> a(n+1);
		for(int i = 1 ; i <= n ; i++) cin >> a[i];
		int p = 0;
		for(int i = 1 ; i <= n ; i++){
			if(i % 2 == 0) p -= a[i];
			else p += a[i];
		}
		cout << p << endl;
	}
	return 0;
}

B.前缀

本题目求一个数组 从ai(i>=2) 开始 把ai 替换为 ai - s ai ai + s 后,其中最大元素的最大值

拿到此题 我们可以先对 s 进行分析 s = a1 + ... + ai-1 在替换完后 新s = ai ai + s ai + 2s 三种情况

由于是对ai进行替换 因此最大值也与s有关 我们可以维护一个mn存储s到ai的最小值 mx存储最大值 然后把ai + abs(mn) 和 ai + abs(mx) 相互比较即可

c++ 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
	int t; cin >> t;
	while(t--){
		int n; cin >> n;
		vector<long long> a(n+1);
		for(int i = 1 ; i <= n ; i++) cin >> a[i];
		long long  ans = a[1] , mn = a[1] , mx = a[1];
		for(int i = 2 ; i <= n ; i++){
			ans = max(ans,max(a[i]+abs(mn),a[i] + abs(mx)));
            mn = a[i] + 2*min(0LL,mn);
            mx = a[i] + 2 * max(0LL,mx);
		}
        cout << ans << endl;
	}
    return 0;
}

C.L的橙子

这道题是让构造一个数组 放袋子的编号 第i个橙子就放入搭配ai

的袋子里面 然后监管者会取出其中放s个橙子的所有袋子 ,这就是cost,向办法让cost 尽可能小

贪心 可以假设最小cost 为K 那么最多可以支持的橙子数就是 for(int i = 1 ; i <= k ; i++) sum += i * (k / i)

找到最小的K之后关键就是构造了 这里要从后往前构造 具体如下

c++ 复制代码
#include <iostream>
#include <vector>
using namespace std;
int main(){
    int t; cin >>t;
    while(t--){
        int n ; cin >> n;
        vector<int> a;
        int l = 1 , r = n;
        while(l < r){
            int mid = l + (r - l) / 2;
            long long sum = 0;
            for(int i = 1 ; i <= mid ; i++) sum += i * (mid/ i);
            if(sum >= n) r = mid;
            else l = mid + 1;
        }
        int k = l; // mincost
        //构造数组
        int idx = 1 , rem = n;
        for(int i = k ; i >= 1 ; i--){//每袋子放k个
            int cnt = min(k / i , rem / i); //袋子数
            for(int p = 0 ; p < cnt ; p++){
                for(int q = 0 ; q < i ; q++)
                    a.push_back(idx);
                  idx++;
            }
           rem -= i * cnt;
        }
        cout << k <<  endl;
       for(int i = 0 ; i < n ; i++) cout << a[i] << " ";
        cout << endl;
	}
    return 0;

}

D.机器人锦标赛(1900)

本文关键是把二维转换成一维 根据 机器人的运动方式 r + 1 c + 1 r-1 c-1 发现S = r + c S 会 + 1 或者 -2 无论如何都会让余数+1

注意到 v = r + c

d = S - V;

对其进行n-2次调整找到d是3的倍数就一定可以找到机器人

复制代码
#include <iostream>
#include <vector>
using namespace std;
int main(){
	int t ; cin >> t;
	while(t--){
		int n ; cin >> n;
		vector<int> ans;
		if(n==2) ans = {3,3,3};
		else{
			for(int i = 0 ; i < 3 ;i++){
				int st = 2 * n -2 , ed = 4;
				if(i == 1 && n - 2 % 3 == 0){
					st = 2 * n - 1;
					ed = 3;
				}
				for(int v = st ; v >= d ; v-=2 ){
					ans.push_back(v);
				}
			}
		}
		cout << ans.size() << endl;
		for(auto v : ans) cout << v << " ";
		cout << endl;
	}
	return 0;
}
相关推荐
盛世宏博北京1 小时前
档案库房恒温恒湿消毒净化一体机与3D可视化平台联动调试笔记
开发语言·php·温湿度·档案室
Nuanyt1 小时前
LeetCode Hot 100 链表专题(四)· 3 题(Java)
java·算法·leetcode·链表·双指针
灯澜忆梦1 小时前
LeetCode 1861. 旋转盒子|Go 双指针解法
算法
软件派2 小时前
生产动态数据智能风控:阈值判别、趋势预测、异常识别算法工程落地实战
前端·数据库·算法
悠仁さん9 小时前
【C++】AVL 树
c++
wuminyu9 小时前
JVM规范学习总结:解释器与JIT编译器如何处理JVM字节码
java·linux·c语言·jvm·c++
小徐不徐说10 小时前
序列化与反序列化:把 C++ 对象可靠地保存下来
开发语言·数据库·c++·php
ZhengEnCi10 小时前
模型训练完整流程:从数据准备到模型上线的 10 个关键步骤(全文可跑)
后端·算法
ragnwang10 小时前
Notes: Python pybind11 import C++ module
开发语言·c++·python