房天下 > 房天下问答 > 业主生活 > 其他
  • 谁能吧下面这段C的标程翻译成Pascal啊 题目:忙碌的John

    现在学Pascal,看标程总是有C或C++的,不知道如何翻译成PASCAL,网上下载的翻译器有没用,恳请哪位从Pascal转C的大牛翻译一下C版本的程序。题目名称:忙碌的John提交程序:john.???(pas,c,cpp)输入文件:john.in输出文件:john.out时间限制:1s题目描述:John是他镇上唯一的牧师。10月26日是他一年中最忙的日子,因为在一个古老传说中这一天结婚的夫妻将受到上帝的保佑,而他要负责为镇上的每一对新人做祈祷。每对新人将在Si到Ti的时间段举行他们的婚礼,而根据传统他们在婚礼中某一段时间要举行一个仪式,他们站在John面前接受John给他们的祈祷。仪式的持续时间是整数,且至少要超过婚礼持续时间的一半,并且这个仪式不能中途被打断。令John头痛的是,同一时刻他只能为一对新人祈祷,他不知道如何安排时间使得他可以为所有新人完成祈祷。请写一个程序告诉John能否通过合理的安排使得他能为所有新人举行仪式。输入格式输入包含多组测试数据,且保证最多有十组。每组数据第一行包含一个整数n(1<=n<=30000),表示举行婚礼的新人对数。接下来n行,每行包含两个整数Si和Ti(0<=Si<=Ti<=2147483647),表示每个婚礼的起始和终止时刻。输入以一组n=0结束。对于这组数据程序不应有任何输出。输出格式对于每组输入,如果能找到一种合法的安排,输出一行“YES”,否则输出“NO”。样例输入31 52 43 621 54 60样例输出NOYES能不能请各位高手讲一下这道题的具体算法?我有C的标程,但我看不懂,如果不讲算法直接翻译成PASCAL也可以,谢了~//#include <iostream>#include <cstring>#include <string>#include <cstdio>#include <algorithm>#include <cmath>#include <cstdlib>using namespace std;int l[200000],r[200000],t[200000],s[200000],need[200000];int i,j,k,o,p,n,m,now;bool cmp(int i,int j){return t[i]<t[j];}int main(){freopen("john.in","r",stdin);freopen("john.out","w",stdout);for (;;){scanf("%d",&n);if (n==0) break;for (i=0;i<n;i++){scanf("%d%d",&l[i],&r[i]);t[i]=l[i]+r[i];need[i]=(r[i]-l[i])/2+1;s[i]=i;} sort(s,s+n,cmp);now=0;k=0;for (j=0;j<n;j++){i=s[j];if (now<l[i]) now=l[i];now+=need[i];if (now>r[i]){k=1;break;}}if (k==1) printf("NO\n");else printf("YES\n");}return 0;}

    提问者:米站国际

    发布于2011-01-18

共1个回答
  • 冰原香子 丨Lv 4
    var l[0..199999],r[0..199999],t[0..199999],s[0..199999],need[1..199999]:integer; i,j,k,o,p,n,m,now:integer; fin,fout:text;function cmp(i,j:integer):boolean {var} begin if t[i]<t[j] then cmp:=true else cmp:=false; end;begin assign(fin,"john.in");reset(fin); assign(fout,"john.out");rewrite(fout); n:=1; while (n<>0) begin readln(fin,n); if n = 0 then break; for i:=0 to n-1 do begin readln(fin,l[i],r[i]); t[i]:=l[i]+r[i]; need[i]:=trunc((r[i] - l[i]) / 2) + 1; s[i]:=i; end; {sort(s,s+n,cmp); 这段对s数组的前n个数根据cmp函数两两比较排序,小的在前大的在后,就是一个排序过程} now:=0;k:=0; for j:=0 to n - 1 do begin i:=s[j]; if now<l[i] then now:=l[i]; now:=now+need[i]; if now>r[i] then begin k:=1;break; end; end; if k=1 then writeln(fout,'No') {原来的代码里是直接屏幕输出的,但是看题目还有代码前面的意思应该是输出到文件的} else writeln(fout,'YES'); end; close(fin);close(fout);{原来的代码里没有关闭文件指针,这里添上了}end.
    +1 2011-01-18 举报
热门人气推荐
免责声明:问答内容均来源于互联网用户,房天下对其内容不负责任,如有版权或其他问题可以联系房天下进行删除。