博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #298 (Div. 2)
阅读量:6787 次
发布时间:2019-06-26

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

  前几天的比赛,很久没做题了,加上前几题数学成分重,只过了一题,简单写下。

A. Exam

  构造数列,满足相邻两个数之差大于1。比较容易得出的结论是,个数比较大的时候,是完全可以奇偶分开

  e.g: 1 3 5 7 9 2 4 6 8  这样是没有问题的,需要考虑个数少的时候情况特殊,1~4分开列出答案。需要主要4个数是可以2 4 1 3 这样排的。

  我没正确考虑4个数情况,WA了两次。

 

#include 
#include
#include
using namespace std;int n;int main(){#ifdef LOCAL freopen("534A.in", "r", stdin);#endif cin >> n; if (n >= 5) { cout << n << endl; for (int i = 1; i <= n; i+=2) cout << i << ' '; for (int i = 2; i <= n; i+=2) cout << i << ' '; cout << endl; } else { if (n == 1) cout << "1\n1\n"; else if (n == 2) cout << "1\n1\n"; else if (n == 3) cout << "2\n1 3\n"; else if (n == 4) cout << "4\n2 4 1 3\n"; } return 0;}

  

B. Covered Path

  贪心,保证在尽量多的点上速度都是尽量大的?如果时间内能加速到vt,那么比较显然的最优方案是一开始就按最大加速度,而最后的时候最大加速度(减速)

    模拟的方法来完成,随时计算vt+t(remain)×d确保剩下时间能减速到vt,没讲太明白,见代码吧

 

#include 
#include
#include
using namespace std;int v0, vt, vh, t, d, s;int main(){#ifdef LOCAL freopen("534B.in", "r", stdin);#endif cin >> v0 >> vt; cin >> t >> d; if (v0 > vt) swap(v0, vt); t -= 1; vh = v0; s = v0; while (vh <= vt+(t-1)*d && t) { vh += min(d, vt+(t-1)*d-vh);// cout << vh << endl; s += vh; t--; } while (vh > vt || t) { s += vt; vt += min(d, vh-vt);// cout << vh << endl; t--; } cout << s << endl; return 0;}

 

C. Polycarpus' Dice

  数学题,比如第一个骰子可以取1,2 那么A的取值范围就是(1+剩下骰子取最小)~(2+剩下骰子取最大)

  倒过来可以通过A的取值确定该骰子取值范围,我的做法是在计算第i个骰子范围时

  把该骰子的每个取值,得到的A的范围看作一条线段,第一条就是(1+剩下骰子取最小)~(1+剩下骰子取最大),这样该骰子每一个取值构成一条线段,

  按左边坐标排列起来,然后就是看A这个值,存在于多少条线段中,比较端点值来确定。

 

#include 
#include
#include
using namespace std;const int MAXN = 400000+50;int n;int d[MAXN];long long A, smin, smax;int main(){#ifdef LOCAL freopen("534C.in", "r", stdin);#endif scanf("%d%lld", &n, &A); for (int i = 0; i < n; i++) { scanf("%d", d+i); smin += 1; smax += d[i]; } for (int i = 0; i < n; i++) { int can; long long fl, fr, ll, lr, vmax; vmax = (smax - d[i]) - (smin - 1) + 1; fl = smin; fr = 1 + smax - d[i]; ll = d[i] + smin - 1; lr = smax; if (ll <= A && A <= fr) can = d[i]; else if (fl <= A && A <= ll) can = min(A - fl + 1, vmax); else can = min(lr - A + 1, vmax); printf("%d ", d[i] - can); } printf("\n"); return 0;}

 

  马马虎虎的题解。别人并不能看懂。

转载于:https://www.cnblogs.com/gemmeg/p/4430832.html

你可能感兴趣的文章
智能合约语言 Solidity 教程系列8 - Solidity API
查看>>
机器学习、深度学习、和AI算法可以在网络安全中做什么?
查看>>
JAVA 基础部分易混淆问题总结
查看>>
优化linux的内核来提高nginx并发
查看>>
Python包管理器
查看>>
关于微信投票如何防止出现微信上投票怎样刷票的技术
查看>>
OpenGL学习之glBindTexture函数
查看>>
Struts2 | 在struts2值栈中存储数据的三种方式
查看>>
ubuntu的python开发环境准备
查看>>
Java_07_01 正则表达式
查看>>
为微信域名而生的猴子数据 api接口
查看>>
在IDEA中Spring boot配置热部署无效问题解决方式
查看>>
很幽默的讲解六种Socket I/O模型
查看>>
《Objective-c基础教程》 学习计划(第一遍)
查看>>
struts2基本流程
查看>>
Android学习--01-架构
查看>>
NFS网络文件系统
查看>>
java: SQLite使用实例
查看>>
Java手动序列化和反序列化的实现
查看>>
一次解决你的所以省略号问题,不仅仅是:text-overflow:ellipsis
查看>>