悲剧!悲剧!

kenyyy 2010-05-29 09:50:03
来晚了一个小时,有道最后一题没时间做了!!!
...全文
205 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
fanster28_ 2010-05-30
  • 打赏
  • 举报
回复
刚才发错地方了,杂这么悲剧呢
这个是O(n)的
#include <stdio.h>

const int size=50001;
int a[size],left[size],right[size],n,maxsum,minsum;

int ll(int a,int b,int flag)
{
if (flag)
return a>b;
return a<b;
}

int m_sum(int flag)
{
int sum,b,i;
left[0]=b=sum=a[0];
for (i=1;i<n;++i)
{
if (ll(b,0,flag))
b+=a[i];
else
b=a[i];
if (ll(b,sum,flag))
sum=b;
left[i]=sum;
}
right[n-1]=b=sum=a[n-1];
for (i=n-2;i>=0;--i)
{
if (ll(b,0,flag))
b+=a[i];
else
b=a[i];
if (ll(b,sum,flag))
sum=b;
right[i]=sum;
}
sum=left[0]+right[1];
for (i=1;i<n-1;++i)
if (ll(left[i]+right[i+1],sum,flag))
sum=left[i]+right[i+1];
return sum;
}

int main()
{
int t,i,sum,x,y;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
for (i=sum=0;i<n;++i)
{
scanf("%d",a+i);
sum+=a[i];
}
x=m_sum(1);
y=sum-m_sum(0);
if (y>x)
x=y;
printf("%d\n",x);
}
}
fanster28_ 2010-05-30
  • 打赏
  • 举报
回复
上面那个不能AC,下面这个就可以了

#include <stdio.h>

const int size=50001;
int a[size],left[size],right[size],n,maxsum,minsum;

int ll(int a,int b,int flag)
{
if (flag)
return a>b;
return a<b;
}

int m_sum(int flag)
{
int sum,b,i;
left[0]=b=sum=a[0];
for (i=1;i<n;++i)
{
if (ll(b,0,flag))
b+=a[i];
else
b=a[i];
if (ll(b,sum,flag))
sum=b;
left[i]=sum;
}
right[n-1]=b=sum=a[n-1];
for (i=n-2;i>=0;--i)
{
if (ll(b,0,flag))
b+=a[i];
else
b=a[i];
if (ll(b,sum,flag))
sum=b;
right[i]=sum;
}
sum=left[0]+right[1];
for (i=1;i<n-1;++i)
if (ll(left[i]+right[i+1],sum,flag))
sum=left[i]+right[i+1];
return sum;
}

int main()
{
int t,i,sum,x,y;
scanf("%d",&t);
while (t--)
{
scanf("%d",&n);
for (i=sum=0;i<n;++i)
{
scanf("%d",a+i);
sum+=a[i];
}
x=m_sum(1);
y=sum-m_sum(0);
if (n>=5 && y!=0 && y>x)
x=y;
printf("%d\n",x);
}
}
xhp718 2010-05-30
  • 打赏
  • 举报
回复
学习了啊
fanster28_ 2010-05-29
  • 打赏
  • 举报
回复
#include <stdio.h>
#include <string.h>
#include <memory.h>

struct node{
node *next[26];
int flag;
void init() {memset(next,0,sizeof(next));flag=0;}
};
node trien[200005],*root,*p,*rt;
int k,ok,len,num;
char str[21];

void insert(char *str)
{
int i=0,j;
p=root;
while (str[i])
{
j=str[i]-'a';
if (p->next[j]==0)
{
trien[k].init();
p->next[j]=&trien[k++];
}
p=p->next[j];
i++;
}
p->flag=1;
}

node* find(char *str)
{
int i=0,j;
p=root;
while (str[i])
{
j=str[i]-'a';
if (p->next[j]==0)
return 0;
p=p->next[j];
i++;
}
return p;
}

void ps(node *t)
{
int i;
if (num==8)
ok=1;
if (ok)
return;
if (t->flag==1)
{
str[len]='\0';
if (num==0)
printf("%s",str);
else
printf(" %s",str);
num++;
}
for (i=0;i<26;++i)
{
if (t->next[i]!=0)
{
str[len++]='a'+i;
ps(t->next[i]);
if (ok)
return;
}
}
len--;
}

int main()
{
int n,q;
trien[0].init();
root=trien;
k=1;
scanf("%d",&n);
while (n--)
{
scanf("%s",str);
insert(str);
}
scanf("%d",&q);
while (q--)
{
scanf("%s",str);
rt=find(str);
if (rt==0)
printf("%s",str);
else
{
num=ok=0;
len=strlen(str);
ps(rt);
}
printf("\n");
}
return 0;
}
qq120848369 2010-05-29
  • 打赏
  • 举报
回复
排序之后,怎么二分查找,赶紧讲讲LZ.
budweiser 2010-05-29
  • 打赏
  • 举报
回复
有道什么题 啊 楼主发上来看看
qq120848369 2010-05-29
  • 打赏
  • 举报
回复
期待第三题解答.
绿色夹克衫 2010-05-29
  • 打赏
  • 举报
回复
刚才看了一下第3题,最大字段和变化了一下,O(n)应该可以。
先求一遍累加,找出累加最小到累加最大的一段K,剩下的一段为K',在K里找<0的最小子段和(去掉),或K'里找>0的最大子段和(加上),应该就可以。
(临时想的,不知是否有什么疏漏)
AAA20090987 2010-05-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tu_lq 的回复:]
求第二题的思路,谢谢了。不知道为啥错
[/Quote]

用字典树就行
绿色夹克衫 2010-05-29
  • 打赏
  • 举报
回复
应该还有机会,LZ加油吧!目前的题目来看,都不算难。
24K純帥 2010-05-29
  • 打赏
  • 举报
回复
LZ考的什么试啊。。
kenyyy 2010-05-29
  • 打赏
  • 举报
回复
第二题排序加2分找啊,没什么特别的

[Quote=引用 1 楼 tu_lq 的回复:]
求第二题的思路,谢谢了。不知道为啥错
[/Quote]
toplinq 2010-05-29
  • 打赏
  • 举报
回复
求第二题的思路,谢谢了。不知道为啥错

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧