题目描述
小王是公司的仓库管理员,一天,他接到了这样一个任务:从仓库中找出一根钢管。这听起来不算什么,但是这根钢管的要求可真是让他犯难了,要求如下:
1、 这根钢管一定要是仓库中最长的;
2、 这根钢管一定要是最长的钢管中最细的;
3、 这根钢管一定要是符合前两条的钢管中编码最大的(每根钢管都有一个互不相同的编码,越大表示生产日期越近)。
相关的资料到是有,可是,手工从几百份钢管材料中选出符合要求的那根……
要不,还是请你编写个程序来帮他解决这个问题吧。
输入
第一行是一个整数N(N<=10)表示测试数据的组数)
每组测试数据的第一行 有一个整数m(m<=1000),表示仓库中所有钢管的数量,
之后m行,每行三个整数,分别表示一根钢管的长度(以毫米为单位)、直径(以毫米为单位)和编码(一个9位整数)。
输出
对应每组测试数据的输出只有一个9位整数,表示选出的那根钢管的编码,
每个输出占一行
样例输入
2
2
2000 30 123456789
2000 20 987654321
4
3000 50 872198442
3000 45 752498124
2000 60 765128742
3000 45 652278122
样例输出
987654321
752498124
分析:一开始我看这道题,以为是水题。通过结构体排序然后输出排序好的第一个即可。很自信的提交了一发,判题机也很爽快的给我WA掉。原因:输出超限.......
后来发下原因是把部分变量定义为了全局变量,改正之后AC了
#include<stdio.h>
#include<algorithm>
using namespace std;
typedef long long ll;
struct Tube//定义存储管道信息的结构体
{
ll len,wid,num;//长度,直径,编号
}tube[1000];
bool cmp(Tube a,Tube b)//定义排序方法
{
if(a.len>b.len)//长的钢管优先在前
return true;
else if(a.len==b.len&&a.wid<b.wid)//长度相同时,细的钢管优先在前。
return true;
else if(a.len==b.len&&a.wid==b.wid&&a.num>b.num)//长度和直径都相同时编号大的钢管优先在前
return true;
else return false;
}
int main(){
ll t,n,i,j,k;
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);//输入钢管数量
for(i=1;i<=n;i++)
{ //输入钢管长度、直径、编号
scanf("%lld%lld%lld",&tube[i].len,&tube[i].wid,&tube[i].num);
}
sort(tube+1,tube+n+1,cmp);//对钢管进行排序
printf("%lld\n",tube[1].num);输出符合要求的钢管
}
}
那么,我们能不能在每次输入时就能对数据进行比较呢?
方法二:
我们可以先定义一个暂存数据用于存取最大数据,然后对每次输入进行比较
#include<stdio.h>
typedef long long ll;
ll len,wid,num,i,j,k,t,n,tlen,twid,tnum;
int main()
{
scanf("%lld",&t);
while(t--)
{
scanf("%lld",&n);//输入钢管数量
tlen=0,twid=0,tnum=0;
for(i=1;i<=n;i++)
{
scanf("%lld%lld%lld",&len,&wid,&num);//输入钢管对应的长度、直径、编号
if(len>tlen||(len==tlen&&wid<twid)||(len==tlen&&wid==twid&&num>tnum))
{ //直接与暂存数据进行比较
tlen=len,twid=wid,tnum=num;//符合则更新数据
}
}
printf("%lld\n",tnum);//输入最终符合条件的数据
}
}