網路賽結束,看了大神的**以後才寫出來的,這是一道貪心演算法,選區域性最優方案:就是相鄰兩個點不能直接到達做特別討論。易證:如果兩個點不能直接到達,那麼每次讓青蛙走兩步到達(l+1)的距離是最優選擇,如果現在青蛙的位置是now ,那麼到達now 的那一步走了step,然後對now 後面的那個點進行討論:如果length=stone[now+1]-stone[now],now+length<=l說明前一步可以到達now+1;這個時候更新now 的位置,試青蛙每一次都能夠盡量地跳得遠。這樣還要把第一次的幾種情況討論一下才能ac,至於複雜度,也只有o(2*10^5),只需要更新now的位置,所以只要遍歷一邊所有石頭的位置就好了
詳細看下面ac**:
#include
#include
#include
#include
#include
#include
using namespace std;
int n,m,l;
int stone[200010];
int cnt;
void solve()
step+=length;
now+=1;
}else if(length<=l)
else if(length>l)
else
}else
else}}
}printf("%d\n",cnt);
}int main()
stone[n+1]=m;
printf("case #%d: ",k);
solve();
}return 0;
}
2018北京網路賽A題
一道搜尋題寫了好久沒寫出來 一直拖到現在才補起來 題目不難 只是有一些地方以前沒注意過 現把幾點要注意的指出來 一 因為每一次移動可能耗時1也可能耗時2 所以不能用單純的佇列 需要用優先順序佇列 二 因為氧氣罐數量的不同而導致狀態的不同 需要三維的陣列來記錄狀態 三 為了 的簡潔 把v陣列的判斷和賦...
2015北京網賽 G Boxes bfs
題目大意 給你n n 8 個互不相同的數,問進行多少次操作後能讓這些數變成公升序,無法變成就輸出 1,具體操作是,每個數只能每次只能移動到與他相鄰的空位或者比他大的數上。如 2,1,3 可以通過 2,1 3 2,1 3 1 2 3 1,2,3 這4次變換達到。思路 就是狀態壓縮之後的bfs了,用乙個...
acm 2018北京網路賽B題
這個題的題意就是給n n 10個字串,長度不超過8,但是n個字串每乙個都可以組成乙個環,然後求這n個字串的最長公共子串行 我的做法就是使用位運算遍歷。朱學長要打我.就是每一位就是乙個0 1,來遍歷,這樣就比for迴圈遍歷快很多,然後分別使用map來存同時要避免在每個字串中子串出現次數大於1,然後再用...