20190308基础代码测试(我只做了1.2两题)(1.简单题)(2.促销)

1.简单题(真心的简单啊。。。!!!怎么可能)

题目描述
给定数轴上的N个点,求这些点到其他点的距离总和S。

输入格式
第一行一个整数N。 接下来N行每行一个整数,表示每个点的坐标xi。

输出格式
一个整数S。

样例数据
input1

5
1
5
3
2
4
output1

40

input2

8
10
20
30
40
50
60
70
80
output2

1680

数据规模与约定
对于30%的数据,1≤N≤100001≤N≤10000

对于50%的数据,保证1≤xi1≤xi。(????what???)

对于70%的数据,保证1≤N≤3000001≤N≤300000,且任意两点的坐标不相同。

对于100%的数据,保证1≤N≤30000001≤N≤3000000,|xi|≤215−1|xi|≤215−1。

============================================================================
由于数据范围有足足三百万,要是用双重循环肯定是不行的。于是我就想要在输入的同时,通过判断新输入的这个数和前一个数的差值,来确定和前面所有数的差值。然后我写了一个表来做。(请勿盗图)
这是我在做题时的草稿
(本来想用样例,结果不小心把样例1的第一行也输了进去。不要在意这些细节)

然而我找了许久的规律,终于找出了一丢丢。

看“与之前的数的差值”的第一行,第三个数5比1要大4,所以第一行也比它大4。第二行中默认1下面是0,所以第2个5下面的第2行要大4。以此类推,就找到了一点规律。
3比5小2,-2比0小2.+2比+4小2,-2比0小2…

可找到了这个规律也不行啊,因为这个距离是绝对值之和,又不是合计。

数据是300万,输入之后,可以再来一个循环啊!

于是我就加了一个sort函数进行排序。
sort函数
这样的话可以保证后面的数比前面的大,那样后面减前面的绝对值就都是正的了。

于是那里的合计就全是正的了,距离就和合计里的结果一样。

以1 2 3 4 5(其实就是样例1)来举例。
样例1
可以发现距离增加的规律了。如图。

3 比 2 大 1 ,距离就要大 1*2 。2 是 3 的位置减 1 。这样就可以开一个数组来存前面的这些数与它前面的数距离之和。设为b数组,a数组是用来存这些数的。再用一个tmp把 b[数组] 相加而成。

代码很短啊。(然而我找了一个多小时的规律)

代码
信心满满的去提交,结果得了60分。。

怎么可能,只用了两次循环,都是一重的,不会超时吧!

其实不是因为超时,显示 Re 了。简直百思不得其解啊。终于老师告诉我,b数组,爆了。。要开long long。 似乎,是的呢。。。

所以这才是AC代码:

AC的

**============================================================================**

2.促销

题目描述
小x在jzyz开了一家冷饮店,因为刚开张,他决定做一次促销活动。而活动的获奖者可以免费得到一杯圣代。 为了和同学的生活贴近,小x费劲脑汁想到了一个促销方案:

1) 当场摇出一个正整数MM,再摇出两个正整数XX和YY
2) 每个人可以在1…M1…M这MM个自然数中挑出N个不同的数。

3) 如果某人可以在现场把这NN个数的倒数的累加和恰好等于X/YX/Y,那么这个人可以得到一杯圣代。

4) 每种方案只限第一名想到答案的领取一杯圣代。

现在小x苦恼的是,对于给定的NN,MM, XX, YY,他能否尽快得知他最多要准备多少杯圣代。

输入格式
四个整数:NN,MM, XX, YY。

输出格式
一个整数,表示最多要准备多少杯圣代。

样例数据
input

2 4 3 4

output

1

数据规模与约定
对于30%的数据,1<=N<=M<=151<=N<=M<=15
对于60%的数据,1<=N<=M<=201<=N<=M<=20
对于100%的数据,1<=N<=M<=251<=N<=M<=25,X<=25X<=25,Y<=25

===============================================================================

这一题肯定是要用深搜,但是要算分数啊,有点麻烦。用double?我怕精度不够啊。

于是我就用 a 代表分子,b 代表分母。新加的那个数是 1/i 。
算法
模拟一下分数的计算过程。到最后判断时,看分子与题目给的分子是否相等,分母与题目给的分母是否相等。

等等!还要约分不是吗?

于是我就使用了一个超级暴力的约分法子。。不是程序暴力,是我暴力手打。。

约分超级暴力
(dfs里,第一个是分子,第二个是分母。第三个表示用了几个数。第四个是为了防止相同的数多次使用,后面的循环从第i+1个数开始搜起。)

k代表要约分的数是多少。要约分的不只是在dfs里,输入的时候那个x,y也要约分不要忘了。

过了样例,我屁颠屁颠去交了。

只有 40分。。

惨不忍睹!

为什么错了啊!!!!!!!!!!!!

结果别人用double就对了,这题对精度的要求不是很大。

只有另外一个人用了分子分母。他的约分方法和我不一样。

或许是我约分出了问题?可我觉得我的约分没有任何问题啊?

好吧,经过老师的提醒,我的确是约分出了问题。

万一要约分的是4?怎么办?

一语点醒梦中人啊,看来暴力约分是不行的。

于是我就用了乖乖的约分(先用下面这个求出最大公约数,再来约分):
约分
然后,再提交。这次,超时了。。。80分。。

我已经剪过枝了!

1、当前用的数大于要用的数了,返回。

2、当前数倒数和大于最终的数了,返回。

所以到底还有什么问题呢?

原来是第二步出了问题。

由于我没用double,而用了分子分母,就会导致难以判断是不是大于了。为了防止出现明明没有大于却剪掉了枝,为了确保万无一失,所以判断大于的方法比较奇葩。

在这里插入图片描述
或许有时已经比后面的数大了,比如 1/2大于 2/5 ,也不会判断出来。 只有 3/7 和 2/8 之类明显的才能比较出来。分子越越大数越大,分母越大数越小,分子大,分母小,这个数肯定大。

但是这样有一些枝没剪掉。

所以我去看那个也是分子分母的那人比较方法。
他的方法
原来如此。。还是用了小数点啊。。。

算了算了,就用他的吧。

结果还是错了。这倒不是超时,而是立马return了。。不管是什么数,哪怕要求大于的那个数比后面的数小很多,也是return。突然记起老师说double的比较方法有点变态,应该是:
在这里插入图片描述
是这样用的。

这次终于过了啊啊啊。。。

AC代码是:
在这里插入图片描述
在这里插入图片描述

(3,4,5等我会做了再来补充。。)

本次考试反思:我会写深搜和广搜了,可是题目不止要会写那个模板,有一些细节我难以注意到,然后就找那个问题要找好久好久。逻辑思维能力也不强,还没有理清思路就开始写代码,浪费时间。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值