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. 敌兵布阵(HDU 1166)

    Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...

  2. layer 漂亮的弹窗

    layer.confirm('<font color="red">请认真核对账目信息,提交后将不可撤回!!</font>', { icon:3, title ...

  3. PHP 之实现按日期进行分组、分页

    一.效果图 二.原始数据 array(6) { [0]=> array(8) { ["id"]=> string(1) "6" ["use ...

  4. Java中的集合Collection

    集合是什么? Java集合类存放于 java.util 包中,是一个用来存放对象的容器. 注意:①.集合只能存放对象.比如你存一个 int 型数据 1放入集合中,其实它是自动转换成 Integer 类 ...

  5. Golang switch语句总结

    switch 语句基本结构 switch 条件表达式 { case 常量表达式1: 语句 1 case 常量表达式2: 语句 2 . . . case 常量表达式n: 语句 n default: 语句 ...

  6. 一个简单的puppeteer爬虫

    const puppeteer = require("puppeteer"); const path = require('path'); const pathToExtensio ...

  7. 从 10.x 到 ArcGIS Pro 的 Python 迁移

    与 ArcGIS Pro 结合使用 Python 的方式与包括 ArcGIS Desktop.ArcGIS Server 以及 ArcGIS Engine 在内的其他 ArcGIS 产品不同. 地理处 ...

  8. Linux 之Shell for循环

    @代表所有参数所以如果后面跟上echo $v你会发现他会一次显示user userdebug eng $poo -le ${#prodlist[@]} 这句话是说 $poo小于等于prodlist中的 ...

  9. 【English】What is a Java StringWriter, and when should I use it?(转帖)

    转帖地址:http://www.it1352.com/989366.html Question: What is a Java StringWriter, and when should I use ...

  10. ERS:百科

    ylbtech-ERS:百科 ERS=(Enterprises Run System)企业运行系统 企业运行系统-ERS,是继ERP系统之后的企业管理控制软件系统的终极形式,有着非常美好的市场前景,尤 ...