Codeforces 718A Efim and Strange Grade 程序分析
Codeforces 718A Efim and Strange Grade 程序分析
jerry的程序
using namespace std;
typedef long long ll;
string buf;
int i;
void up(int at)
{
at--;
if (at < 0)
{
buf = '1' + buf;
i++;
return;
}
if (buf[at] == '.') at--;
buf[at]++;
if (buf[at] == '9'+1)
{
buf[at] = '0';
up(at);
}
}
int main()
{
cin.sync_with_stdio(false); cin.tie(0);
int n, k;
cin >> n >> k >> buf;
while (buf[i] != '.') i++; i++;
while (i < buf.length() && buf[i] <= '4') i++;
if (i == buf.length())
{
cout << buf << endl;
return 0;
}
for (;buf[i] != '.' && k;i--) if (buf[i] >= '5')
{
buf.resize(i); up(i);
k--;
}
if (buf.back() == '.') buf.pop_back();
cout << buf << endl;
return 0;
}
首先,先找到小数点第一个后大于等于\(5\)的数位,如果没有的话直接输出原数。
从那个数位起,从后往前循环到小数点处,如果还当前数位大于等于\(5\)且有进位的机会,则先把这个数的结尾改成这个位置,因为之后的所有数都会被清零,然后调用up函数进位,如果有\(9\)的数继续递归,否则退出,如果整数部分首位还要进位,需要在最前面加上\(1\)。
最后注意最后一个字符如果是小数点要删去。
总结:用一个函数来执行进位,如果还有进位机会只需继续调用函数就行了,这样处理起来十分方便。
izrak的程序
#include <bits/stdc++.h>
#define FO(i,a,b) for (int i = (a); i < (b); i++)
#define sz(v) int(v.size())
using namespace std;
char s[200005];
int main() {
int l, t;
scanf("%d %d", &l, &t);
scanf("%s", s+1);
s[0] = '0';
for (int i = 0; i <= l; i++) {
if (s[i] == '.') {
for (int j = i+1; j <= l; j++) if (s[j] >= '5') {
s[j] = 0;
bool roundup = true;
t--;
for (int k = j-1; k > i; k--) {
// s[k]++
if (roundup) {
s[k]++;
if (s[k] >= '5' && t) {
s[k] = 0;
t--;
roundup = true;
} else roundup = false;
}
}
if (roundup) {
s[i] = 0;
for (int k = i-1; k >= 0; k--) {
s[k]++;
if (s[k] <= '9') break;
else s[k] = '0';
}
}
break;
}
}
}
if (s[0] != '0') {
printf("%s\n", s);
} else {
printf("%s\n", s+1);
}
}
这个程序读入时在数字前加上一个前导零,以便处理整数部分首位进位情况。
第一层循环找到小数点的位置,第二层循环找到小数点后第一位大于等于\(5\)的数字,第三层循环(最多进位到小数点),roundup记录是否继续进位,如果进位后还有大于等于\(5\)的数字且还有进位机会,则继续进位。如果第三层循环结束后,仍需继续进位,则在整数部分进位。进位时每进位一次,就把这一位设置为'\0',这样输出时只会输出到第一个'\0'的位置便结束。
注意最后需判断如果开始时加上的前导零仍是零,就不能输出。
总结:用bool变量roundup维护需不需要继续进位,进了位的位置就标为'\0',如果在小数点前面进位直接循环处理即可,这样处理起来不容易错。
Codeforces 718A Efim and Strange Grade 程序分析的更多相关文章
- CodeForces 718A Efim and Strange Grade (贪心)
题意:给定一个浮点数,让你在时间 t 内,变成一个最大的数,操作只有把某个小数位进行四舍五入,每秒可进行一次. 析:贪心策略就是从小数点开始找第一个大于等于5的,然后进行四舍五入,完成后再看看是不是还 ...
- codeforces 719C. Efim and Strange Grade
C. Efim and Strange Grade time limit per test 1 second memory limit per test 256 megabytes input sta ...
- Codeforces Round #373 (Div. 2) C. Efim and Strange Grade 水题
C. Efim and Strange Grade 题目连接: http://codeforces.com/contest/719/problem/C Description Efim just re ...
- Codeforces Round #373 (Div. 2) C. Efim and Strange Grade —— 贪心 + 字符串处理
题目链接:http://codeforces.com/problemset/problem/719/C C. Efim and Strange Grade time limit per test 1 ...
- codeforces 373 A - Efim and Strange Grade(算数模拟)
codeforces 373 A - Efim and Strange Grade(算数模拟) 原题:Efim and Strange Grade 题意:给出一个n位的实型数,你可以选择t次在任意位进 ...
- Efim and Strange Grade
Efim and Strange Grade time limit per test 1 second memory limit per test 256 megabytes input standa ...
- CF719C. Efim and Strange Grade[DP]
C. Efim and Strange Grade time limit per test 1 second memory limit per test 256 megabytes input sta ...
- 【22.17%】【codeforces718B】 Efim and Strange Grade
time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...
- APM程序分析-AC_WPNav.cpp
APM程序分析 主程序在ArduCopter.cpp的loop()函数. /// advance_wp_target_along_track - move target location along ...
随机推荐
- 7月清北学堂培训 Day 6
今天是钟皓曦老师的讲授~ 合并石子拓展: 合并任意两堆石子,每次合并的代价是这两堆石子的重量的异或值,求合并成一堆的最小异或和. 状态设置:f [ s ] 把 s 所对应的石子合并的最小代价: 那么答 ...
- scrapy框架之spider
爬取流程 Spider类定义如何爬取指定的一个或多个网站,包括是否要跟进网页里的链接和如何提取网页内容中的数据. 爬取的过程是类似以下步骤的循环: 1.通过指定的初始URL初始化Request,并指定 ...
- 树莓派中将caplock映射为esc键
据说,喜欢vimer都呵caplock有仇,明明caplock占着原来esc的位置,却从来没有起到应有的作用,你说气人吗,没关系,我改啊:将下面语句加入到.bashrc中,启动即可xmodmap -e ...
- 我对java多进程多线程的浅显理解
linux内核调度算法--CPU时间片如何分配: http://blog.csdn.net/russell_tao/article/details/7103012(转载) ,通过该文章我们知道了进程 ...
- android studio的安装和配置及解决uiautomatorviewer报错
参考博客:https://www.cnblogs.com/singledogpro/p/9551841.html 安装Android Studio 走了不少弯路,现在整理出来,仅当备忘使用. 首先要先 ...
- Linux学习笔记:fuser和lsof
fuser 和 lsof 可以用于系统安全检查.用fuser查看哪些用户和进程在某些地方作什么:fuser -cu /root 简略显示fuser -muv /mnt3 分列显示 lsof 拥有更多的 ...
- 客户端配置代理服务实现yum上外网
vi /etc/profile http_proxy=http://172.20.188.193:3128/https_proxy=https://172.20.188.193:3128/expor ...
- The first one spawns an additional process forwarding requests to a series of workers (think about it as a form of shield, at the same level of apache or nginx), while the second one sets workers to n
Things to know (best practices and “issues”) READ IT !!! — uWSGI 2.0 documentationhttps://uwsgi-docs ...
- ColorDrawable
最简单的一种Drawable,当我们将ColorDrawable绘制到Canvas(画布)上的时候, 会使用一种固定的颜色来填充Paint,然后在画布上绘制出一片单色区域! 1).Java中定义Col ...
- Qt编写自定义控件32-等待进度条控件
一.前言 在各种各样的执行任务界面,有时候需要比较多的时间,需要给出一个直观的等待进度条表示当前正在执行的进度,而不至于懵逼在那里,用户不会觉得程序死了还是干嘛了. 等待进度条有好几种办法,比如直接叫 ...