日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

51 nod 1521 一维战舰 时间复杂度O(n),同 Codeforces 567D. One-Dimensional Battle Ships 有详细注释

發布時間:2024/4/19 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 有详细注释的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。