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. vmware 安装 VMwareTools

    mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom cd /mnt/cdrom cp VMwareTools-x.x.x-yyyy.tar.gz ~/ cd ~ ...

  2. sql语句查询出的某字段内容截取

    select  LEFT(context,LENGTH(context)-1) context    from table; (效果: 1,2,3, 查询出: 1,2,3 )

  3. springboot中web应用的统一异常处理

    在web应用中,请求处理过程中发生异常是非常常见的情况.springboot为我们提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异 ...

  4. Servlet页面跳转的两种方式

    一.页面跳转 1. 请求转发: (1) 使用requestDispatcher对象: 转发格式:request.getRequestDispatcher("path").forwa ...

  5. StringUtils的isNotEmpty,isNotBlank方法的区别

    这两个用着用着老是混淆或者忘记,今天写一下做个笔记,对比下两个判断方法的区别 isNotEmpty: 判断某字符串是否非空,等于!isEmpty(String str),这里不能排除空格字符 Stri ...

  6. 黑马vue---28、vue中全局过滤器的基本使用

    黑马vue---28.vue中全局过滤器的基本使用 一.总结 一句话总结: vue中的过滤器可以传递参数(根据参数来过滤),也可以用管道符拼接多个过滤器:例如<p>{{ msg | msg ...

  7. Flutter移动电商实战 --(22)JSON解析和复杂数据模型转换技巧

    json转Model类 创建model文件夹,在里面新建category.dart类 主要根据这个json来分析我们要做成类的样子 { "code": "0", ...

  8. PC通过netsh获取wifi密码

    1.查看当前系统所有保存wifi的ssid netsh wlan show profiles 2.根据指定ssid查看wifi密码,密码就是关键内容 netsh wlan show profile n ...

  9. [Java复习] Spring IoC

    1. Spring bean的生命周期? 1. 对Bean进行实例化(相当于new) 对于BeanFactory 当客户向容器请求一个尚未初始化的bean(或初始化bean需要注入另外一个尚未初始化的 ...

  10. QString std::string 相互转 含中文

    std::string cstr;QString qstring; //QString str1 = " D:\\参考手册\\BIM\\osg\\build1.OSGB"; //从 ...