题目链接: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)的更多相关文章

  1. 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 ...

  2. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  3. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  4. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  5. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  6. 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 ...

  7. 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 ...

  8. Codeforces Round #371 (Div. 1)

    A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...

  9. Codeforces Round #268 (Div. 2) ABCD

    CF469 Codeforces Round #268 (Div. 2) http://codeforces.com/contest/469 开学了,时间少,水题就不写题解了,不水的题也不写这么详细了 ...

  10. 贪心+模拟 Codeforces Round #288 (Div. 2) C. Anya and Ghosts

    题目传送门 /* 贪心 + 模拟:首先,如果蜡烛的燃烧时间小于最少需要点燃的蜡烛数一定是-1(蜡烛是1秒点一支), num[g[i]]记录每个鬼访问时已点燃的蜡烛数,若不够,tmp为还需要的蜡烛数, ...

随机推荐

  1. 如何挑选海外4G模组?这里有秘籍!

    今天我会告诉大家如何挑选海外4G模组,我会把优势给贴出作为参考.去过国外的都知道国外4G网络各种状况实在让人无力吐槽,做海外设备的朋友,是时候了解一下Air780EEN/EEU/EEJ系列海外模组-- ...

  2. 一文讲透 FPGA CDC 多bit跨时钟域同步-hand-shanking机制

    一.背景 数据的跨时钟域处理是FPGA开发过程中的常见问题,存在两种情况 慢时钟向快时钟同步:只需在快时钟域打两拍即可.其RTL如下: 打拍同步的原理:大家在初学FPGA时,经常听过FPGA中对信号打 ...

  3. STATA数据统计软件学习记录

    STATA是一个数据统计软件,正如它的名字一样,STATA=statistic+data.STATA软件的功能和matlab类似,也可以用代码实现数据的统计与可视化.但几乎只能进行整行整列的数据处理, ...

  4. 深入理解ReferenceQueue GC finalize Reference

    关于对象如何销毁以及finalize更详细的信息 目录 概述 1 先看一个对象finalize的顺序问题. 2 对象再生及finalize只能执行一次 3 SoftReference WeakRefe ...

  5. LonEle 操作的 SQL Server 数据库(msde2000)由 20180418 版更新至 20190328 版(非官方)

    Shanghai Mitsubishi Elevator Co., Ltd(上海三菱电梯有限公司) 的 Comprehensive Elevator Monitoring System (电梯综合监控 ...

  6. NFS服务搭建过程

    NFS服务 [1].nfs配置 作用: 解决数据一致性问题 NFS服务程序的配置文件为/etc/exports,需要严格按照共享目录的路径 允许访问的NFS客户端(共享权限参数)格式书写,定义要共享的 ...

  7. 【C#】【平时作业】习题-5-类的基础知识

    一.概念题 1. 举例说明什么是类,什么是对象,并说明类与对象的关系? 类:具有相同特性(数据元素)和行为(功能)的对象的抽象就是类. 对象:对象是人们要进行研究的任何事物,它不仅能表示具体的事物,还 ...

  8. 第 5 章 Debian 系统中可用的软件

    目录 5.1. Debian GNU/Linux 收录了哪些类型的应用程序和开发工具? 5.2. 谁编写了所有这些软件? 5.3. 我应该如何获得一份 Debian 打包的程序的最新列表? 5.4. ...

  9. Qt开源作品19-通用数据库翻页查询

    一.前言 在Qt与数据库结合编程的过程中,记录一多,基本上都需要用到翻页查看记录,翻页有个好处就是可以减轻显示数据的表格的压力,不需要一次性将数据库表的记录全部显示,也基本上没有谁在一页上需要一次性显 ...

  10. [转]axios 的理解和使用

    有废话少说,直接附上原文链接: axios 的理解和使用 axios.create(对axios请求进行二次封装) 拦截器 取消请求(axios.CancelToken) 其它链接: 1.axios中 ...