a:array[0..10000]of boolean;
n,m,i,j,k,x,y:integer;
begin
a[0]:=true;
fillchar(a,10000,true);
readln(n,m);k:=0;
for i:=1 to m do
begin
readln(x,y);
for j:=x to y do a[j]:=false;
end;
for i:=0 to n do
if a[i] then k:=k+1;
write(k);
end.
为什么只能通过前面3个测试数据?
我刚才试了下,fillchar那句有问题
fillchar(a,10000,true)
这里的10000 只包含了0..9999这10000个元素。
改成sizeof(a) 就行了
那句a[0]:=true也可以省了
换句话说10000不能填充完这10001个元素
(*我在win下运行fillchar(a,10001,true)发现程序是对的,不过提交了发现输出了300位还多。。不知道是不是评测机的问题。。)
main()
{
int a[10001]={0},i,j,h,r,m,n,o=0;
scanf("%d%d",&m,&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&h,&r);
for(j=h;j<=r;j++)
a[j]=1;
}
for(i=0;i<=m;i++)
if(a[i]==0)
o++;
printf("%d",o);
getchar();
getchar();
}
给你说说我的思路吧,设一个数组,只存0和1,,0表示没树,1表示有树,一开始全段路全是1,然后对应修铁路的地方变成0,搞个累加器,累加‘1’出现的次数就行;
你那个我看不懂fillchar,我才初一,前天学的数组;附我的满分源码,效率一般,但超短易懂:
program a1;
var m,n,i,j,x:integer;
a,b,c:array[0..10000] of integer;
begin
read(m,n);
for i:=0 to m do a[i]:=1;
for i:=1 to n do read(b[i],c[i]);
for i:=1 to n do
for j:=b[i] to c[i] do a[j]:=0;
for i:=0 to m do
if a[i]=1 then X:=x+1;
writeln (x);
end.
求采纳,万分感谢...................