题目大意
给定 $n$ 个数对 $(x_i,y_i)$ ,求所有 $x_i$ 最小的数对中 $y_i$ 最小的数对。
数据范围
$1≤n≤1000$
$1≤x_i,y_i≤1000$
思路
用 $STL$ 的 $sort$ 或者直接手动筛选。
代码1
自定义 $STL$ 的 $sort$
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y;
}q[1111];
int n;
bool cmp(node a,node b)
{
if(a.x!=b.x)return a.x<b.x;
return a.y<b.y;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>q[i].x>>q[i].y;
sort(q+1,q+1+n,cmp);
cout<<q[1].x<<' '<<q[1].y;
return 0;
}
代码2
手动查找(结构体)
#include<bits/stdc++.h>
using namespace std;
struct node
{
int x,y;
}q[1111];
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>q[i].x>>q[i].y;
node ans={1111,1111};
for(int i=1;i<=n;i++)
{
if(q[i].x<ans.x)ans.x=q[i].x,ans.y=q[i].y;
if(q[i].x==ans.x)ans.y=min(ans.y,q[i].y);
}
cout<<ans.x<<' '<<ans.y;
return 0;
}
代码3
手动查找(数组与变量)
#include<bits/stdc++.h>
using namespace std;
int x[1111],y[1111];
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>x[i]>>y[i];
int ansx=1111,ansy=1111;
for(int i=1;i<=n;i++)
{
if(x[i]<ansx)ansx=x[i],ansy=y[i];
if(x[i]==ansx)ansy=min(ansy,y[i]);
}
cout<<ansx<<' '<<ansy;
return 0;
}
总结
以上方法皆可,建议使用第一种。
此题可能还有其余方法,有兴趣的读者可以自己探索。
如果有什么问题,欢迎在评论区中指出。