nyist 12(喷水装置二)---贪心算法
2012-02-25 20:51
288 查看
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=12 #include<iostream> #include<algorithm> #include<cmath> #include<vector> using namespace std; int n,m,flag; double width,height; struct circle { public: circle(){x=r=0;} circle(double w,double h):x(w),r(h){}; double dis() const; double Left() const {return x-dis();}//左边所能覆盖的最远距离的坐标 double Right()const {return x+dis();}//右边所能覆盖的最远距离的坐标 friend istream& operator>>(istream&,circle&); private: double x; double r; }; struct mysort//按照每个喷水装置所能覆盖的右边的最大坐标从小到大排序, { bool operator()(const circle &c1,const circle &c2) { return c1.Right()<c2.Right(); } }; /*****对结构体成员可以这样排序***** bool mysort1(const circle &c1,const circle &c2) { return c1.x<c2.x; } ... sort(v.begin(),v.end(),mysort1); ******************************/ inline double circle::dis() const { double D=r*r-height*height/4.0; if(D>=0) return sqrt(D); else return 0; } istream& operator>>(istream& input,circle& c) { input>>c.x>>c.r; } int main() { cin>>n; while(n--) { circle c; vector<circle> v; cin>>m>>width>>height; for(int i=0;i<m;i++) { cin>>c; v.push_back(c); } sort(v.begin(),v.end(),mysort());//对结构体成员函数排序 double len=0; int num=0,temp=-1; while(len<width) { flag=0; for(int i=temp+1;i!=v.size();i++)//贪心,找到能覆盖边界且覆盖右边的最远距离,这里的i最好是像标程中的定义:vector<circle>::size_type if(v[i].Left()<=len) { flag=1; temp=i;//记录位置 } if(!flag) break; else { num++; len=v[temp].Right();//以右边的最远距离为左边界,重新查找 } } cout<<(flag?num:0)<<endl; } return 0; } //主要是开始时不知道用sort()如何对结构体的成员函数排序,看了下标程才知道,感谢啊,现在知道啦~~~呵呵~
补充点东西:
v.capacity();//返回向量v的空间大小 v.reserve(m);//给向量v分配空间
将一个字符串中的指定字符复制到数组中:(这个是转载的~~呵呵)
#include<iostream> #include<string> using namespace std; void main() { char a[30]; memset(a,'\0',30); string str="1234567890"; str.copy(a,5);//在string变量str中复制5个字符到数组a中 cout<<a<<endl; }
返回字符串中的第一个字符:
string s="xuzengqiang"; cout<<*s.data<<endl;
顺便贴下nyist 14(会场安排问题):题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=14
同样是贪心算法,不分析:
#include<iostream> #include<iterator> #include<vector> #include<algorithm> using namespace std; int n,m,sum,temp,max; class Act{ public: Act(){start=end=0;} Act(int s,int e):start(s),end(e){} int Start() const {return start;} int End() const {return end;} friend bool operator<(const Act&,const Act&); friend istream& operator>>(istream&,Act&);//难道不能用const Act&?? private: int start; int end; }; bool operator<(const Act& a1,const Act& a2) { if(a1.end!=a2.end) return a1.end<a2.end; if(a1.end==a2.end&&a1.start!=a2.start) return a1.start<a2.start; } istream& operator>>(istream& in,Act& A) { in>>A.start>>A.end; } int main() { cin>>n; while(n--) { cin>>m; vector<Act> v; Act A; for(int i=0;i<m;i++) { cin>>A; v.push_back(A); } sort(v.begin(),v.end()); sum=1,temp=0; for(vector<Act>::size_type i=temp;i<v.size();i++) if(v[i].Start()>v[temp].End()) { sum++; temp=i; } cout<<sum<<endl; } return 0; }
相关文章推荐
- NYOJ 12 喷水装置(二)(贪心算法)
- nyoj 题目12:喷水装置(二)贪心算法
- 基于贪心算法的几类区间覆盖问题 nyoj 12喷水装置(二) nyoj 14会场安排问题
- NYOJ12——喷水装置(二)(贪心算法)
- nyist 12 喷水装置(二)
- nyist 12 喷水装置(二)
- NYOJ 12 喷水装置(二)
- 贪心算法--喷水装置(二)
- nyoj12喷水装置(二)
- nyoj 题号12 喷水装置(二)——南阳oj
- NYOJ 12 喷水装置(二).
- 南阳 12 喷水装置(2)
- 喷水装置(二)(南阳oj12)(贪心之区间覆盖问题)
- NYOJ--12--喷水装置(二)
- nyoj 12 喷水装置(二)【贪心】+【区间完全覆盖覆盖】
- 喷水装置 ACM题目 京东16招聘编程题(贪心算法)
- NYOJ-12 喷水装置2(贪心 区间覆盖)
- NYOJ 12 喷水装置(二)
- nyoj 12 喷水装置(二)
- NYoj-喷水装置(一)贪心算法