博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CF1066 ABCD
阅读量:5239 次
发布时间:2019-06-14

本文共 2905 字,大约阅读时间需要 9 分钟。

A

题目链接:

思路: 类似前缀和暴力搞一下

code:

#include 
using namespace std;int T, L, V, l, r;template
inline void read(T &t) { ; }int main() { scanf("%d", &T); while(T--) { int ans = 0; scanf("%d %d %d %d", &L, &V, &l, &r); printf("%d\n", L / V - r / V + (l - 1) / V); } return 0;}

B

题目链接:

思路: 贪心的另一种思路,先假设所有的加热器全部开启,此时如果还有地方没有被加热到,输出-1,

从左到右扫描每一个加热器,如果它的范围内所有的加热叠加次数都大于1,这个加热器就可以被去掉,对答案没有影响

code:

#include 
using namespace std;const int N = 2e5;int n, a[N], cnt[N], ans = 0, r;int main() { scanf("%d %d", &n, &r); for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); if(a[i]) { ans++; for(int j = max(1, i - r + 1); j <= min(n, i + r - 1); j++) { cnt[j]++; } } } for(int i = 1; i <= n; i++) { if(!cnt[i]) return printf("-1\n"), 0; } for(int i = 1; i <= n; i++) { bool fl = true; if(a[i]) { for(int j = max(1, i - r + 1); j <= min(n, i + r - 1); j++) { if(cnt[j] == 1) { fl = false; break; } } } if(fl && a[i]) { ans--; for(int j = max(1, i - r + 1); j <= min(n, i + r - 1); j++) { cnt[j]--; } } } printf("%d\n", ans); return 0;}

C

题目链接:

思路:乍一看想写splay了...维护两个指针 l 和 r 代表当前往右边选到哪儿,往左边选到哪儿,

每个书的id和l或r用map映射一下,查询的时候输出min(这个id的映射值减去当前右边选到哪儿,当前左边选到哪儿减这个id的映射值)

需要特判一下第一本插入的书

code:

#include 
using namespace std;const int N = 2e5 + 5;int n, idx = 500000, _idx = 500000;char opt;map
mps; // id , num int main() { scanf("%d", &n); bool fl = false; for(int i = 1, id; i <= n; i++) { cin >> opt >> id; if(opt == 'L') { if(!fl) { fl = true; mps[id] = idx; } else idx--, mps[id] = idx; } else { if(opt == 'R') { if(!fl) { fl = true; mps[id] = idx; } else _idx++, mps[id] = _idx; } else { printf("%d\n", min(mps[id] - idx, _idx - mps[id])); } } } return 0;}

D

题目链接:

思路:怎么越来越简单了...从右边直接开始模拟取,方案不可行的时候直接输出

Code:

#include 
using namespace std;const int N = 2e5 + 5;const int INF = 0x3f3f3f3f;typedef long long ll;int n, m, k, a[N];int main() { cin >> n >> m >> k; for(int i = 1; i <= n; i++) { cin >> a[i]; } ll tmp = 0, sum = 0; for(int i = n; i >= 1; i--) { if(sum + a[i] > k) { tmp++, sum = a[i]; if(tmp >= m) { printf("%d\n", n - i); return 0; } } else { sum += a[i]; } } printf("%d\n", n); return 0;}/*5 4 21 2 1 2 1*/

转载于:https://www.cnblogs.com/chloristendika/p/9912192.html

你可能感兴趣的文章
Jquery操作cookie,实现简单的记住用户名的操作
查看>>
中文系统 上传file的input显示英文
查看>>
比callback更简洁的链式执行promise
查看>>
android permission
查看>>
【译】在Asp.Net中操作PDF - iTextSharp - 使用字体
查看>>
.net 文本框只允许输入XX,(正则表达式)
查看>>
实验2-2
查看>>
MongoDB遇到的疑似数据丢失的问题。不要用InsertMany!
查看>>
android smack MultiUserChat.getHostedRooms( NullPointerException)
查看>>
IOS Google语音识别更新啦!!!
查看>>
[置顶] Linux终端中使用上一命令减少键盘输入
查看>>
BootScrap
查看>>
【Python学习笔记】1.基础知识
查看>>
梦断代码阅读笔记02
查看>>
selenium学习中遇到的问题
查看>>
[Linux]PHP-FPM与NGINX的两种通讯方式
查看>>
Java实现二分查找
查看>>
架构图-模型
查看>>
黑马程序员_Java基础枚举类型
查看>>
UIImage 和 iOS 图片压缩UIImage / UIImageVIew
查看>>