滴滴笔试9.09

糖果生产

时间限制:1000MS 内存限制:65536KB

题目描述:

糖果工厂可以生产n种不同的糖果,假设这些精果的将号分别为1到n,每一天工厂可以生产ci个编号为i的糖果。今天工厂接到了一个订单,需求是a包糖果,且每包糖果必须是同一种类的,每包数量不能少于b个,假设糖果工厂在无存货的情况下,至今需要多少天才能完成这个订单?

输入描述

第一行是三个正整数n、a、b,分别表示糖果工厂可以生成的糖果种类数,订单的需求是a包糖果,每包不少于b个。

第二行是n个正整数c1,c2,...,cn,其中第i个数ci表示工厂每天能生产的编号为i的糖果的数量。

对所有的数据保证:1<=n<=100000,1<=a,b<=10^7,1<=a<=10000

输出描述

一行一个正整数,表示充成汀单所哪的最少天数。

样例输入

3 10 20
7 9 6

样例输出

10

提示

第9天时三种糖果的数量分别63、81、54,可以分别打包出3、4、2包,共9包,此时还不能满足订单要求。

第10天时三种糖果的数量分别70、90、60,可以分别打包出3、4、3包,共10包,可以满足订单要求。

思路

我们先编写一个check函数,传入当天天数x,计算x天可以生产多少包糖果,总的糖果数是否大于题目要求的,如果大于则返回true,否则返回false

题目中要求最少有a包,每包至少b个,工厂每天至少生产一个同一类型的糖果,所以我们最多生产a*b天就肯定可以全部生产完,题目中要求a,b<10^7,所以在10^14天的时候我们肯定可以生产完,接着使用二分搜索法,从0到10^14找到最少可以生产这么多的天数

代码

n,a,b = map(int,input().split(" "))
c = list(map(int,input().split(" ")))

def check(x):
    sum1 = 0
    for i in range(len(c)):
        sum1 += (x*c[i]) // b

    if sum1>=a: return True
    else: return False

l,r = 0,10**14
while l

冲突

时间限制:1000MS 内存限制:65536KB

题目描述

现在有n个由大写英文字符组成的字符串,且这些字符用不会互相包含,也不会相等。现在想知道有哪些字符用满足如下条件。设满足条件的字符串为S,存在其他的两个字符串拼接在一起后,能通过去除一个非空前缀和一个非空后缀变为字符串S。这两个用于拼接的字符串可以是同个,也可以为S。

输入描述

第一行一个正整数n,表示字符串的个数。

接下来n行,每行一个由大写英文字符组成的字符串。

对于所有数据,1<=n<=5000,字符串长度<=20。

输出描述

第一行输出一个正整数m,表示符合条件的字符串数量。

接下来输出m行,每行一个由大写英文字符组成的字符串,表示这个字符串符合条件。按照字典序升序输出。

样例输入

10
KPZOKNSTGLUNPPDKPFEW
NDPKU
KPEEWN
CCHXNNY
GWSGZ
NNYCCHX
FMVKSOHOPGZWG
SGZNNYCC
PKUFMVKSOHOPG
CCSGZN

样例输出

5
CCHXNNY
CCSGZN
NNYCCHX
PKUFMVKSOHOPG
SGZNNYCC

思路 

使用集合,记录所有字符的前缀和后缀,然后遍历所有字符串,校验每个字符串的前缀是否可以在后缀集合中找到,后缀可以在前缀集合中找到

n = int(input())
s = []
for i in range(n):
    s.append(input())

pre,tail = set(),set()
for string in s:
    for j in range(1,len(string)):
        pre.add(string[:j])
        tail.add(string[j:])

ans = []
for string in s:
    for j in range(1,len(string)):
        if string[:j] in tail and string[j:] in pre:
            ans.append(string)
            break

ans.sort()
print(len(ans))
for s in ans:
    print(s)

感谢万诺coding以及众多其他大佬的帮助

你可能感兴趣的:(算法,数据结构)