| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:一个0MS即可完成的程序(附源代码)In Reply To:一个0MS即可完成的程序(附源代码) Posted by:huhongqing at 2009-10-30 17:28:22 > 我自己的16MS,结果有一个朋友给了我一个0MS即可完成的程序,恕我愚笨,看不懂,哪位牛人给讲讲这代码是怎么一个思路,在此谢过。
>
>
> #include <iostream>
> #include <math.h>
> using namespace std;
>
> typedef int RLE[2];
> int w,n,ct,t;
> RLE r[2000];
> RLE cur,pos;
>
> bool Move(RLE a, RLE b, int offset) {
> if ( a[0]<0 || a[0]>=n ) return false;
> b[0] = a[0]; b[1] = a[1]+offset;
> while ( b[1]>=r[b[0]][1] && b[0]<n ) {
> b[1] -= r[b[0]][1];
> b[0]++;
> }
> if ( b[0]>=n ) return false;
> while ( b[1]<0 && b[0]>=0 ) {
> b[0]--;
> b[1] += r[b[0]][1];
> }
> if ( b[0]<0 ) return false;
> return true;
> }
> void Advance() {
> int temp = r[pos[0]][1]-pos[1]-w-1;
> if ( pos[1]>w && temp>0 ) {
> cur[1] += temp;
> ct += temp;
> pos[1] += temp;
> }
> temp = w-2 - ct%w;
> int temp2 = r[pos[0]][1]-pos[1]-2;
> if ( pos[1]==0 || pos[1]==1 || ct%w==0 ) temp2 = 0;
> int temp3,temp4;
> RLE trle;
> if ( !Move(pos, trle, -w-2) ) temp3 = w;
> else temp3 = r[trle[0]][1]-trle[1]-3;
> if ( !Move(pos, trle, w-2) ) temp4 = w;
> else temp4 = r[trle[0]][1]-trle[1]-3;
> temp = (temp<temp2)?temp:temp2;
> temp = (temp<temp3)?temp:temp3;
> temp = (temp<temp4)?temp:temp4;
> if ( temp>0 ) {
> cur[1] += temp;
> ct += temp;
> pos[1] += temp;
> }
> int hehe=0;
> Move(pos, trle, -w-1);
> if ( ct>=w && ct%w>0 ) {
> temp = abs(r[trle[0]][0] - r[pos[0]][0]);
> if ( temp>hehe ) hehe = temp;
> }
> Move(pos, trle, -w);
> if ( ct>=w ) {
> temp = abs(r[trle[0]][0] - r[pos[0]][0]);
> if ( temp>hehe ) hehe = temp;
> }
> Move(pos, trle, -w+1);
> if ( ct>=w && ct%w!=w-1 ) {
> temp = abs(r[trle[0]][0] - r[pos[0]][0]);
> if ( temp>hehe ) hehe = temp;
> }
> Move(pos, trle, -1);
> if ( ct%w>0 ) {
> temp = abs(r[trle[0]][0] - r[pos[0]][0]);
> if ( temp>hehe ) hehe = temp;
> }
> Move(pos, trle, 1);
> if ( ct%w!=w-1 ) {
> temp = abs(r[trle[0]][0] - r[pos[0]][0]);
> if ( temp>hehe ) hehe = temp;
> }
> Move(pos, trle, w-1);
> if ( ct<t-w && ct%w>0 ) {
> temp = abs(r[trle[0]][0] - r[pos[0]][0]);
> if ( temp>hehe ) hehe = temp;
> }
> Move(pos, trle, w);
> if ( ct<t-w ) {
> temp = abs(r[trle[0]][0] - r[pos[0]][0]);
> if ( temp>hehe ) hehe = temp;
> }
> Move(pos, trle, w+1);
> if ( ct<t-w && ct%w!=w-1 ) {
> temp = abs(r[trle[0]][0] - r[pos[0]][0]);
> if ( temp>hehe ) hehe = temp;
> }
> if ( cur[0] == -1 ) {
> cur[0] = hehe;
> cur[1] = 1;
> } else if ( hehe == cur[0] ) cur[1]++;
> else {
> cout<<cur[0]<<' '<<cur[1]<<endl;
> cur[0] = hehe;
> cur[1] = 1;
> }
> pos[1]++; ct++;
> if ( pos[1] == r[pos[0]][1] ) {pos[0]++; pos[1]=0;}
> }
> void Output() {
> cur[0] = -1; cur[1] = -1;
> pos[0] = 0; pos[1] = 0;
> while ( true ) {
> if ( pos[0] == n ) break;
> Advance();
> }
> cout<<cur[0]<<' '<<cur[1]<<endl;
> }
> int main()
> {
> cin>>w;
> while ( w>0 ) {
> cout<<w<<endl;
> n=0;
> cin>>r[n][0]>>r[n][1];
> t=r[n][1];ct=0;
> while ( r[n][1]>0 ) {
> n++;
> cin>>r[n][0]>>r[n][1];
> t += r[n][1];
> }
> Output();
> cout<<"0 0"<<endl;
> cin>>w;
> }
> cout<<w<<endl;
>
> return 0;
> }
>
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator