您的位置:首页 > 其它

596 C. Wilbur and Points

2015-11-23 15:15 411 查看
将具有相同 wi 的点放到同一个 set 中去,这里用 map<int,set>  来实现,而且插入到  set 中的点是按 x 坐标的升序排序,因为最后的结果肯定是要 x 和 y 都尽量小的在前面。

用两个 vector, 一个存储 由点坐标求出来的 w,一个存储输入的 w,排序后比较这两个vector,如果不相同,则结果为 “NO”, 否则就按输入的 w 的值,来在相应的 set 中找点,按顺序

分配完所有的点后,就是检查结构是否符合标号分配的原则了,这里只需要比较相邻的两个点就行。

代码如下;

#include <iostream>
#include <set>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
struct node
{
node() = default;
node(int i,int j):x(i),y(j){
}
int x;
int y;
bool operator< (const node &a)const
{
return x<a.x;
}
};
int main()
{
int n,i,j,xx,yy;
map<int,set<node>> mp;
cin>>n;
vector<int> vec1(n),vec2(n),vec3(n);
vector<node> vec(n); //存储最后的结果点
for(i=0;i<n;++i)
{
scanf("%d%d",&xx,&yy);
mp[yy-xx].insert(node(xx,yy)); //将相同 w 的点映射到同一个 set 中去
vec1[i] = yy-xx; //保存点求出来的 w
}
for(i=0;i<n;++i)
scanf("%d",&vec2[i]);//保存输入的w
sort(vec1.begin(),vec1.end());//排序
vec3 = vec2;//因为后面还要用到输入的 w ,所以要赋值一下
sort(vec2.begin(),vec2.end());//排序
if(vec1!=vec2)
cout<<"NO";
else
{
for(i=0;i<n;++i)
{//mp[vec3[i]]得到w值为vec3[i]的点 set,只需要从前往后取就行,因为set已经排序
vec[i] = *(mp[vec3[i]].begin());
mp[vec3[i]].erase(mp[vec3[i]].begin());//取完一次,删除表头,下次继续取表头,这样就是顺序取得了
}
bool flag = true;
for(i=0;i<n-1;++i)
{
if(vec[i].x>=vec[i+1].x&&vec[i].y>=vec[i+1].y)
break;
}
if(i==n-1)
{
cout<<"YES"<<endl;
for(i=0;i<n;++i)
cout<<vec[i].x<<" "<<vec[i].y<<endl;
}
else
cout<<"NO";
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  sorting greedy