http://acm.hdu.edu.cn/showproblem.php?pid=1422
暴力水过,正解应该是DP最长非负子序列
a[i]为第i个 生活费-花费
if(sum[i-1]+a[i]>=0)
{
dp[i]=dp[i-1]+1;
sum[i]=sum[i-1]+a[i];
maxn=max(maxn,dp[i]);
}
else
{
dp[i]=0;
sum[i]=0;
}
这里maxn>=n要break;
我的暴力算法 是尽量使i指针尽量滑动的更远
但不稳定,能AC
dp代码就不写了,懂的原理了
暴力代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
using namespace std;
int num[100005];
int main()
{
int n;
while(scanf("%d",&n)==1)
{
for(int i=1;i<=n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
num[i]=a-b;
}
int i=1,j=n;
int maxn=0;
while(i<=n)
{
int sum=0;
int x=i,y=j;
int flag=0;
while(1)
{
sum+=num[x];
if(sum<0)
break;
x++;
flag++;
if(x-1==y)
break;
if(x>n)
{
x=1;
}
}
i=i+flag+1;
maxn=max(maxn,flag);
j+=flag+1;
if(j>n)
j-=n;
}
printf("%d\n",maxn);
}
}