『程设解体报告』传送带(附证明)、高精度

来源:互联网 发布:lc标签打印软件 编辑:程序博客网 时间:2024/06/08 01:23

传送带

这道题最开始的做法是全部数据输入结构体之后使用快排,然后用贪心做的,但是因为n最大为10^6,快排nlogn的时间复杂度速度就很慢了,然后刚好2.9s卡着时间通过了

看到提交记录里面YY大神竟然用了0.4s的方法过了,一直不知道咋搞的,后来看到讨论区又说对输入数据进行处理,开一个速度的数组进行优化的,时间能降到1s左右,还是离0.4s差很多,再后来知道了输入优化,就是输入速度cin>scanf>getchar,然后就用了这么种东西学着优化了,顺便贴一个快速输入的代码吧

void scan(int *a ){    char c;    *a=0;    while((c=getchar())<'0'||c>'9');    while(c>='0'&&c<='9') *a = (*a)*10+(c-'0'),c=getchar();}

刚才在重新写代码的时候,把数组开成int的了,然后再步行与走路切换的时候,减去的距离只能为整数,改成double型了就好了。

看到机智的Eureka发的状态,贪心的都得证明,刚好讨论区没有一个贪心的证明,于是不喜欢证明的我也来试一试吧,

首先取两条长度相同的传送带,长度均为s

速度分别为v1,v2

其中v1 > v2

步行速度和跑步速度分别为w、r

t1为在快的传送带上跑步,慢的上面走路

t2相反


1:当t * (r + v1) == s
t1 = t + s / (v2 + w)
t2 = t + s / (v1 + w) + (s - t * (v2 + r)) / (v1 + w)
容易得t1 > t2

2:当t * (r + v1) < s

t1 = t + (s - t * (r + v1)) / (w + v1) + s / (w + v2)

t2 = t + (s - t * (r + v2)) / (w + v2) + s / (w + v1)
得t1 > t2
3:同2,可以得当 t * (r + v1) > s时候,t1 > t2


现已证明出对于相同长度的两条不同速度传送带上该方法可行,
当两传送带长度不等时,将上面证明微元化即可得出证明

然后利用数学归纳法,可证明n个传送带中该方案的正确性


贪婪的你


这道题没啥好说的,直接过一个结构体排序就好了,暂时还没有想到啥优化的方法



高精度加减


注意事项

1、输入数据前面的0,比如 000 + 001或者000 - 000 或者 000 - 009

2、输入之后要把字符减去‘0’,然后成为0-9的ascii码(在高精度乘法里面还要注意一个问题,就是不能在char型数组里面进行乘法操作,因为会溢出)

3、将输入的字符串反向对齐后进行操作

4、减法运算如果减数大于被减数,则要交换位置,然后在结果前面加上负号

5、去除结果中的前置0


逻辑行计数


这个题,还是得认真读题,把几种逻辑关系搞清楚,具体细节讨论区里面讨论够多了……多的就不说了……