EOJ 3126.商品推荐 (结构体 排序)

题目:

一个电子商务网站要向顾客推荐商品,可以让顾客指定规则。

现在某类顾客指定的规则是:
对于同一类商品,如果一个商品的销量高于所有该类商品销量的中位数,并且价格低于所有该类商品价格的中位数 ,
则向他推荐,显示商品编号,销量和价格。

如果有多个商品符合要求,推荐的顺序是
按销量从大到小排序,销量一样则按价格从低到高排序;
如果销量价格都一样,按输入顺序排序;
如果没有符合要求的商品,则提示不推荐,显示 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

分析

  1. 排序+筛选
  2. 用结构体存储每个商品的编号、销量、价格

代码

#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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值