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 程序分析的更多相关文章

  1. CodeForces 718A Efim and Strange Grade (贪心)

    题意:给定一个浮点数,让你在时间 t 内,变成一个最大的数,操作只有把某个小数位进行四舍五入,每秒可进行一次. 析:贪心策略就是从小数点开始找第一个大于等于5的,然后进行四舍五入,完成后再看看是不是还 ...

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

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

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

  5. codeforces 373 A - Efim and Strange Grade(算数模拟)

    codeforces 373 A - Efim and Strange Grade(算数模拟) 原题:Efim and Strange Grade 题意:给出一个n位的实型数,你可以选择t次在任意位进 ...

  6. Efim and Strange Grade

    Efim and Strange Grade time limit per test 1 second memory limit per test 256 megabytes input standa ...

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

  8. 【22.17%】【codeforces718B】 Efim and Strange Grade

    time limit per test 1 second memory limit per test 256 megabytes input standard input output standar ...

  9. APM程序分析-AC_WPNav.cpp

    APM程序分析 主程序在ArduCopter.cpp的loop()函数. /// advance_wp_target_along_track - move target location along ...

随机推荐

  1. BZOJ 4734 UOJ #269 如何优雅地求和 (多项式)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4734 (UOJ) http://uoj.ac/problem/269 题解 ...

  2. 微信小程序之简单记账本开发记录(四)

    昨天搭建了大致界面 今天需要将用到的一系列样式表配置出来并检查错误

  3. Python经典练习题1:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

    Python经典练习题 网上能够搜得到的答案为: for i in range(1,85): if 168 % i == 0: j = 168 / i; if i > j and (i + j) ...

  4. JAVA安全漫谈1-8笔记

    一.反射篇1 classloader就是java的类加载器,告诉虚拟机如何加载这个类.默认情况下根据类名来加载类,类名必须是完整路径 public class class_init { { Syste ...

  5. nodejs 服务器模拟异常状态码429,以及前端vue axios捕获状态码

    nodejs 服务端发送429状态: extendInfo (req, res) { res.status(429).json('Too many requests, please try again ...

  6. FIREDAC返回多结果集

    FIREDAC返回多结果集 以前使用ADO, 如果SQL返回的结果集有多个 可以通过NextRecordset来依次获取 代码移植到FireDAC, 对于多结果集处理差不多, 但是还是有一些不一样的地 ...

  7. DBeaver 客户端中时间显示问题解决

    最近工作使用了一段时间的macOS,换了新的数据库客户端 DBeaver,无意中发现客户端显示时间不正确.时间保存之后显示比实际时间多13个小时整.可以判断是时区没有配置正确.无意中发现是DBeave ...

  8. SQL-W3School-高级:SQL VIEW(视图)

    ylbtech-SQL-W3School-高级:SQL VIEW(视图) 1.返回顶部 1. 视图是可视化的表. 本章讲解如何创建.更新和删除视图. SQL CREATE VIEW 语句 什么是视图? ...

  9. 科普贴:什么是上证50ETF期权?如何交易?

    这两天很多上证50ETF期权即将开通的新闻,有几个朋友表示,看了很多新闻,同样还是云里雾里,没搞清楚究竟是个什么东东?今天科普一下,部分内容摘自网络. 1.什么是ETF?ETF的英文全称是:Excha ...

  10. xdebug调试的原理

    转自 https://segmentfault.com/a/1190000002528341 使用PhpStorm+xdebug单步调试程序可以快速帮助自己熟悉项目代码! 运行原理 在实际使用前,我们 ...