hdu1146
題意:
? ? ? 題意最蛋疼,其實是水題,這個題意整的我wa了一個多小時,我就改改題意吧..有一條河,剛開始的時候在左岸有一條船,這條船最多能運n個貨物,一趟的時間是t,有m個貨物,每個貨物有自己到達岸邊的時間,你的任務就是輸出所有貨物到達對岸的那一刻的時間..只有當兩岸有人船就會動,否則不會動..
思路:
? ? ? 題意最蛋疼,其實是水題,這個題意整的我wa了一個多小時,我就改改題意吧..有一條河,剛開始的時候在左岸有一條船,這條船最多能運n個貨物,一趟的時間是t,有m個貨物,每個貨物有自己到達岸邊的時間,你的任務就是輸出所有貨物到達對岸的那一刻的時間..只有當兩岸有人船就會動,否則不會動..
思路:
? ? ?水模擬,這個題目別想多了,我們把自己當成是開船的就能知道怎么敲了,首先我們把左岸的存在一個數組里,右岸的存在一個數組里,循環的條件是(l <= n_l || r <= n_r),就是只要有人就循環,想想如果我們是開船人,每一步我們肯定是 那個岸的人來的早我們就開往哪個岸了,當時有一點要注意,就是假如當前我們在左岸,而右岸的那個比左岸早,那么我們肯定是要去右岸的,而我們什么間才能到右岸呢? 是右岸 node[r]? 還是 node[r] + t ?,其實都不是,而是time = ?maxx(now_time + t ,node[r] + t);因為最快的時間是 node[r] + t,因為你是看見后才過去的,但是如果那個人是在你干活的時候來的,那么node[r] + t的時候你肯定趕不過去,所以取大的,還有就是雖然已經決定去右岸了,到達右岸的時間是上面的那個time,但我們如果在去之前,也就是time - t之前能在左岸拉幾個貨物我們肯定是拉著啊,反正題目說了,裝卸貨物時間0,那么不正白不正啊,所以把左岸能撿的就拉了就行了..就這樣遍歷到最后就行了.還有就是出題的那個貨行不行了,題意說的神我本來就夠蛋疼的了,測試數據之間輸出換行能不能說下啊,整的老子各種wa之后又pe了一次..上面是個人見解,有錯誤望大牛支出..
#include<stdio.h> #include<string.h>#define N 10000 + 50 int node_l[N] ,node_r[N]; int id_l[N] ,id_r[N]; int ans[N]; int n_l ,n_r;int maxx(int x ,int y) {return x > y ? x : y; }int main () {int n ,y ,m ,tt ,t;int i ,j ,time;char str[10];scanf("%d" ,&tt);while(tt--){scanf("%d %d %d" ,&n ,&t ,&m);n_l = n_r = 0;for(i = 1 ;i <= m; i ++){scanf("%d %s" ,&time ,str);if(str[0] == 'l') {node_l[++n_l] = time;id_l[n_l] = i;}else {node_r[++n_r] = time;id_r[n_r] = i;}}int now_fx = 1 ,now_time = 0;int l = 1 ,r = 1;while(l <= n_l || r <= n_r){ if(l <= n_l && node_l[l] < node_r[r] || r > n_r){if(now_fx != 1) now_time = maxx(now_time + t,node_l[l] + t);else now_time = maxx(now_time ,node_l[l]);if(now_fx != 1){for(i = 1 ;i <= n && r <= n_r;i ++){if(node_r[r] <= now_time - t){ans[id_r[r++]] =now_time;}else break;}} for(i = 1 ;i <= n && l <= n_l ;i ++){if(node_l[l] <= now_time){ans[id_l[l++]] =now_time + t; }else break;}now_fx = 2;now_time += t;}else{if(now_fx != 2) now_time = maxx(now_time + t,node_r[r] + t);else now_time = maxx(now_time ,node_r[r]);if(now_fx != 2){for(i = 1 ;i <= n && l <= n_l;i ++){if(node_l[l] <= now_time - t){ans[id_l[l++]] =now_time;}else break;}} for(i = 1 ;i <= n && r <= n_r;i ++){if(node_r[r] <= now_time){ans[id_r[r++]] =now_time + t;}else break;}now_fx = 1;now_time += t;}}for(i = 1 ;i <= m ;i ++)printf("%d\n" ,ans[i]);if(tt) printf("\n");}return 0; }
總結
- 上一篇: hdu4494
- 下一篇: hdu4499 搜索