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

codeforces1914 C~F

C - Quests

要解释第 i 个任务,前面的任务必须全部解锁。解锁后,剩余的次数可以重复做前面的任务。

先记录解锁到第 i 个任务的总经验值,记录前 i 个任务的最大值。

解锁到第 i 个,让剩余次数乘前面任务中b最大的。

如果k>nk>nk>n 再算 max(sum,sa[i]+t∗mb[i])max(sum, sa[i] + t*mb[i])max(sum,sa[i]+tmb[i])

#include<iostream>
#include<map>
#include<vector>
#include<string>
using namespace std;
void solve() {int n, k;cin >> n >> k;vector<int>a(n), b(n);vector<int>sa(n, 0), mb(n, 0);for (int i = 0; i < n; i++) cin >> a[i];for (int i = 0; i < n; i++)	cin >> b[i];sa[0] = a[0];for (int i = 1; i < n; i++)	sa[i] = sa[i - 1] + a[i];//前缀ai和mb[0] = b[0];for (int i = 1; i < n; i++)	mb[i] = max(b[i], mb[i - 1]);//前bi中最大的int sum = 0;for (int i = 0; i < min(n, k); i++) {int t = k - 1 - i;sum = max(sum, sa[i] + t*mb[i]);}if (k > n) {sum = max(sum, sa[n - 1] + mb[n - 1] * (k - n));}cout << sum << endl;}
int main() {int T;cin >> T;while (T--) {solve();}
}

D - Three Activities

三个日子x,y,zx,y,zx,y,z ,要a[x]+b[y]+c[z]a[x]+b[y]+c[z]a[x]+b[y]+c[z] 最大。并且 x==y∣∣x==z∣∣y==zx==y||x==z||y==zx==y∣∣x==z∣∣y==z 这样的日子是不行的。

先找出每个数组前三个最大的,记录元素的值和下标。再枚举所有组合3∗3=273*3=2733=27 种。找最大值

#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
#include <functional>
using namespace std;
typedef long long ll;
bool cmp(pair<int, int>a, pair<int, int>b) {return a.first > b.first;
}
void solve() {int n;cin >> n;vector<pair<int, int>>a, b, c;for (int i = 0; i < n; i++) {int x;cin >> x;a.push_back({x, i});}for (int i = 0; i < n; i++) {int x;cin >> x;b.push_back({x, i});}for (int i = 0; i < n; i++) {int x;cin >> x;c.push_back({x, i});}sort(a.begin(),a.end(),cmp);sort(b.begin(),b.end(),cmp);sort(c.begin(),c.end(),cmp);ll mx=0;for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {for (int k = 0; k < 3; k++) {if(a[i].second==b[j].second||a[i].second==c[k].second||b[j].second==c[k].second) continue;mx=max((ll)(a[i].first+b[j].first+c[k].first),mx);}}}cout<<mx<<endl;
}
int main() {int T;cin >> T;while (T--) {solve();}
}

E - Game with Marbles (Easy )

两人轮流选,爱丽丝要最大化得分,鲍勃要最小化得分。用dp数组存每个状态的最优贡献。

mask 二进制位为1表示被选,0:未选的。

dp[mask]dp[mask]dp[mask] 表示选 mask 时,双方的最优策略。最终答案是 dp[0]dp[0]dp[0]

__builtin_popcount(mask)\_\_ builtin\_popcount(mask)__builtin_popcount(mask) 统计 mask 中二进制1的个数。为偶数时爱丽丝选,奇数鲍勃选。


dp+逆序遍历+位掩码

为什么逆序遍历?

计算 dp[mask]dp[mask]dp[mask] 时,需要依赖 “选了一个新颜色后的状态” t 的dp[t]dp[t]dp[t] 的值。

k==nk == nk==n 时,mask=(1<<n)−1mask = (1<<n)-1mask=(1<<n)1(二进制全 1),没有可再选的颜色,游戏结束,贡献为 0。

mask&(1<<j)mask \& (1 << j)mask&(1<<j) 判断整数mask的第 j 个二进制位是否为1,看该颜色是否被选。非0->颜色已选 就跳过

mask∣(1<<j)mask | (1 << j)mask(1<<j) 选择颜色 j 将整数mask第 j 个二进制位设置为1其他位不变,来更新状态。实现状态转移


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve() {int n;cin >> n;vector<ll>a(n), b(n);for (int i = 0; i < n; i++) cin >> a[i];for (int i = 0; i < n; i++) cin >> b[i];vector<ll>dp(1 << n, 0);for (int mask = (1 << n) - 2; mask >= 0; mask--) {int k = __builtin_popcount(mask);if (k % 2 == 0) {//爱丽丝dp[mask] = -1e18;for (int j = 0; j < n; j++) {if (mask & (1 << j)) continue;int t = mask | (1 << j);dp[mask] = max(dp[mask], a[j] - 1 + dp[t]);}} else {//鲍勃dp[mask] = 1e18;for (int j = 0; j < n; j++) {if (mask & (1 << j)) continue;int t = mask | (1 << j);dp[mask] = min(dp[mask], 1 - b[j] + dp[t]);}}}cout << dp[0] << endl;}
int main() {int T;cin >> T;while (T--) {solve();}
}

F - Game with Marbles (Hard )

方法二:贪心

对于选择问题,谁先选哪个元素会影响总得分。

假设只有两种元素,x=(a1,a2)x=(a_1,a_2)x=(a1,a2) y=(b1,b2)y=(b_1,b_2)y=(b1,b2) ,爱丽丝先选有两种情况:

  • 爱丽丝选 x ,鲍勃选 y :(a1−1)+(1−b2)=a1−b2(a_1-1)+(1-b_2)=a_1-b_2(a11)+(1b2)=a1b2
  • 爱丽丝选 y , 鲍勃选 x :(a2−1)+(1−b1)=a2−b1(a_2-1)+(1-b_1)=a_2-b_1(a21)+(1b1)=a2b1

(a1−b2)−(a2−b1)=(a1+b1)−(a2+b2)(a_1-b_2)-(a_2-b_1)=(a1 + b1) - (a2 + b2)(a1b2)(a2b1)=(a1+b1)(a2+b2)

如果a1 + b1 > a2 + b2:第一种顺序(先 x 后 y)总贡献更大,对爱丽丝更有利;

反之,第二种顺序更好。

所以对a[i]+b[i]a[i]+b[i]a[i]+b[i] 排序,然后两人轮流选择。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
bool cmp(pair<ll, ll>x, pair<ll, ll>y) {return x.first + x.second > y.first + y.second;
}
int main() {ios_base::sync_with_stdio(false);cin.tie(0);int t;cin >> t;while (t--) {int n;cin >> n;vector<ll> a(n), b(n);for (int i = 0; i < n; i++) cin >> a[i];for (int i = 0; i < n; i++) cin >> b[i];ll sum = 0;vector<pair<ll, ll>>c;for (int i = 0; i < n; i++) {c.push_back({a[i], b[i]});}sort(c.begin(), c.end(), cmp);for (int i = 0; i < n; i++) {if (i % 2==0) {sum += c[i].first - 1;} else sum += 1 - c[i].second;}cout << sum << '\n';}return 0;
}
http://www.dtcms.com/a/577177.html

相关文章:

  • 海外住宅ip怎么区分干净程度以及怎么选择海外住宅ip
  • 酒店团购的网站建设承德网媒
  • 在网站中动态效果怎么做网站的备案要求
  • 昭和仙君(五十八)标签票据模板服务器端技术——东方仙盟筑基期
  • Dart语言空安全概念与原理详解
  • MongoDB 查询分析
  • 如何在OnePlus手机上删除短信
  • MQTT的QoS2中四次握手与TCP的三次握手、四次挥手的异同
  • 10个css更新
  • Git 实现github仓库管理-删除指定目录下的所有文件并保留目录结构
  • INT305 Machine Learning 机器学习 Pt.6 卷积神经网络(Convolutional Neural Network)
  • 方案分享:一款基于低功耗单片机的腰腹甩脂机方案
  • 鸿蒙开发TypeScript第三课:数组
  • React 15
  • 浏览器开发者工具(尤其是 Vue Devtools 扩展)和 Vuex 的的订阅模式冲突
  • 网站建设核电程序员找工作的网站
  • 特殊三列布局需求
  • js(DOM)基础:11、DOM定义、事件、文档的加载、DOM查询1、DOM实现轮播图、DOM查询2、DOM实现全选
  • 想做个电影网站该怎么做阳春ycqq人才招聘信息
  • JavaScript的Web APIs 入门到实战(day4):DOM 进阶与日期对象(附巩固练习和案例讲解)
  • AtCoder Educational DP Contest 刷题记录Ⅰ
  • WPF CalcBinding简化判断逻辑
  • HarmonyOS NFC应用开发:构建分布式近场通信解决方案
  • Robinhood的再进化:从零佣金交易到链上金融超级应用
  • Rust开发实战之简单游戏开发(piston游戏引擎)
  • MK9019 Buck降压电路设计笔记(光伏发电应用优化版 - UVLO 7V设置)
  • 5118网站的功能郑州网站优化公司排名
  • MQTT协议之QoS0(<=1)、QoS1(>=1)、QoS2(=1)详解
  • Dify使用02-Dify集成Ollama
  • [免费]基于Python的Flask酒店客房管理系统【论文+源码+SQL脚本】