rt,我的题解审核没通过,打回原因是:
【中文标点符号】与【英文、数字、公式或汉字】或【汉字】与【汉字】之间不应添加多余空格。
源码:
关于铜组 T1 卡了我 2h+ 这件事……
# 思路
## 28 分思路
28 分的思路很简单,写两个函数分别表示四舍五入和链式舍入的结果,最后比较即可,不过细节比较多。代码就不给了。
## 49 分思路
用数组 $ans$ 来存储最后的结果,在输入 $n$ 前预处理一下。$ans_i$ 表示当题目给定的 $n$ 为 $i$ 时的结果,实现类似于前缀和。其实只要能搞定前面的代码,这个也不难。
## 100 分思路
我们先把刚才的数组输出一下,就会发现答案其实是会在 **一段数字中不断累加,然后停止一段,再累加一段……** 而且,累加的那一段也很有规律,列个表格看一下:
| $n$ | 累加的地方 | 累加的个数 |
| :------: | :---------------: | :----: |
| $100$ | $45$ 到 $49$ | $5$ |
| $1000$ | $445$ 到 $499$ | $55$ |
| $10000$ | $4445$ 到 $4999$ | $555$ |
| $100000$ | $44445$ 到 $49999$ | $5555$ |
规律还是挺好找的。
给出~~又臭又长的~~代码:
```cpp
#include<cstdio>
using namespace std;
int T;
int n;
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int ans=0;//累加的答案
if(n<=100)//判断范围
{
if(n>49)//如果在已经累加过了
printf("%d\n",ans+5);//直接加上
else if(n<45)//如果还没累加
printf("%d\n",ans);
else
printf("%d\n",ans+n-45+1);//加上已经累加的个数
continue;
}
ans+=5;//累加
//之后的就和这里差不多,就不写注释了
if(n<=1000)
{
if(n>499)
printf("%d\n",ans+55);
else if(n<445)
printf("%d\n",ans);
else
printf("%d\n",ans+n-445+1);
continue;
}
ans+=55;
if(n<=10000)
{
if(n>4999)
printf("%d\n",ans+555);
else if(n<4445)
printf("%d\n",ans);
else
printf("%d\n",ans+n-4445+1);
continue;
}
ans+=555;
if(n<=100000)
{
if(n>49999)
printf("%d\n",ans+5555);
else if(n<44445)
printf("%d\n",ans);
else
printf("%d\n",ans+n-44445+1);
continue;
}
ans+=5555;
if(n<=1000000)
{
if(n>499999)
printf("%d\n",ans+55555);
else if(n<444445)
printf("%d\n",ans);
else
printf("%d\n",ans+n-444445+1);
continue;
}
ans+=55555;
if(n<=10000000)
{
if(n>4999999)
printf("%d\n",ans+555555);
else if(n<4444445)
printf("%d\n",ans);
else
printf("%d\n",ans+n-4444445+1);
continue;
}
ans+=555555;
if(n<=100000000)
{
if(n>49999999)
printf("%d\n",ans+5555555);
else if(n<44444445)
printf("%d\n",ans);
else
printf("%d\n",ans+n-44444445+1);
continue;
}
ans+=5555555;
if(n<=1000000000)
{
if(n>499999999)
printf("%d\n",ans+55555555);
else if(n<444444445)
printf("%d\n",ans);
else
printf("%d\n",ans+n-444444445+1);
continue;
}
ans+=55555555;
}
return 0;
}