第288場周賽

緒論

在這里插入圖片描述

雖然沒有AK,但是不知道為什么排名比以前AK了都靠前。可能是因為最后一道題有些難度,縮小了我和大佬之間的差距。最后一個小時寫最后一道題,累死累活想了一個貪心遍歷的算法,當時是一直RE,后來下來調了調又WA了。

題目分析

A: 按奇偶性交換后的最大數字

做法就是用一個數據結構去保存奇數數字和偶數數字,要求這個數據結構能夠返回并彈出最大值。當時沒有仔細考慮,直接用了一個multiset去保存,因為紅黑樹本身就是有序的,所以每次彈出最后一個節點。但是因為把前置–寫成后置–了,所以還RE了一發,實在不應該。現在想一下應該用一個最大堆比較合適。

class Solution {
public:int largestInteger(int num) {multiset<int> s0, s1;string s = to_string(num);int x;for (auto c : s) {x = c - '0';if (x & 1) s1.insert(x);else s0.insert(x);}int ans = 0, y;decltype(s1)::iterator t;for (auto c : s) {x = c - '0';if (x & 1) {t = --s1.end();y = *t;s1.erase(t);} else {t = --s0.end();y = *t;s0.erase(t);}ans = ans * 10 + y;}return ans;}
};

B:向表達式添加括號后的最小結果

因為數據很小,所以沒有考慮直接模擬。雖然可以考慮預處理出每個位置的數字,但是因為實在太小了,已經懶得去考慮預處理了,直接模擬。

class Solution {
public:string minimizeResult(string expression) {int pos_p = expression.find('+');int n = expression.size();int a, b, c, d, ans = INT_MAX, x, y,t ;auto calc = [&](int l, int r) -> int {int ans = 0;for (int i = l; i < r; ++i) {ans = ans * 10 + expression[i] - '0';}return ans;};for (int i = pos_p - 1; i >= 0; --i) {for (int j = pos_p + 1; j < n; ++j) {a = calc(0, i);b = calc(i, pos_p);c = calc(pos_p + 1, j + 1);d = calc(j + 1, n);if (a == 0) a = 1;if (d == 0) d = 1;t = a * (b + c) * d;if (t < ans) {x = i;y = j + 1;ans = t;}}}string s;s.append(expression.substr(0, x));s.append("(");s.append(expression.substr(x, y - x));s.append(")");s.append(expression.substr(y, n - y));return s;}
};

C:K 次增加后的最大乘積

每次可以選擇一個數字增加1,使得最后的總乘積最大。經過觀察,發現如果增加1次,那么應該增加最小的數字,因為這樣總體的和增加的最大。當時時間比較緊迫,沒有多想直接按照這個思路寫了,然后過了。
當時的做法是用一個最小堆,每次取出堆頂元素然后加一再放入堆中,這樣的復雜度是O(nlogn),因為n不是太大,所以還可以接受。做最后一道題的時候也需要這樣一個數據結構,給集合中最小的數字增加1,增加k次,為了優化,我使用map保存每個數字出現的次數。因為map自身是有序的,所以我只需要將第一個元素增加。

class Solution {
public:int maximumProduct(vector<int>& nums, int k) {using ll = long long;constexpr ll MOD = 1e9 + 7;priority_queue<ll, vector<ll>, greater<ll>> q;for (auto x : nums) q.push(x);ll x;while (k--) {x = q.top(); q.pop();q.push(x + 1);}ll ans = 1;while (!q.empty()) {ans *= q.top();q.pop();if (ans >= MOD) ans %= MOD;}return static_cast<int>(ans);}
};

最后一道題的做法在這里同樣適用

function<void()> add;
add = [&]() {if (mp.empty()) return;if (k <= 0) return;auto iter = mp.begin();int x = iter->first;int y = iter->second;if (x == target - 1) return;if (k < y) {mp[x + 1] += k;iter->second -= k;return;} else {mp.erase(iter);mp[x + 1] += y;k -= y;add();}
};

這個貪心的正確性應該也不難證明:如果某次沒有增加最小值,那么,額,那么了半天也沒有想到證明。。。算了,有時間再補上吧

D:花園的最大總美麗值

沒做出來,有時間研究一下補一下,現在不想寫了。

class Solution {using ll = long long;
public:long long maximumBeauty(vector<int>& flowers, long long newFlowers, int target, ll full, ll partial) {sort(flowers.begin(), flowers.end());int n = flowers.size();int idx = n - 1, t;ll k = newFlowers;for (; idx >= 0; --idx) {t = target -flowers[idx];if (t <= 0) {} else if (t <= k) {k -= t;} else {break;}}//[0,i]ll cnt = n - idx - 1;map<int, int> mp;for (int i = 0; i <= idx; ++i) mp[flowers[i]] += 1;function<void()> add;add = [&]() {if (mp.empty()) return;if (k <= 0) return;auto iter = mp.begin();int x = iter->first;int y = iter->second;if (x == target - 1) return;if (k < y) {mp[x + 1] += k;iter->second -= k;return;} else {mp.erase(iter);mp[x + 1] += y;k -= y;add();}};add();auto getFirst = [&]() -> ll {if (mp.empty()) return 0;return mp.begin()->first;};ll ans = partial * getFirst() + cnt * full;if (idx < 0) idx = 0;for (; idx < n; ++idx) {if (flowers[idx] >= target) break;mp[flowers[idx]] += 1;k += target - flowers[idx];cnt--;add();ans = std::max(ans, partial * getFirst() + cnt * full);}return ans;}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/383515.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383515.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383515.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Clion遠程部署和運行

緒論 作為Clion的忠實粉絲&#xff0c;現在的我的幾乎所有的coding都是通過Clion完成。因為需要在服務器上進行開發&#xff0c;又離不開Clion&#xff0c;就了解了如何通過Clion遠程部署和開發。 主要是借鑒了博客&#xff1a;使用Clion優雅的完全遠程自動同步和遠程調試c。如…

C++ 單例模式 call_once : terminate called after throwing an instance of ‘std::system_error‘

在學習了C中可以使用call_once進行初始化資源后&#xff0c;我就想著寫一個單例模板供以后使用。 template<typename T> class SingleTon {using Ptr std::shared_ptr<T>;static Ptr p;static std::once_flag flag;template<typename ...Args>static void …

C++讀寫鎖造成死鎖

C14支持std::shared_timed_mutex C17支持std::shared_mutex 前者相比后者支持的操作更多&#xff0c;但是后者相對性能更好。 使用std::lock_guard<std::shared_mutex>和std::unique_lock<std::shared_mutex>互斥訪問使用std::shared_lock<std::shared_mutex…

每日一題:449. 序列化和反序列化二叉搜索樹

題目分析 題目鏈接&#xff1a;449. 序列化和反序列化二叉搜索樹 覺得序列化很簡單&#xff0c;前序遍歷、后序遍歷、中序遍歷、層序遍歷等等。其中得到前序遍歷和后序遍歷是可以通過遞歸解法反序列化的&#xff0c;覺得這樣子做有點復雜。就想著可不可以一次遍歷。一次遍歷的…

C++高效集合數據結構設計

緒論 在復雜算法實現過程中我們經常會需要一個高效的集合數據結構&#xff0c;支持常數級別的增、刪、查&#xff0c;以及隨機返回、遍歷&#xff0c;最好還能夠支持交集、并集、子集操作 哈希集合實現 大家可能很快想到unordered_set&#xff0c;unordered_set由于底層是哈…

C++ 工具函數庫

在寫一些大型項目的過程中經常需要一些工具函數&#xff0c;例如獲取隨機數、計時器、打印函數、重要常量&#xff08;如最大值&#xff09;、信號與槽等&#xff0c;由于每一個工程都自己手動實現一個實在是太傻&#xff0c;我將其總結放入一個文件中。 utils.h // Copyright…

muduo網絡庫使用入門

muduo網絡庫介紹 muduo網絡庫是陳碩大神開發的基于主從Reactor模式的&#xff0c;事件驅動的高性能網絡庫。 網絡編程中有很多是事務性的工作&#xff0c;使用muduo網絡庫&#xff0c;用戶只需要填上關鍵的業務邏輯代碼&#xff0c;并將回調注冊到框架中&#xff0c;就可以實…

C++ map/unordered_map元素類型std::pair<const key_type, mapped_type>陷阱

在開發的過程中需要遍歷一個unordered_map然后把他的迭代器傳給另一個對象&#xff1a; class A; class B { public:void deal(const std::pair<int, A>& item); }; std::unordered_map<int, A> mp; B b; for (auto &pr : mp) {b.deal(pr); }在我的項目中…

Ubuntu install ‘Bash to dock‘

緒論 在Ubuntu環境搭建這篇博客中記錄了使用Dash To Dock來配置Ubuntu的菜單項&#xff0c;使得實現macOS一樣的效果。為了配置新電腦的環境&#xff0c;我還是想安裝這個軟件。但是如今在Ubuntu Software中已經找不到這個軟件了&#xff0c;我在網上借鑒了一些博客的經驗才得…

Leetcode第309場周賽

Date: September 4, 2022 Difficulty: medium Rate by others: ???? Time consuming: 1h30min 題目鏈接 競賽 - 力扣 (LeetCode) 題目解析 2399. 檢查相同字母間的距離 class Solution {public:bool checkDistances(string s, vector<int>& distance) {vec…

C++ 模板函數、模板類:如果沒有被使用就不會被實例化

C中如果一個模板函數沒有使用過&#xff0c;那么其局部靜態變量都不會被實例化&#xff1a; class A { public:A() {edward::print("A ctor");} };template<typename T> void test() {static A a; }int main() {test<int>(); //如果注釋掉則不會有輸出r…

C++ 條件變量的使用

緒論 并發編程紛繁復雜&#xff0c;其中用于線程同步的主要工具——條件變量&#xff0c;雖然精悍&#xff0c;但是要想正確靈活的運用卻并不容易。 對于條件變量的理解有三個難點&#xff1a; 為什么wait函數需要將解鎖和阻塞、喚醒和上鎖這兩對操作編程原子的&#xff1f;為…

C++Primer學習筆記:第1章 開始

本博客為閱讀《C Primer》&#xff08;第5版&#xff09;的讀書筆記 ps:剛開始的時候我將所有的筆記都放在一篇博客中&#xff0c;等看到第六章的時候發現實在是太多了&#xff0c;導致我自己都不想看&#xff0c;為了日后回顧&#xff08;不那么有心理壓力&#xff09;&#…

【ubuntu】ubuntu14.04上安裝搜狗輸入法

** 在ubuntu14.04.4 desktop 64amd版本上安裝sogou輸入法 ** 0.換安裝源為中國源&#xff08;可選&#xff0c;下載會快些&#xff09; 1.搭fcitx環境 2.安裝sogou for linux 詳細步驟&#xff1a; 因為sogou中文輸入法基于fcitx(Free Chinese Input Toy for X),需要先搭環境…

【ubuntu】ubuntu下用make編譯程序報錯找不到openssl/conf.h

ubuntu下用make編譯程序報錯找不到openssl/conf.h 安裝libssl-dev:i386&#xff0c;sudo apt-get install libssl-dev:i386 看好版本&#xff0c;如果不加i386默認下載的是32位&#xff0c;用ln命令連接過去也還是用不了的!libssl.dev安裝好后&#xff0c;用find / -name libs…

【ubuntu】ubuntu如何改變系統用戶名

ubuntu如何改變系統用戶名 方法1&#xff1a;修改現有用戶名 方法2&#xff1a;創建新用戶&#xff0c;刪掉舊用戶 方法1&#xff1a; * *—&#xff01;&#xff01;&#xff01;有博客說要先改密碼&#xff0c;再改用戶名&#xff0c;否則會出現無法登陸狀況&#xff01;&…

什么是signal(SIGCHLD, SIG_IGN)函數

什么是signal(SIGCHLD, SIG_IGN)函數 在進行網絡編程時候遇到這個函數的使用&#xff0c;自己學習結果如下&#xff0c;有不對請幫忙指正:) signal(SIGCHLD, SIG_IGN)打開manpage康一康~ sighandler_t signal ( int signum, sighandler_t handler );參數1 int signum: 就是…

ssh連接不上linux虛擬機

ssh連接不上linux虛擬機 1.開啟ssh服務 linux虛擬機下命令行輸入&#xff1a; start service ssh如果顯示沒有ssh&#xff0c;就下面兩個試一試哪一個ok&#xff0c;安裝一下ssh&#xff1a; sudo apt-get install openssh-server sudo apt-get install sshd2.還有人說可能是…

沒寫client,想先測試server端怎么辦?

沒寫client&#xff0c;想先測試server端怎么辦&#xff1f; 辦法&#xff1a; 1.先打開終端./server&#xff0c;運行起來server 2.再開一個終端&#xff0c; 輸入nc 127.0.0.1 8888 回車&#xff08;這里port號要和server里邊設置的一致&#xff0c;127.0.0.1是和本機的測試…

【報錯解決】linux網絡編程報錯storage size of ‘serv_addr’ isn’t known解決辦法

linux網絡編程報錯storage size of ‘serv_addr’ isn’t known解決辦法 報錯如下&#xff1a; server.c:18:21: error: storage size of ‘serv_addr’ isn’t known struct sockaddr_in serv_addr, clit_addr; ^server.c:18:32: error: storage size of ‘clit_addr’ isn’…