| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1065 人关注过本帖
标题:纠结了一天的题
只看楼主 加入收藏
mahuaguan
Rank: 1
等 级:新手上路
帖 子:38
专家分:4
注 册:2011-9-13
结帖率:62.5%
收藏
已结贴  问题点数:20 回复次数:16 
纠结了一天的题
//先上题目
1136. 山海经

Description

“南山之首曰鹊山。其首曰招摇之山,临于西海之上,多桂,多金玉。有草焉,其状如韭而青华,其名曰祝余,食之不饥……
又东三百里,曰堂庭之山,多δ荆喟自常嗨瘢嗷平稹
又东三百八十里,曰j翼之山,其中多怪兽,水多怪鱼,多白玉,多蝮虫,多怪蛇,多怪木,不可以上。……”
《山海经》是以山为纲,以海为线记载古代的河流、植物、动物及矿产等情况,而且每一条记录路线都不会有重复的山出现。某天,你的地理老师想重游《山海经》中的路线,为了简化问题,老师已经把每座山用一个整数表示他对该山的喜恶程度,他想知道第a座山到第b座山的中间某段路(i,j),使得他感到是最满意的,即(i,j)这条路上所有山的喜恶程度之和是所有(c,d)(a≤c≤d≤b)最大。于是老师便向你请教,你能帮助他吗?值得注意的是,在《山海经》中,第i座山只能到达第i+1座山。
Input

输入第一行是两个数n,m,2≤n≤100000,1≤m≤100000,n表示一共有n座山,m表示老师想查询的数目。
第二行是n个整数,代表n座山的喜恶度,绝对值均小于10000。
以下m行每行有两个数,a,b,1≤a≤b≤n,表示第a座山到第b座山。
Output

一共有m行,每行有三个数i,j,s,表示从第i座山到第j座山总的喜恶度为s。显然,对于每个查询,有a≤i≤j≤b,如果有多组解,则输出i最少的,如果i也相等,则输出j最少的解。

Sample Input

5 3
5 -6 3 -1 4
1 3
1 5
5 5
Sample Output

1 1 5
3 5 6
5 5 4
//我的代码

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int n;
    int m;
    int love[100001];
    int i;
    int a,b;
    int sum=0;
    int max;
    int x,y;
    int num;
    int j;
    int count1,count2;
   
    scanf("%d%*c%d%*c",&n,&m);
   
    for(i=1;i<=n;i++)
    {
        scanf("%d%*c",&love[i]);
    }
   
    while(m--)
    {
        scanf("%d%*c%d%*c",&a,&b);
        
        max=love[a];
        
        count1=a;
        count2=a;
        
        for(i=a;i<=b;i++)
        {
            while(love[i]<0&&i<b)   //程序优化
            {
                i++;
               
            }
            for(j=i;j<=b;j++)
            {
                while(1)
                {
                sum=sum+love[j];
                if(love[j]>0||j==b)     //程序优化
                {
                    break;
                }
                j++;
                }
                if(max<sum)
                {
                    max=sum;
                    count1=i;
                    count2=j;
                }
            }
            sum=0;
        }
        
        printf("%d %d %d\n",count1,count2,max);
        
    }
   
    system("pause");
    return 0;
}

在我想到的例子中都通过了,可是机器显示我还是有部分例子不能通过,估计是边界的问题。还有就是这程序超时了,但是我觉得已经优化到极限了吧(菜鸟见识,不要介意)……求救求救……
搜索更多相关主题的帖子: 白玉 山海经 动物 而且 
2011-12-29 15:42
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:5 
这题比你想象的要难多了

你的算法对于每一次询问都要花费(b-a)^2次查找,看这数据量,肯定会超时

我刚刚尝试了一种每次询问花费为(b-a)次查找的算法,仍然超时中。。。正在想办法
2011-12-29 16:27
laoyang103
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:内蒙古包头
等 级:贵宾
威 望:19
帖 子:3082
专家分:11056
注 册:2010-5-22
收藏
得分:5 
最大连续子序列的问题  状态转移方程 dp[i] = max{dp[i-1]+a[i],a[i]}

其中dp[i]表示前面包括第i个数在内的最大值  a[i]为每个数  楼主把题目网址发下 我去试试

[ 本帖最后由 laoyang103 于 2011-12-29 17:36 编辑 ]

                                         
===========深入<----------------->浅出============
2011-12-29 16:44
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
不用试了,我刚试过。TLE
2011-12-29 16:48
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
http://www.soj.me/show_problem.php?pid=1136
2011-12-29 16:54
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
貌似比我想象的要难多了,至今没想出解法。
2011-12-29 18:23
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:5 
回复 5楼 czz5242199
很漂亮的OJ啊,就是提交的反应慢了点。
怎么看都是一个最大连续子段和问题,试着提交了一下,果断TLE 呵呵。
仔细考虑一下,经典的DP算法下,该问题的1组测试的时间复杂度是O(n),再来m组测试就是O(n*m)。百亿级的运算量,1秒确实搞不定。
考虑建线段树来解吧。

重剑无锋,大巧不工
2011-12-29 20:27
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
朴素RMQ应该是线段树的一种特例吧

我一开始就想了用RMQ来解,但是就是对于如果最长的超过了给定范围的处理想了很久,刚刚终于大概想通了如何处理,每次查询的时间复杂度应该接近于常数了,然后RMQ预处理是nlog2(n),理论上应该可以了,明天考完数学再实现一下吧,今天还是先复习好了

我真觉得LZ这个题目属于相当难的那种,如果LZ只是刚接触ACM的话应该是很难理解的
2011-12-29 21:29
樾宝
Rank: 3Rank: 3
来 自:常德
等 级:论坛游侠
帖 子:72
专家分:147
注 册:2011-8-19
收藏
得分:5 


还是换一种思维方式去考虑。

关上一扇门,还有一扇窗的。

不走大门就爬窗了
2011-12-30 11:14
mahuaguan
Rank: 1
等 级:新手上路
帖 子:38
专家分:4
注 册:2011-9-13
收藏
得分:0 
回复 3楼 laoyang103
soj.me/1136 麻烦了
2011-12-30 15:27
快速回复:纠结了一天的题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019704 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved