题目描述
小王是公司的仓库管理员,一天,他接到了这样一个任务:从仓库中找出一根钢管。这听起来不算什么,但是这根钢管的要求可真是让他犯难了,要求如下: 1、这根钢管一定要是仓库中最长的; 2、这根钢管一定要是最长的钢管中最细的; 3、这根钢管一定要是符合前两条的钢管中编码最大的(每根钢管都有一个互不相同的编码,越大表示生产日期越近)。 相关的资料到是有,可是,手工从几百份钢管材料中选出符合要求的那根…… 要不,还是请你编写个程序来帮他解决这个问题吧。
输入
第一行为一个整数N(1 <= N <= 1000 ),表示仓库中所有钢管的数量。 之后N行,每行三个整数,分别表示一根钢管的长度(以毫米为单位)、直径(以毫米为单位)和编码(一个9位整数)。
输出
只有一个9位整数,表示选出的那根钢管的编码。
样例输入
4
3000 50 872198442
3000 45 752498124
2000 60 765128742
3000 45 652278122
样例输出
752498124
#include <iostream>
using namespace std;
int main()
{
struct guan
{
int n;
int m;
int y;
};
int t,i,j;
cin >> t;
guan a[1100],k;
for (i=0;i<t;i++)
{
cin >> a[i].n >> a[i].m >> a[i].y;
}
for(i=0;i<t-1;i++)
{
for (j=i;j<t;j++)
{
if (a[i].n<a[j].n)//第一个要求排序
{
k=a[i];
a[i]=a[j];
a[j]=k;
}
if (a[i].n==a[j].n&&a[i].m>a[j].m)//满足第一个要求的数再第二个要求排序
{
k=a[i];
a[i]=a[j];
a[j]=k;
}
if (a[i].n==a[j].n&&a[i].m==a[j].m&&a[i].y<a[j].y)//满足第一个要求的数再满足第二个要求再第三个要求排序
{
k=a[i];
a[i]=a[j];
a[j]=k;
}
}
}
cout << a[0].y << endl;
return 0;
}
<span style="font-size:24px;color:#ff0000;">重新写过代码,用set实现,减少了双重循环,代码量也相对少了。</span>
<span style="font-size:24px;color:#ff0000;">
</span>
<pre name="code" class="cpp">#include <iostream>
#include <set>
using namespace std;
struct S
{
int a;
int b;
int c;
}k;
bool operator<(const S& p ,const S& q)
{
return p.a>q.a || p.a==q.a&&p.b<q.b || p.a==q.a&&p.b==q.b&&p.c>q.c ;
}
int main()
{
int n,m;
set<S> str;
cin >> n;
while (n--)
{
cin >> m;
while (m--)
{
cin >> k.a >> k.b >> k.c ;
str.insert(k);
}
set<S>::iterator it=str.begin();
cout << it->c << endl;
str.clear();
}
return 0;
}