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;
}
用两个 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 Array Values in PHP(数组排序)
- 【正则表达式】javascript正则表达式
- GridView应用三---GridView正反双向排序:
- jquery UI入门手册
- 喷水装置(一)
- leach协议在NS 2.34上的安装(半转半改)
- leach协议在NS 2.34上的安装(半转半改)
- POJ 1007 解题报告 DNA Sorting
- poj 1094 Sorting It All Out
- using datagrid
- C语言常用排序全解
- sicily 题目之 1154 1200 1324
- Java实现的几个常用排序算法详细解读
- POJ题目分类
- Insertion sort algorithm
- Selection sort
- OGRE渲染队列分析总结
- 《黑与白》游戏的地形文件格式 - Version 1-2001
- 一段js表格排序代码
- DataGrid网上资源搜集