您的位置:首页 > 其它

URAL 1969. Hong Kong Tram

2013-11-07 22:43 288 查看
有一个trick就是没想到,枚举第二段时间后,要检测该火车能否继续跑一圈来判断,不能先检测前半圈能不能跑加进去后在检测后半段;

// **** 部分不能放在那个位置;

最近代码导致的错误总是找不出,贴下代码权当提醒吧!!

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<vector>
#include<algorithm>
using namespace std;
int us[180000];
int ID[180000];
vector<int> pr[5100];
int ti[5100];
int n;
void FIND(int i,int x,int nn,int y){
int pt = ti[i] - x;
pr[nn].clear();
pr[nn].push_back(ti[i] - x);
while ( true )
{
int nt = pt + x;
if ( ID[nt] == -1 ) break;
us[nt] = 1;
//  pr[nn].push_back(pt + x + y); ****
nt = nt + y + y;
if (ID[nt] == -1) break;
us[nt] = 1;

pr[nn].push_back(pt + x + y);
pr[nn].push_back(pt + x + y + y + x);
pt = pt + y * 2 + x + x;
}
}
int work(int x,int y) {
memset(us, 0, sizeof us);
pr[0].clear();
int mm = 0;
us[ti[1]] = 1;
FIND(1,x,0,y);
int nn = 1;
mm = pr[0].size();
if ( (mm - 1) % 2 ) return 0;
for ( int i = 2; i < n; i ++ )
{
if ( us[ti[i]] ) continue;
us[i] = 1;
FIND(i,x,nn,y);
nn ++;
if ( pr[nn-1].size() != mm ) return false;
}
if (pr[0][2] <= pr[nn-1][0]) return 0;

for (int i = 0; i < nn; i++) {
int sz = pr[i].size();
for (int j = 0; j < sz; j++) {
int hh,mm,ss;
hh = pr[i][j] / 3600;
mm = pr[i][j] % 3600 / 60;
ss = pr[i][j] % 3600 % 60;
printf("%02d:%02d:%02d%c",hh,mm,ss, j == sz-1 ? '\n':' ');
}
}
return 1;
}
void solve(){
for (int k = 2; k < n; k++) {
int tx = ti[1] - ti[0], ty = ti[k] - ti[1];
if (ty % 2) continue;
if (work(tx,ty/2)) return;
}
//  cout<<" ** "<< endl;
}
int main(){
// freopen("in.txt","r",stdin);
n = 0;
int hh,mm,ss;
memset(ID,-1,sizeof(ID));
while (~scanf("%d:%d:%d",&hh,&mm,&ss)) {
ti[n++] = hh * 3600 + mm * 60 + ss;
ID[ti[n-1]] = n-1;
}
// cout<<" ** "<<endl;
solve();
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: