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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

电影与爆米花(模拟)

發布時間:2023/12/10 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 电影与爆米花(模拟) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目大意:

n個人是朋友,他們坐在一排去看電影,相鄰的最多三個人可以吃同一桶爆米花。每個人都想遲到爆米花,問最少需要幾桶爆米花?

輸入:一個數組,代表這n個人每個人選擇的座位號。

輸出:最少幾桶爆米花

數據范圍:0<n<=100,0<=a[i]<1000

解題報告:

一題多解。這題是模擬,但是有無數種模擬的方式,我看到數據范圍第一反應就是如下的模擬方式:

新建一個數組保存每個位置上是否有人坐。然后從小到大遍歷這個數組維護答案就可以了。

注意寫的時候不能【當前位置cur有人則直接考慮cur+3的位置】,因為如果是【有,無,有】這種情況,其實是應該買兩桶爆米花的。

再就是一些細節問題,比如while循環結束的時候,cur得到的是可行的最后一個位置,還是可行解的下一個位置。

時間復雜度O(n)。

思考:如果這題數據范圍改成n<1e5, a[i]<1e9,那就不能做什么做了。應該是對原數組排序然后再遍歷。復雜度O(nlogn)可解。

AC代碼:

#include<iostream> #include<vector> #include<queue> using namespace std;int checkNeighboring(std::vector<int> seatNumbers) {int maxx = 0;for(int i = 0; i<seatNumbers.size(); i++) {maxx = std::max(seatNumbers[i], maxx);}std::vector<bool> vv(maxx + 1, false);for(int i = 0; i<seatNumbers.size(); i++) {vv[seatNumbers[i]] = true;}int cur = 0;int ans = 0;while(cur <=maxx) {if(vv[cur] == true) {ans ++;int up = std::min(cur+2, maxx);while(cur <= up && vv[cur]) cur ++;cur--;}cur += 1;}return ans; }int main() {vector<int> t1;t1.push_back(1);t1.push_back(2);t1.push_back(3);t1.push_back(4);t1.push_back(10);cout << checkNeighboring(t1) << endl; vector<int> t2;t2.push_back(1);t2.push_back(3);t2.push_back(4);t2.push_back(7);t2.push_back(8);t2.push_back(10);cout << checkNeighboring(t2) << endl;vector<int> t3;t3.push_back(4);t3.push_back(8);t3.push_back(7);t3.push_back(5);t3.push_back(6);cout << checkNeighboring(t3) << endl;return 0; }

總結

以上是生活随笔為你收集整理的电影与爆米花(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。

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