nyoj 983 首尾相连数组的最大子数组和

最大子段和变形,只是首尾互连。分别求出最大子段和 以及最小子段和,比较最大子段和所有总和-最小子段和的大小。选取最大的那个。

#include<stdio.h>
using namespace std;

int maxsum,cursum,S,s,e;
int a[100001];

int getRes(int a[],int n) {
	
    int max = 0, min = 0, max_tmp = 0, min_tmp = 0, sum = 0;
    
    for (int i = 0; i < n; ++i) {
        sum += a[i];
        max_tmp += a[i];
        min_tmp += a[i];
        if (max_tmp < 0) max_tmp = 0;
        if (min_tmp > 0) min_tmp = 0;
        max = max > max_tmp ? max : max_tmp;
        min = min < min_tmp ? min : min_tmp;
    }
 
    int res =  max > (sum - min) ? max : (sum - min);
    return res;
	//cout << res << endl;
}
int main(){
	int n;
	while(scanf("%d",&n)!=EOF){
		
		for(int i=0;i<n;i++){
			scanf("%d",&a[i]);
		}
		int tol=getRes(a,n);
		
		if(tol<0)
		printf("0\n");
		else 
		printf("%d\n",tol);	
	}
	return 0;
}

nyoj 吝啬的国度

04-12

吝啬的国度rn时间限制:1000 ms | 内存限制:65535 KBrn难度:3rn描述rn在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来。现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路)。rn输入rn第一行输入一个整数M表示测试数据共有M(1<=M<=5)组rn每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1<=S<=100000),N表示城市的总个数,S表示参观者所在城市的编号rn随后的N-1行,每行有两个正整数a,b(1<=a,b<=N),表示第a号城市和第b号城市之间有一条路连通。rn输出rn每组测试数据输N个正整数,其中,第i个数表示从S走到i号城市,必须要经过的上一个城市的编号。(其中i=S时,请输出-1)rn样例输入rn1rn10 1rn1 9rn1 8rn8 10rn10 3rn8 6rn1 2rn10 4rn9 5rn3 7rn样例输出rn-1 1 10 10 9 8 3 1 1 8rn来源rn经典题目rn上传者rn张云聪rnrnrn因为结点个数10w,我考虑一下用的是sfpa算法中的前向星建图,加上搜索rn超时,有没有大神可以看一下是否还能优化一下rn:[code=c]#includern#includern#includern#includernusing namespace std;rnint first[10005];rnstruct nodernrn int point,next,len;rne[1000005];rnvoid add(int i,int u,int v,int w)rnrn e[i].point=v;rn e[i].next=first[u];rn e[i].len=w;rn first[u]=i;rnrnint n,m;rnint path[1000005],vis[1000005];rnvoid dfs(int n)rnrn for(int i=first[n];i;i=e[i].next)rn rn if(vis[e[i].point]==0)rn rn path[e[i].point]=n;rn vis[e[i].point]=1;rn dfs(e[i].point);rn rn rnrnint main()rnrn int num;rn scanf("%d",&num);rn while(num--)rn rn scanf("%d%d",&n,&m);rn int i,x,y,cnt=1;rn memset(first,0,sizeof(first));rn memset(vis,0,sizeof(vis));rn for(i=0;i

多维数组问题-多边形首尾相连

06-27

[img=http://club.excelhome.net/showimg.asp?BoardID=2&filename=2008-6/200862711101653896.jpg][/img]rn图示多边形由4条直线组成,由于画图原因顺序为1-2-4-3rnrn数据源为rnrnx1,y1---起点坐标 rnx2,y2---终点坐标 rnrnrn  x1 y1 z1 x2 y2 z2 rn第1点 693.38 182.97 0 631.33 122.86 0 rn第2点 631.33 122.86 0 796.47 129.43 0 rn第4点 878.57 244.8 0 796.47 129.43 0 rn第3点 670.16 281.47 0 878.57 244.8 0 rnrnrnrn要求结果rnrn x y rn rn第1点 693.38 182.97 rn第2点 796.47 129.43 rn第3点 878.57 244.8 rn第4点 670.16 281.47 rnrn多线段的首尾相连的三种情况rnrn1、A线段的起点与B线段的起点相同rnrn2、A线段的起点与B线段的终点相同rnrn3、A线段的终点与B线段的起点相同rnrn主要思想是rnrnrn首先将第1点的起点坐标 X1,Y1rnrnrr(0,0) = aa(0,0):rr(0,1) = aa(0,1) -- 定义为第一点rnrnrr(0,0) = 693.38 :rr(0,1) = 182.97rnrn第1条线段的终点坐标 X2,Y2赋值给tt1,tt2rnrntt1 = 631.33 tt2 = 122.86rnrn查找tt1= x1 and tt2 = y1 Or tt1= x2 and tt2 = y2 rnrn如果是第3条线段时tt1,tt2可能是x1,y1的值,或者tt1,tt2是x2,y2的值。rnrnrn编程如下rnSub aaarrr()rn Dim rr(3, 5), rrr(3, 2)rn For ii = 6 To 9rn For jj = 3 To 7rn rr(ii - 6, jj - 3) = Sheet1.Cells(ii, jj)rn Next jjrn Next iirn ii = 0rn For jj = 0 To 1rn rrr(ii, jj) = rr(ii, jj)rn rrr(ii + 1, jj) = rr(ii, jj + 3)rn Next jjrnEnd Subrn问题在这rni=0 时 i=1,2,3 不用处理rnrni=1 时 只要比较 在i=0,2,3 的起点或终点坐标rnrni=2时 i = 0,1,3 同上rnrni= 3 时 i = 0,1,2 同上rn[color=#FF0000]循环条件判断语句如何写???[/color]

NYOJ 12 喷水装置(二)代码错误

08-23

描述rn有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿。请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿。rn输入rn第一行输入一个正整数N表示共有n次测试数据。rn每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度。rn随后的n行,都有两个整数xi和ri,xi表示第i个喷水装置的的横坐标(最左边为0),ri表示该喷水装置能覆盖的圆的半径。rn输出rn每组测试数据输出一个正整数,表示共需要多少个喷水装置,每个输出单独占一行。rn如果不存在一种能够把整个草坪湿润的方案,请输出0。rn样例输入rn2rn2 8 6rn1 1rn4 5rn2 10 6rn4 5rn6 5rn样例输出rn1rn2rn[b]这里编写了如下代码,自己试过若干测试用例通过,但始终无法通过平台测试用例,万分疑惑错在哪儿,希望求高手解答。[/b]rn[code=c]rn#includern#include rnvoid sort(float rs[2][10001],int len)rnrn for(int i=0;i=i+1;j--)rn rn if(rs[0][j]h/2.0)rn rn float distance=sqrt(ri*ri-h*h/4.0);rn pos[0][len]=xi-distance;rn pos[1][len]=xi+distance;rn len++;rn rn rn sort(pos,len);rn rn while(dismax)rn rn max=pos[1][j]-dis;rn rn rn if(0==max)rn rn flag=0;rn break;rn rn elsern rn sum++;rn dis+=max;rn rn rn if(0==flag)rn printf("0\n");rn elsern printf("%d\n",sum);rn rnrn[/code]

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试