USACO Overfencing解題報告

2021-05-24 12:01:30 字數 1214 閱讀 2129

思路:dijkstra求最短路徑,然後對於同一出發點求到兩個出口之間的較小者,最後對於所有出發點求乙個最大值,即所謂的worst point.當然這題在空間上需要優化,用堆來優化是乙個可行的辦法。其實用乙個unsigned char型的陣列來記錄每兩點間距離就可以保證恰好不超空間。當然,網上說可以用floodfill可以更容易得到答案。

/*id: xpli1

prog: maze1

lang: c

*/#include

#define  vetexnum  3801

#define  dis_max   999999

#define max(a,b) (((a) > (b)) ? (a) : (b))

#define min(a,b) (((a) < (b)) ? (a) : (b))

unsigned char square[vetexnum][vetexnum];        // 初始化為四邊封閉

int da[vetexnum];

int db[vetexnum];

int flag[vetexnum];

int w,h;

char buf[80];

int va,vb;

void dij(int* d,int vetexnum,int v0)

d[v0] = 0; flag[v0] = 1;

for(i=1; iint min = dis_max;

for(j=0; jif(!flag[j])

if(d[j] < min)

}flag[v] = 1;

for(j=0; jd[j] = min + square[v][j];}}

}return;

}int main(void)

else }}

for(i=1; i<2*h; i++) else }

if(i&1 && buf[2*w] == ' ') else }

for(j=1; j<2*w; j++)

}else if((!(i&1)) && j&1)}}

}fgets(buf,sizeof(buf),fin);

for(j=1; j<2*w; j++) else }}

dij(da,w*h,va);

dij(db,w*h,vb);

int max = -1;

for(i=0; ireturn 0;

}

USACO Hamming Codes 解題報告

資料小,暴力搜尋可以搞定。但是推薦使用dfs,每個節點 數 有取與不取兩個分支。注意 0是必須出現的。證明如下 最終得到的結果序列中,0是必須出現的,證明如下 如果存在另乙個滿足要求的結果序列s 其最小值為a1 n 0,那麼序列s s n 是滿足條件的最小解,且首元素為0 id xpli1 prog...

USACO Closed Fences 解題報告

幾何題看著就很有畏懼感。這裡用的是最 的演算法,時間複雜度應該在n 2。還沒看別人的解題報告,不過我猜nlogn的解法是有的。比如判斷乙個fence是不是valid的時候,這裡將所有的線段兩兩比較,看是否相交。但是有個叫line sweep的演算法,可以在nlogn的時間複雜度內完成。既然accep...

Wiggle Subsequence解題報告

這道題和最長子序列,divisible subset題目類似,都可以用o n2 的時間複雜度完成。可以想象,對於第i個數,dp i dp j 1,當且僅當dp j 1 dp i 而且nums j 和nums i 的差值和j所處位置的差值符號相反。所以,如下 class solution if dp ...