Codeforces Round 961 (Div. 2)
题目链接:Codeforces Round 961 (Div. 2)
总结:B1wa两发可惜,C出得有点小慢。
A. Diagonals
fag:贪心
Description:给定一个\(n * n\)的棋盘,给定\(k\)个棋子,每个格子只能放一个棋子,求将棋子全部放入棋盘,至少需要占几条对角线。
Solution:求最少占用,显然贪心处理,从最长的对角线开始占用,对角线长度为\(n, n - 1, n - 1, n - 2, n - 2, ..., 1, 1\)。
void solve(){
cin >> n >> k;
int res = 0;
if (k == 0){
cout << 0 << endl;
}
else{
if (k <= n)
cout << 1 << endl;
else{
res = 1;
k -= n;
for (int i = n - 1; i; i --){
k -= i;
res ++;
if (k <= 0){
cout << res << endl;
return;
}
k -= i;
res ++;
if (k <= 0){
cout << res << endl;
return;
}
}
}
}
}
B1. Bouquet (Easy Version)
fag: 模拟
Description:有\(n\)种花,每种花只用一朵,每种花的花瓣为\(a_i\),售价也为\(a_i\)。你有\(m\)元钱,问你最多能够买到多少花瓣(任意两朵花的花瓣之差不能超过\(1\))。
Solution:easy版,解法很多。这里使用前缀和+二分。
- 先按花瓣数从小到大排序。然后开始枚举,二分找到当前花瓣 + 1的最大下标\(t\);花费不超过\(k\)的最大下标\(tt\),取\(min(t, tt)\)。
Competing:第一发细节错误;第二发没考虑到花费不超过\(k\)的下标,认为满足花瓣数的都能买。
void solve(){
cin >> n >> k;
vector<int> a(n + 1);
vector<int> s(n + 1);
for (int i = 1; i <= n; i ++){
cin >> a[i];
}
sort(a.begin(), a.end());
for (int i = 1; i <= n; i ++){
s[i] = s[i - 1] + a[i];
}
int res = 0;
for (int i = 1; i <= n; i ++){
if (a[i] > k)
continue;
int t = upper_bound(a.begin() + 1, a.end(), a[i] + 1) - a.begin();
int tt = upper_bound(s.begin() + 1, s.end(), s[i - 1] + k) - s.begin();
if (tt <= t){
res = max(res, s[tt - 1] - s[i - 1]);
}
else{
res = max(res, s[t - 1] - s[i - 1]);
}
}
cout << min(k, res) << endl;
}
B2. Bouquet (Hard Version)
fag:思维 + 贪心
Description:与easy的区别为,每种花有\(c_i\)朵。
Solution:考虑使用花瓣数为\(i\)和\(i +1\)的花,先尽可能使用买第一种花,剩下的买第二种花;然后尽可能使用第二种花替代第一种花即可。
Competing:应该是能想到的吧,毕竟只能买两种花
void solve(){
cin >> n >> k;
vector<pii> a(n);
for (int i = 0; i < n; i ++)
cin >> a[i].fi;
for (int i = 0; i < n; i ++)
cin >> a[i].se;
sort(a.begin(), a.end());
int ans = 0;
for (int i = 0; i < n; i ++){
// 尽可能买第一种花
int t = k / a[i].fi;
t = min(t, a[i].se);
ans = max(ans, t * a[i].fi);
if (a[i].fi + 1 != a[i + 1].fi || i + 1 == n)
continue;
// 剩下的买第二种花
int res = k - t * a[i].fi;
int tt = res / a[i + 1].fi;
tt = min(tt, a[i + 1].se);
res = res - tt * a[i + 1].fi;
ans = max(ans, k - res);
if (t == 0)
continue;
// 还剩多少
tt = a[i + 1].se - tt;
ans = max(ans, k - res + max(0LL, min({res, tt, t})));
if (ans == k){
cout << ans << endl;
return;
}
}
cout << ans << endl;
}
C. Squaring
fag:分析
Description:给定一个数组,可以执行任意次操作,每次操作将每个数变为它的平方,求该数组变为不递减数组的最小操作次数。
Solution:显然,我们直接从前往后操作即可,但是直接平方会导致数很大,从而爆longlong。
- 那我们试试记录前面的数执行了多少次操作,根据开始两数之前的关系能否得出该数应该执行的操作次数。
- 对两个数取对数,\(2^xa_{i} <= 2^ya_{i+ 1}\),我们发现两个数的操作次数\(x, y\)只与最开始的值有关。
- 我们开始预处理:如果\(a[i] < a[i - 1]\),我们令\(b[i]\)为\(a[i] >= a[i - 1]\)的操作次数;如果\(a[i] == a[i - 1]\),令\(b[i] == 0\)。如果\(a[i] > a[i - 1]\),令\(b[i]\)等于负的\(a[i - 1]\)大于等于\(a[i]\)的操作次数,相当于可以少执行几次操作。但是我们要注意如果刚好可以令\(a[i] == a[i - 1]\),那么\(b[i]\)不变,否则\(b[i]\)需要加\(1\),因为此时\(a[i - 1] > a[i]\)了。
void solve(){
cin >> n;
vector<int> a(n);
vector<int> b(n);
for (int i = 0; i < n; i ++){
cin >> a[i];
}
int ans = 0;
for (int i = 1; i < n; i ++){
if (a[i] < a[i - 1]){
if (a[i] == 1){
cout << -1 << endl;
return;
}
else{
int t = a[i];
int c = 0;
while (t < a[i - 1]){
t *= t;
c ++;
}
b[i] = c;
}
}
else if (a[i] == a[i - 1]){
b[i] = 0;
}
else{
int t = a[i - 1];
if (t == 1)
continue;
int c = 0;
while (t < a[i]){
t *= t;
c ++;
}
if (t == a[i])
b[i] = -c;
else
b[i] = -c + 1;
}
}
for (int i = 1; i < n; i ++){
b[i] += b[i - 1];
if (b[i] < 0)
b[i] = 0;
ans += b[i];
}
cout << max(ans, 0LL) << endl;
}
Codeforces Round 961 (Div. 2)的更多相关文章
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- Codeforces Round #279 (Div. 2) ABCDE
Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name A Team Olympiad standard input/outpu ...
- Codeforces Round #262 (Div. 2) 1003
Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...
- Codeforces Round #262 (Div. 2) 1004
Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...
- Codeforces Round #371 (Div. 1)
A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...
- Codeforces Round #268 (Div. 2) ABCD
CF469 Codeforces Round #268 (Div. 2) http://codeforces.com/contest/469 开学了,时间少,水题就不写题解了,不水的题也不写这么详细了 ...
- 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts
题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...
随机推荐
- LLM应用实战: 给个公司简称,输出公司全称
1.背景 本qiang~本周在处理手头项目工作的时候,遇到了一个问题,就是友方提供了一个公司名称列表(量不小~,因此无法人工处理),且该公司名称列表均为简称,需要与库中的全称做一个映射匹配. 看似简单 ...
- 2、oracle数据库基本概念
基本概念 一.数据库启动.监听启动.判断数据库是否可以连接的过程.感知实例的存在 虚拟机ip地址:192.168.56.12 这里需要修改一个地方:就是把本地主机Host-Only的ip地址修改为:1 ...
- JavaScript 编写的迷你 Lisp 解释器
感谢@李欲纯 的热心翻译.如果其他朋友也有不错的原创或译文,可以尝试推荐给伯乐在线.] Little Lisp是一个解释器,支持函数调用.lambda表达式. 变量绑定(let).数字.字符串.几个库 ...
- vue2-路由Router
Vue 中的路由用于实现单页应用(SPA)中的页面导航.它允许你在不刷新整个页面的情况下,根据不同的 URL 路径显示不同的组件,提供了类似于多页面应用的用户体验.例如,在一个电商应用中,可以通过 ...
- python之pyexecjs
pyexecjs是一个用Python来执行JavaScript代码的工具库,该库支持多种JavaScript运行时环境,如Node.js.PhantomJS.SlimerJS等,允许开发者在Pytho ...
- python之高级数据结构Collections
1. Collections collections模块包含了内建类型之外的一些有用的工具,例如Counter.defaultdict.OrderedDict.deque以及nametuple.其中C ...
- 使用PicGo存储markdown图片(阿里云或者github)
PicGo代替极简图床 之前使用极简床图,但是后来好像挂了,真是一件悲伤的事,最近才发现了一个神器,开源的PicGo,已经有各个平台的版本了.链接如下:https://github.com/Molun ...
- Visual Studio 2017 rc 资源文件 预处理 宏 无效
在属性c++下的预处理宏不会影响rc资源文件的,需要对rc资源文件单独设置. 右键rc资源文件,点击属性,在预处理器定义添加需要的宏
- 渗透测试-前端验签绕过之SHA256
本文是高级前端加解密与验签实战的第1篇文章,本系列文章实验靶场为Yakit里自带的Vulinbox靶场,本文讲述的是绕过SHA256签名来爆破登录. 绕过 通过查看源代码可以看到key为 123412 ...
- 小程序 + node koa2 session存储验证码碰到最大的坑,(喜极而泣 /狗头)
问题:session存验证码.本地拿postman测试了半天,都没有问题. 但到了小程序,服务端再获取(ctx.session.verifyCode)就一直提示不存在.undefined 小程序会 ...