51 nod 1521 一维战舰 时间复杂度O(n),同 Codeforces 567D. One-Dimensional Battle Ships 有详细注释
生活随笔
收集整理的這篇文章主要介紹了
51 nod 1521 一维战舰 时间复杂度O(n),同 Codeforces 567D. One-Dimensional Battle Ships 有详细注释
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:51nod:
題目Codeforces:
?
?
?
題目注意到兩個戰艦不能挨在一起就可以了。
?
// 每一段 struct node{int left; // 段的左端點int right; // 段的右端點int length; // 段長度int ship; // 段最大容納戰艦數 }arr[200005];每一段可容納戰艦數:
ship*a + (ship - 1) <= length; ? --> ? ship = (length+1) / (a+1);(舍去小數部分)
?
構造出這么一個數據結構就簡單了。
?
現在還有一個問題:找到說miss的點所在段還需要時間,就算是二分查找也需要O(log(n)),加上遍歷的O(n),時間復雜度O(n*log(n))。
可不可能會超時呢?我認為有可能,所以保險起見,我用了一個數組index[i]表示第i個點所在的段,用空間換時間,比較值。
?
?
?
一次就AC了,思路就這么多,上代碼把:
#include <bits\stdc++.h> using namespace std; typedef long long ll;// 每一段 struct node{int left; // 段的左端點int right; // 段的右端點int length; // 段長度int ship; // 段最大容納戰艦數 }arr[200005]; int len = 0; // 段的數量int index[200005]; // 每一個點所處的段int n,k,a,m; int miss; // 每一次說miss的位置。int sumShip = 0; // 現階段可容納最多戰艦數// 獲取某段可容納最大戰艦數量 int maxShip(node node1){return (node1.length+1)/(a+1); }//初始化 void init(){arr[0].left = 1;arr[0].right = n;arr[0].length = arr[0].right - arr[0].left + 1;arr[0].ship = maxShip(arr[0]);sumShip = arr[0].ship;len = 1; }//更新段 void updataNode(int miss){int con = index[miss]; // miss位置所在段node* x = &arr[con]; //取出這個段int shipNum = x->ship;arr[len].left = miss+1;arr[len].right = x->right;arr[len].length = arr[len].right - arr[len].left + 1;arr[len].ship = maxShip(arr[len]);replace(index+arr[len].left,index+arr[len].right+1 , con ,len); // 將其中一部分所在段改變 x->right = miss-1;x->length = x->right - x->left + 1;x->ship = maxShip(*x);sumShip -= shipNum - arr[len].ship - x->ship; // 總容納戰艦數減少的數量等于分段后減少的戰艦數量 len++; }int main() {cin >> n >> k >> a >> m;init(); // 初始化for(int i = 1;i <= m; ++i){cin >> miss;updataNode(miss); // 更新段if(sumShip < k){cout << i << endl;return 0;}}cout << -1 << endl;return 0; } //written by zhangjiuding.?
代碼中涉及到的replace是頭文件algorithm中的,
replace(a+3,a+10,p,q);
表示的是將a[i](i = [3,9])中的p全部換成q。
?
總結
以上是生活随笔為你收集整理的51 nod 1521 一维战舰 时间复杂度O(n),同 Codeforces 567D. One-Dimensional Battle Ships 有详细注释的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 51nod 1126 求递推序列的第N项
- 下一篇: 剑指offer(纪念版)读书笔记【实时更