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;
}