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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

第 2 章:初出茅庐【初级篇 - 2.2 贪心算法】

發布時間:2025/3/20 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第 2 章:初出茅庐【初级篇 - 2.2 贪心算法】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 206. 硬幣問題 II【簡單】
  • 212. 區間調度問題【常見模型】
  • 213. 字典序最小問題 Best Cow Line【有意思的模型】
  • 214. 薩魯曼的軍隊 Saruman's Army【常見的模型】
  • 217. 柵欄修理 Fence Repair【常見模型】

206. 硬幣問題 II【簡單】


https://www.papamelon.com/problem/206
顯而易見的是先用面值大的鈔票。

#include<bits/stdc++.h> using namespace std; int a[10],t,n,m; int b[10]={1,5,10,50,100,500}; int main(void) {cin>>t;while(t--){for(int i=0;i<6;i++) cin>>a[i];cin>>m;int cnt=0;for(int i=5;i>=0;i--){int temp=min(m/b[i],a[i]);m-=b[i]*temp,cnt+=temp;}cout<<cnt<<endl;} }

212. 區間調度問題【常見模型】


https://www.papamelon.com/problem/212
按照右端點排序。越早選,越早結束。因為我們的右端點是從小到大排序的。

#include<bits/stdc++.h> using namespace std; int n,l,r; int main(void) {while(cin>>n){vector<pair<int,int>>ve;for(int i=0;i<n;i++){cin>>l>>r;ve.push_back({r,l});}sort(ve.begin(),ve.end());int cnt=1;r=ve[0].first;for(int i=1;i<ve.size();i++){if(ve[i].second>r){cnt++;r=ve[i].first;}}cout<<cnt<<'\n';}return 0; }

213. 字典序最小問題 Best Cow Line【有意思的模型】


https://www.papamelon.com/problem/213
本題的關鍵難點在于,當頭尾相同的時候該如何選。
我們需要特別的判斷,其剩余字符串正和反的哪個更優。

#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int n; char c; string s,ans; bool cmp(int l,int r) {string s1=s.substr(l,r-l+1); string s2=s1;reverse(s2.begin(),s2.end());if(s1<=s2) return true;else return false; } int main(void) {cin>>n;for(int i=0;i<n;i++) cin>>c,s+=c;int l=0,r=n-1;while(l<=r){if(s[l]<s[r]) ans+=s[l],l++;else if(s[r]<s[l]) ans+=s[r],r--;else {if(cmp(l,r)) ans+=s[l],l++;else ans+=s[r],r--;}}int cnt=0;for(int i=0;i<ans.size();i++){cout<<ans[i];cnt++;if(cnt%80==0) cout<<endl;}return 0; }

214. 薩魯曼的軍隊 Saruman’s Army【常見的模型】


https://www.papamelon.com/problem/214

#include<bits/stdc++.h> using namespace std; int r,n,x; int main(void) {while(cin>>r>>n,r!=-1||n!=-1){vector<int>ve;for(int i=0;i<n;i++) cin>>x,ve.push_back(x);sort(ve.begin(),ve.end());ve.erase(unique(ve.begin(),ve.end()),ve.end());//去重int cnt=0;for(int i=0;i<ve.size();i++){int j=i;int len=ve[i]+r;while(j+1<ve.size()&&ve[j+1]<=len) j++;//找到最優的點len=ve[j]+r;while(j+1<ve.size()&&ve[j+1]<=len) j++;//講當前選的點右邊可以覆蓋的過濾掉。cnt++;i=j;}cout<<cnt<<endl;}return 0; }

217. 柵欄修理 Fence Repair【常見模型】


https://www.papamelon.com/problem/217
切和合并本質是同一種。就是一個典型的哈夫曼樹。

#include<bits/stdc++.h> using namespace std; typedef long long int LL; LL n,x,sum; priority_queue<LL,vector<LL>,greater<LL>>heap; int main(void) {cin>>n;while(n--) cin>>x,heap.push(x);while(heap.size()>1){auto a=heap.top(); heap.pop();auto b=heap.top(); heap.pop();sum+=a+b;heap.push(a+b); }cout<<sum;return 0; }

總結

以上是生活随笔為你收集整理的第 2 章:初出茅庐【初级篇 - 2.2 贪心算法】的全部內容,希望文章能夠幫你解決所遇到的問題。

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