3126. 商品推薦

單點時限: 2.0 sec

內存限制: 256 MB

一個電子商務網站要向顧客推薦商品,可以讓顧客指定規則。

現在某類顧客指定的規則是:對於同一類商品,如果一個商品的銷量高於所有該類商品銷量的中位數,並且價格低於所有該類商品價格的中位數 *,則向他推薦,顯示商品編號,銷量和價格。

如果有多個商品符合要求,推薦的順序是按銷量從大到小排序,銷量一樣則按價格從低到高排序。如果銷量價格都一樣,按輸入順序排序。如果沒有符合要求的商品,則提示不推薦,顯示 no recommendation。

中位數定義:
一組數據 (a1,a2,a3,…,an) 按從小到大(或從大到小)的順序排列,如果數據個數 n 爲奇數(即,n=2∗k+1),則排在中間位置(第 k+1 個)的數 ak+1 爲中位數;如果數據個數爲偶數(n=2∗k),則取最中間兩個數據的平均值爲中位數 (即,第 k 位和第 k+1 位兩個數的平均值爲中位數,(ak+ak+1)/2。

輸入格式
第 1 行:一個整數 T (1⩽T⩽10) 爲問題數。

對於每一組測試數據按如下格式輸入:

第 1 行:1 個正整數 n(1⩽n⩽100),表示商品的個數

第 2 行 ∽n+1 行:商品編號(不超過 9 個字符),銷量(非負整數,在 32 位整型表示以內)和價格(非負數,在 32 位浮點型表示以內)。

數據之間用一個空格分隔。

輸出格式
對於每個問題,輸出一行問題的編號(0 開始編號,格式:case #0: 等)。

然後對應每個問題,按符合條件的商品數目,每行輸出一組商品編號,銷量和價格,格式與輸入時一樣。無符合的則顯示 no recommendation。

樣例
input
3
2
11 2 7
12 1 6
5
e01 0 7
e02 87 5.5
e03 8 10
e04 97 6
e05 55 8
8
a100 201 23.0
a101 518 19.7
a102 289 36.7
a103 218 22.9
a104 37 1.2
a105 515 42.0
a106 577 25.6
a107 136 44.5
output
case #0:
no recommendation
case #1:
e04 97 6
e02 87 5.5
case #2:
a101 518 19.7

/*
思路:兩次排序。比較中位數時需要注意,因爲排序後是數有可能中位數前面的一些數和中位數相同。
*/
#include<iostream>
#include<algorithm>
using namespace std;
struct g {
	string name;
	double sum;
	double price;
	int index;
	int flag1=0;
	int flag2=0;
};
bool cmp1(g a,g b) {
	return a.price<b.price;
}
bool cmp2(g a,g b) {
	if(a.sum!=b.sum)
		return a.sum>b.sum;
	else {
		if(a.price!=b.price)
			return a.price<b.price;
		return a.index<b.index;
	}
}
int main() {
	int t;
	cin>>t;
	for(int i = 0; i < t; i++) {
		int n;
		cin>>n;
		g G[n];
		for(int i = 0; i < n; i++) {
			cin>>G[i].name>>G[i].sum>>G[i].price;
			G[i].index=i;
		}
		sort(G,G+n,cmp1);
		for(int i = 0; i < (n+1)/2; i++) {
			if(n%2==0&&2*G[i].price<G[n/2-1].price+G[n/2].price) {
				G[i].flag1=1;
			}
			if(n%2==1&&G[i].price<G[n/2].price) {
				G[i].flag1=1;
			}
		}
		sort(G,G+n,cmp2);
		for(int i =0 ; i < (n+1)/2; i++) {
			if(n%2==1&&G[i].sum>G[n/2].sum) {
				G[i].flag2=1;
			}
			if(n%2==0&&G[i].sum*2>G[n/2-1].sum+G[n/2].sum) {
				G[i].flag2=1;
			}
		}
		int flag=0;
		printf("case #%d:\n",i);
		for(int i = 0; i < (n+1)/2; i++) {
			if(G[i].flag1&&G[i].flag2) {
				flag=1;
				cout<<G[i].name<<" "<<G[i].sum<<" "<<G[i].price<<endl;
				
			}
		}
		if(flag==0)
			cout<<"no recommendation"<<endl;
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章