例题1.21 子序列 UVa1121

1.题目描述:点击打开链接

2.解题思路:本题是典型的二分搜索题,二分答案后验证是否满足和大于等于S即可。

3.代码:

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string>
#include<sstream>
#include<set>
#include<vector>
#include<stack>
#include<map>
#include<queue>
#include<deque>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<ctime>
#include<functional>
using namespace std;

typedef long long LL;
#define N 100000+10
int a[N];
LL sum[N];
int n;
LL s;
bool ok(int len)
{
	for (int L = 0; L <= n - len;L++)
	if (sum[L + len] - sum[L] >= s)
		return true;
	return false;
}
int main()
{
	//freopen("t.txt", "r", stdin);
	while (~scanf("%d%d", &n, &s))
	{
		memset(a, 0, sizeof(a));
		memset(sum, 0, sizeof(sum));
		for (int i = 1; i <= n; i++)
		{
			cin >> a[i];
			sum[i] = sum[i - 1] + a[i];
		}
		if (sum[n] < s)printf("0\n");
		else
		{
			int L = 0, R = n;
			while (L < R)
			{
				int M = L + (R - L) / 2;
				if (ok(M))R = M;
				else L = M + 1;
			}
			cout << L << endl;
		}
	}
	return 0;
}
时间: 2024-10-09 04:09:17

例题1.21 子序列 UVa1121的相关文章

21. 子序列的和 subsequence

题目: 输入两个正整数 n < m < 10^6 , 输出 1 / n2 + 1 / (n + 1)2 + ...+ 1 / m2,保留5位小数.输入包含多组数据,结束标记为 n = m = 0 .提示:本题有陷阱. 样例输入: 2 4 65536 655360 0 0 样例输出: Case 1: 0.42361 Case 2: 0.00001 思路: 陷阱还是在于乘法溢出.若是用常规方法,将分母乘起来,然后在除,那么无论如何,都是溢出.解决方法:将分母连除两次即可. 代码: #include

finally类

finally叫做最后的执行快,什么是最后的执行快?他的意思是这样的 他是写在try catch 的后面但是只能写一个,他设计这个finally的意思就是,如果try里面出错肯定会往陷阱里 面跑.没有出错就会执行完毕然后直接往下走.那么如果有一个资源在try里面使用,但是一但出错了呢?这个资源肯定要关闭的,如果在正常的代码里面写关闭,如果出错了就不 能关闭,所以要在catch里面关闭资源,但是catch陷阱有很多个不知道他的错误要进哪一个陷阱,那么我们不可能每个陷阱里面都的加关闭的资源这样代码的

CSU 1120 病毒(经典模板例题:最长公共递增子序列)

1120: 病毒 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 390  Solved: 153[Submit][Status][Web Board] Description 你有一个日志文件,里面记录着各种系统事件的详细信息.自然的,事件的时间戳按照严格递增顺序排列(不会有两个事件在完全相同的时刻发生). 遗憾的是,你的系统被病毒感染了,日志文件中混入了病毒生成的随机伪事件(但真实事件的相对顺序保持不变).备份的日志文件也被感染了,但由于病毒采用

例题 2-1 aabb 2-2 3n+1问题

例题2-1  aabb 输出所有形如aabb的四位完全平方数(即前两位数字相等,后两位数字也相等) #include <stdio.h> #include <stdlib.h> #include <math.h> int main(int argc, char *argv[]) { int i, j, n; double m; for(i = 1; i <= 9; i++) for(j = 0; j <= 9; j++) { n = i*1100 + j*1

习题 2-1 位数 2-2 水仙花数 2-3 韩信点兵 2-4倒三角形 2-6 调和级数 2-7近似计算 2-8 子序列的和

2-1 位数 #include<stdio.h> #include<math.h> int main () { int n; for (n=100; n<=999; n++) { if(n == pow(n/100,3) + pow(n/10%10,3) + pow(n%10,3) ) printf("%d\n",n); } system("PAUSE"); return EXIT_SUCCESS; } 2-2 水仙花数 #includ

1925: [Sdoi2010]地精部落 dp, 抖动子序列

看到这道题第一反应就把该题与白书的一道例题联系起来了.(虽然后来证明两者并没有联系.)因此我一开始的思路就是从n到1一个个加进去.虽然的确搞不太出来. 然后开始膜题解了.………………………………好可耻啊! 首先可以证明.一个开头下降的抖动子序列 1~n 可以通过 n - xi + 1 (xi 为 第i位的值 )的形式变为一个上升的. 然后就利用这个性质搞了 设 f[i][j] 为长度为 i , 分别以 1~j 开头且开头上升(如果你要问我为什么是上升的你可以自己推一下,反正我推不出来.)的方案数

删除部分字符使其变成回文串问题——最长公共子序列(LCS)问题

先要搞明白:最长公共子串和最长公共子序列的区别. 最长公共子串(Longest Common Substirng):连续 最长公共子序列(Longest Common Subsequence,LCS):不必连续 实在是汗颜,网上做一道题半天没进展: 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串.如何删除才能使得回文串最长呢?输出需要删除的字符个数. 首先是自己大致上能明白应该用动态规划的思想否则算法复杂度必然过大.可是对于回文串很难找到其状态和状态转移方程,换句话说就是:某

最长不下降子序列(LIS)

最长上升子序列.最长不下降子序列,解法差不多,就一点等于不等于的差别,我这里说最长不下降子序列的. 有两种解法. 一种是DP,很容易想到,就这样: 1 REP(i,n) 2 { 3 f[i]=1; 4 FOR(j,0,i-1) 5 if(a[j]<=a[i]) f[i]=max(f[i],f[j]+1); 6 } DP是O(n^2)的,我感觉已经不错了不过还有超碉的nlogn的方法. nlogn的方法: 用栈和二分查找. 遇到一个元素a[i],若它不小于栈顶s[top],直接入栈:若大于栈顶,则

跟着编程之美学算法——最长公共子序列

最长公共子序列是一个很经典的动态规划问题,最近正在学习动态规划,所以拿来这里再整理一下. 这个问题在<算法导论>中作为讲动态规划算法的例题出现. 动态规划,众所周知,第一步就是找子问题,也就是把一个大的问题分解成子问题.这里我们设两个字符串A.B,A = "a0, a1, a2, ..., am-1",B = "b0, b1, b2, ..., bn-1". (1)如果am-1 == bn-1,则当前最长公共子序列为"a0, a1, ...,