【算法练习】尺取法
(答案下一个博客出示)
求和为C
题目描述
楠楠在网上刷题,感觉第一题:求两数的和 (A+B Problem) 太无聊了,于是增加了一题:求和为 C 的Problem,难倒了一群小朋友,哈哈。
题目是这样的:给出 N 个正整数,一个值 C ,要求在这 N 个整数中找一段连续的数(至少 2 个数),使得它们的和等于 C ,问这样的方案有多少种?
例如:N=8,C=7,8 个整数是:2 5 1 1 2 4 7 1。答案是3。具体方案:(2, 5)、(5,1,1)、(1,2,4)。
输入格式
第一行 2 个正整数:N , C 。
第二行:N 个正整数。
数据范围
N 的范围是 [1...100,000]。
C 的范围是 [1...1,000,000,000]。
N 个整数中每个数的范围是:[ 1...1,000,000,000]。
输出格式
一个整数,表示该串数中包含的所有方案数。
样例
输入数据 1
4 5
1 4 1 4
输出数据 1
3
黑白奶牛
题目描述
有 N 只奶牛从左往右排成一行,编号是 1 至 N 。这 N 只奶牛当中,有一些奶牛是黑色的,其余的是白色的。
color[i] 表示第 i 只奶牛的颜色,如果 color[i]=0 则表示第 i 头奶牛是黑色的,如果 color[i]=1 则表示第 i 头奶牛是白色的。
六一奶牛儿童节快到了,农场主 Farmer John 要从这 N 头奶牛当中,挑选尽可能多的奶牛去参加晚会。
Farmer John 挑选奶牛的原则是:挑选编号是连续的一段奶牛,这一段奶牛的颜色必须全部是白色的。
Farmer John 有一个魔法棒,每用一次魔法棒就可以把一头黑色的奶牛变成一头白色的奶牛,魔法棒最多只能使用 K 次。
在上述条件下,最多可以有多少头奶牛去参加晚会呢?
输入格式
第一行,两个整数,N 和 K。
第二行,N 个整数,第 i 个整数就是 color[i] , color[i] 要么是 0,要么是 1。
数据规模
对于 50% 的数据,1 <= N <= 1000,K = 0 ,即不能使用魔法棒。
对于 100% 的数据,1 <= N <= 100000, 1 <= K <=N。
输出格式
一个整数,表示最多有多少头奶牛可以去参加晚会。
样例
输入数据 1
11 0
1 1 0 0 1 1 1 1 0 1 1
输出数据 1
4
Copy
输入数据 2
11 1
1 1 0 0 1 1 1 1 0 1 1
Copy
输出数据 2
7
样例解释
样例 1 :由于 K=0,所以不能使用魔法棒,所以挑选编号是 5 至 8 的奶牛去参加晚会。
样例 2 :由于 K=1,所以最多可以使用 1 次魔法棒,使用魔法棒把第 9 头奶牛变成白色奶牛,然后挑选编号是 5 至 11 的奶牛去参加晚会。
连续子序列
题目描述
给定一个长度为 N ( 10 < N < 100000 )的正整数序列。每个正整数都小于等于 10000 ,给定一个正整数 S ( S < 100000000 )。编写一个程序找到一个最小长度的子序列,要求这个子序列的和大于等于 S 。如果解不存在,则输出 0 。
输入格式
第一行两个整数 N 和 S;
第二行包括 N 个正整数表示数列 A ,两两之间用空格分隔。
输出格式
一个整数。
样例
输入数据 1
5 11
1 2 3 4 5
输出数据 1
3
射箭
题目描述
FJ 很喜欢看射箭比赛,看着运动员们一个个精湛的技艺,令他头晕目眩膜拜不已。而且他喜欢给那些射箭选手打分,他想如果一位选手能在尽量短的时间段内射出所有可能的环数,那么他的得分就是那段最短时间的长度。
现在,FJ 告诉你其中一位选手共射出了 n 支箭,当然他每个单位时间射出一只箭。FJ 还会告诉你他射出的每支箭的环数。而且环数总共的可能性有 m 种,环数分别为 1 到 m,请你帮他算过这位选手在他心目中的分数。
输入格式
共两行
第一行两个数 n ,m 。
第二行一共 n 个数表示那位选手每一箭的环数。
数据范围
30% 的数据:n <= 1000 ,m <= 20
100% 的数据:n <= 1000000 ,m <= 2000
输出格式
输出文件只有一个数,表示这位选手的得分。如果这位运动员无法在这n箭中射出所有的环数,则输出-1。
样例
输入数据 1
12 5
2 5 3 1 3 2 4 1 1 5 4 3
输出数据 1
6
样例解释
这位选手从第2支箭到第7支箭射出了所有可能的环数,因此他的得分是 6 。
最短序列
给定一个长度为N(10<N<100000),只有0或1的序列。请你编写一个程序找到一个最小长度的子序列,要求这个子序列的0的数量大于等于k。如果解不存在,则输出0。
输入格式
第一行两个整数N和k,第二行包括n个0或1的数列A,两两之间用空格分隔。
输出格式
一个整数:满足条件的最小长度的子序列的长度。
输入/输出例子1
输入:
10 3
1 0 0 1 1 0 1 0 0 1
输出:
4
唯一的雪花(一)
企业家 Emily 有一个很酷的主意:把雪花包起来卖。她发明了一台机器,这台机器可以捕捉飘落的雪花,并把它们一片一片打包进一个包裹里。一旦这个包裹满了,它就会被封上送去发售。
Emily 的公司的口号是“把独特打包起来”,为了实现这一诺言,一个包裹里不能有两片一样的雪花。不幸的是,这并不容易做到,因为实际上通过机器的雪花中有很多是相同的。Emily 想知道这样一个不包含两片一样的雪花的包裹最大能有多大,她可以在任何时候启动机器,但是一旦机器启动了,直到包裹被封上为止,所有通过机器的雪花都必须被打包进这个包裹里,当然,包裹可以在任何时候被封上。
输入格式
第一行是测试数据组数T。(t<=20)
接下来有T行,每行是一组数据:第一个数是通过机器的雪花总数n(n≤106),后面的n个在[0,106]内的整数,标记了这片雪花,当两片雪花标记相同时,这两片雪花是一样的。
输出格式
对于每一组数据,输出最大包裹的大小。
输入/输出例子1
输入:
2
5
1 2 3 2 1
6
2 2 4 5 1 5
输出:
3
4
先做一下,答案发博客了。