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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

poj 1716(贪心)

發布時間:2025/3/16 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 poj 1716(贪心) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:給出數軸上的n個區間,每個區間都是連續的int區間。現在要在數軸上任意取一堆元素,構成一個元素集合V,要求每個區間和元素集合V的交集至少有兩個不同的元素求集合V最小的元素個數。

解題思路:

考慮到區間之間的重疊性,所以每次都要盡可能地去每個區間靠后的值,才能保證前后兩個區間公共的元素最多,其實把握了這個思想后就是個簡單的貪心思想了。一開始我是拿每個區間的開始端進行排序,結果WA。。。后面才想到,如果兩個區間是包含的關系,那么這樣會出現問題。


AC:

#include<iostream> #include<algorithm> using namespace std;typedef class { public:int s,e; }interval; //間隔(區間)int cmp(const void* a,const void* b) {interval* x=(interval*)a;interval* y=(interval*)b;return (x->e) - (y->e); //對區間按末端點排序 }int main(void) {int n; //區間數while(cin>>n){interval* inter=new interval[n];for(int i=0;i<n;i++)cin>>inter[i].s>>inter[i].e;qsort(inter,n,sizeof(interval),cmp); //對區間按末端點排序int Selem=inter[0].e-1 , Eelem=inter[0].e; //當前區間所取的兩個元素,初始化為第0個區間最后兩個元素int sum=2; //至少取sum個元素才能保證每個區間至少含有其中的2個元素for(int k=1;k<n;k++)if(inter[k].s<=Selem) //前一個區間所取的兩個元素都在當前區間內continue; //則當前區間無需取任何元素else if(inter[k].s<=Eelem) //前一個區間所取的只有一個元素在當前區間內{Selem=Eelem;Eelem=inter[k].e; //按序更新當前區間所取的兩個元素:Selem與Eelemsum++; //Eelem是新取的一個元素}else //前一個區間所取的沒有一個元素在當前區間內{Selem=inter[k].e-1;Eelem=inter[k].e; //按序更新當前區間所取的兩個元素:Selem與Eelemsum+=2; //Selem與Eelem是新取的兩個元素}cout<<sum<<endl;delete inter;}return 0; }

總結

以上是生活随笔為你收集整理的poj 1716(贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。

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