您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: