杭电ACM2037(今年暑假不AC)。 谁能帮我解释下这个代码,从别人那拷过来的。看不懂,再次谢谢大家了。

#include<stdio.h>intmain(){inti,j,k,n,a[101],b[101],l,m[101],p,o,t,d;while(scanf("%d"... #include <stdio.h>

int main()
{
int i,j,k,n,a[101],b[101],l,m[101],p,o,t,d;
while(scanf("%d",&n)!=EOF&&n!=0)
{
for(i=0;i<n;i++)
{
scanf("%d%d",&a[i],&b[i]);
}
for (i=1; i<n; i++)
{
for (j=0; j<n-i; j++)
{
if (b[j]>b[j+1])
{
k=a[j];l=b[j];
a[j]=a[j+1];b[j]=b[j+1];
a[j+1]=k;b[j+1]=l;
}
}
}
int A[101]={0};
for(i=0;i<n;i++)
{
d=i-1;
int p=0;
while(d>=0)
{
if(a[i]>=b[d])
{
if(p<A[d])
p=A[d];
}
d--;
}
A[i]=p+1;
}
int t=A[0];
for(i=0;i<n;i++)
if(t<A[i])
t=A[i];
printf("%d\n",t);

}
return 0;
}
展开
 我来答
百度网友c19c0d0
2011-02-28 · TA获得超过1537个赞
知道小有建树答主
回答量:464
采纳率:0%
帮助的人:447万
展开全部
这是贪心算法。。。
不妨用Begin[i]和End[i]表示事件i的开始时刻和结束时刻。则原题的要求就是找一个最长的序列a1<a2<…<an,满足:
Begin[a1]<End[a1]<=…<= Begin[an]<End[an]
可以证明,如果在可能的事件a1<a2<…<an中选取在时间上不重叠的最长序列,那么一定存在一个包含a1(结束最早)的最长序列。
(证明:略)

要对结束时间从小到大 排下序。。

楼主可以去HDOJ论坛下载 贪心算法的课件。。
课件下载地址: http://acm.hdu.edu.cn/forum/read.php?tid=3315
这是里面的一道例题。。
手机用户56604
2011-03-05 · 超过26用户采纳过TA的回答
知道答主
回答量:150
采纳率:0%
帮助的人:0
展开全部
出区别。

AC的应该输出1
WA的却输出了0

原因是WA的程序里面并没有定义c[0],所以当M==N的时候,c[n-m]会访问一个未知大小的变量,导致了当M==N的时候,输出结果不可预计。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式