题目:
一个电子商务网站要向顾客推荐商品,可以让顾客指定规则。
现在某类顾客指定的规则是:
对于同一类商品,如果一个商品的销量高于所有该类商品销量的中位数,并且价格低于所有该类商品价格的中位数 ,
则向他推荐,显示商品编号,销量和价格。
如果有多个商品符合要求,推荐的顺序是
按销量从大到小排序,销量一样则按价格从低到高排序;
如果销量价格都一样,按输入顺序排序;
如果没有符合要求的商品,则提示不推荐,显示 no recommendation;
中位数定义:
一组数据按从小到大(或从大到小)的顺序排列,如果数据个数 n 为奇数(即,n=2k+1),则排在中间位置(第k+1个)的数为中位数;如果数据个数为偶数(n=2k),则取最中间两个数据的平均值为中位数即,第k位和第k+1位两个数的平均值为中位数。
输入格式
第 1 行:一个整数 T 为问题数。
对于每一组测试数据按如下格式输入:
第 1 行:1 个正整数,表示商品的个数
第 2 行 ∽n+1 行:商品编号(不超过 9 个字符),销量(非负整数,在 32 位整型表示以内)和价格(非负数,在 32 位浮点型表示以内)。
数据之间用一个空格分隔。
输出格式
对于每个问题,输出一行问题的编号(0 开始编号,格式:case #0: )
然后对应每个问题,按符合条件的商品数目,每行输出一组商品编号,销量和价格,格式与输入时一样。无符合的则显示 no recommendation
分析
- 排序+筛选
- 用结构体存储每个商品的编号、销量、价格
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
// from 0vv
struct goods{ //存储商品的结构体
char num[10];
float sales;
float price;
};
int cmp_price(const void*a,const void*b) //求价格的中位数时,需要先排序
{
goods*p1=(goods*)a;
goods*p2=(goods*)b;
if(p1->price!=p2->price)
return p1->price>p2->price;
return 0;
}
int cmp_sales(const void*a,const void*b) //求销量的中位数时,需要先排序
{
goods*p1=(goods*)a;
goods*p2=(goods*)b;
if(p1->sales!=p2->sales)
return p1->sales>p2->sales;
return 0;
}
int cmp(const void*a,const void*b)
//1.销量从大到小排序 2.价格从低到高排序 3.输入顺序
{
goods*p1=(goods*)a;
goods*p2=(goods*)b;
if(p1->sales!=p2->sales)
return p1->sales<p2->sales;
if(p1->price!=p2->price)
return p1->price>p2->price;
return 0;
}
int main()
{
int t;
cin>>t;
for(int i=0;i<t;i++)
{
int n;
cin>>n;
goods mygoods[n];
float mid_sales; //中位数求平均值时,有可能是浮点数
float mid_price;
for(int j=0;j<n;j++)
{
scanf("%s %f %f",mygoods[j].num,&mygoods[j].sales,&mygoods[j].price);
//printf("%s %lld %f\n",mygoods[j].num,mygoods[j].sales,mygoods[j].price);
}
qsort(mygoods,n,sizeof(mygoods[0]),cmp_sales);
if(n%2)
mid_sales=mygoods[(n-1)/2].sales;
else
mid_sales=(mygoods[(n-2)/2].sales+mygoods[n/2].sales)/2;
qsort(mygoods,n,sizeof(mygoods[0]),cmp_price);
if(n%2)
mid_price=mygoods[(n-1)/2].price;
else
mid_price=(mygoods[(n-2)/2].price+mygoods[n/2].price)/2;
cout<<"case #"<<i<<":"<<endl;
//cout<<mid_price<<" "<<mid_sales<<endl;
qsort(mygoods,n,sizeof(mygoods[0]),cmp);
//排好序后,筛选是否有符合的商品
int sign=0; //记录是否有符合条件的商品
for(int j=0;j<n;j++)
{
if(mygoods[j].sales>mid_sales&&mygoods[j].price<mid_price)
{
sign=1;
cout<<mygoods[j].num<<" "<<mygoods[j].sales<<" "<<mygoods[j].price<<endl;
}
}
if(sign==0)
cout<<"no recommendation"<<endl;
}
return 0;
}