当前位置: 首页 > ds >正文

Codeforces Round 1023 (Div. 2) ABC

链接 

Dashboard - Codeforces Round 1023 (Div. 2) - Codeforces

A

将数组a分成两组,使得gcd(b) != gcd(c)

思路

gcd(a,b) <= min(a,b)

求数组a的max,min

如果数组a都一样无解 (即max == min

否则有解:让是max的一组,不是max的放另一组

代码

粘一下题解的吧

#include <bits/stdc++.h>
using namespace std;int main(){int t; cin >> t;while (t--){int n; cin >> n;vector <int> a(n);for (int i = 0; i < n; i++){cin >> a[i];}int mn = *min_element(a.begin(), a.end());int mx = *max_element(a.begin(), a.end());if (mn == mx){cout << "No\n";continue;}cout << "Yes\n";for (int i = 0; i < n; i++){cout << (1 + (a[i] == mx)) << " \n"[i + 1 == n];}}return 0;
}

B 博弈+思维

思路

要满足max - min <= k,最优的就是取最大的减,tom先max --,再计算max - min,如果 > k,tom一开始就输了,

只要tom第一次能操作,则jeryy一定不会出现max - min > k( jerry也同样取max--),这样下来,输的情况就只有数组全为0;每次操作只会-1,只要计算sum,奇数tom赢,偶数Jerry赢

代码

void solve()
{cin >> n >> k;LL sum = 0;for (int i = 1;i <= n;i ++) {cin >> a[i];sum += a[i];}sort(a + 1,a + 1 + n);a[n] --;sort(a + 1,a + 1 + n);if (a[n] - a[1] > k) cout << "Jerry" << endl;else {if (sum & 1) cout << "Tom" << endl;else cout << "Jerry" << endl;}}

 

C 最大字段和+构造

思路

1.先求出每一段已知的a[i]的和sum,如果存在一段和>k,无解

                                                        如果存在sum == k,标记存在

2.如果a数组全为已知,且存在最大字段和 == k,有解;否则无解

3.此时每一段的sum都 <= k,且存在未知的a[i];找一个未知的a[i],将其置为 k - pre - suf,其他未知的a[i]=-inf;suf为最大的后缀,pre为最大的前缀

 代码

const int N = 2e5 + 10;
const LL inf = 1e18;LL n,m,k;
// vector<LL> a;
LL a[N];
char s[N];void solve()
{cin >> n >> k;for (int i = 1;i <= n;i ++) cin >> s[i];	for (int i = 1;i <= n;i ++) cin >> a[i];LL sum = 0;bool hasK = false;LL c1 = 0;for (int i = 1;i <= n;i ++){if (s[i] == '0'){sum = 0;continue;}c1 ++;sum = max(sum,0LL) + a[i];//最大字段和if (sum > k){cout << "No" << endl;return;}else if (sum == k) hasK = true;}if (c1 == n)//全1{if (!hasK) cout << "No" << endl;else {cout << "Yes" << endl;for (int i = 1;i <= n;i ++)  cout << a[i] << " ";cout << endl;}return;}for (int i = 1;i <= n;i ++){if (s[i] == '0'){LL l = i - 1,r = i + 1;LL suf = 0,pre = 0,t = 0;while(l >= 1 && s[l] == '1'){t += a[l];suf = max(suf,t);l --;}t = 0;while(r <= n && s[r] == '1'){t += a[r];pre = max(pre,t);r ++;}a[i] = k - suf - pre;cout << "Yes" << endl;for (int j = 1;j <= n;j ++){if (s[j] == '0')cout << (j == i ? a[j] : -inf) << " ";else cout << a[j] << " ";}cout << endl;return;}}
}

http://www.xdnf.cn/news/4432.html

相关文章:

  • 空间内任意点到直线和平面的距离推导
  • 凌晨三点的数据库崩溃现场
  • C#中读取文件夹(包含固定字样文件名)
  • CentOS7 联网在线安装docker
  • 江西建筑安全员C3证考试精选练习题
  • PostgreSQL数据库的array类型
  • Java基础问题——八股盛宴 | 3w字分享
  • vitepress 复杂环境引入 mermaid
  • OpenCV 图形API(81)图像与通道拼接函数-----透视变换函数warpPerspective()
  • 如何提升丢包网络环境下的传输性能:从 TCP 到 QUIC,再到 wovenet 的实践
  • 小程序问题(记录版)
  • 文化符号与隐形的社会话语权力:解码布尔迪厄理论下的意识形态操控机制
  • Python Bug 修复案例分析:函数参数传递引发的逻辑错误修复
  • 第1.2讲、从 RNN 到 LSTM 再到 Self-Attention:深度学习中序列建模的演进之路
  • WiFi那些事儿(五)
  • 《Attention Is All You Need》transform算法解读
  • 深入理解West:介绍、使用及与Repo的对比
  • LLM评估指标:WSC和WebNLG 是什么
  • EASM外部攻击面管理平台
  • kubernetes
  • 8.软考高项(信息系统项目管理师)-沟通管理
  • 相同的数(简单)
  • HCIP(OSPF的优化)
  • LeetCode:二叉树的中序遍历
  • 【C++核心技术深度解析:从继承多态到STL容器 】
  • 聊天助手提示词调优案例
  • 力扣热题100,力扣49.字母异位词分组力扣128.最长连续序列力扣.盛水最多的容器力扣42.接雨水(单调栈)
  • 城市开发杂志城市开发杂志社城市开发编辑部2025年第5期目录
  • 免费开源且离线的图片放大工具
  • RS485/modbus转profibus DP转换网关