电影与爆米花(模拟)
生活随笔
收集整理的這篇文章主要介紹了
电影与爆米花(模拟)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目大意:
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; }總結
以上是生活随笔為你收集整理的电影与爆米花(模拟)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 蔚来ES7电动拖钩申报:2吨拖挂能力、7
- 下一篇: 发烧友们的i9游戏本有多极致?水冷都给你