题解报告:hdu 1263 水果

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1263

Problem Description

夏天来了~~好开心啊,呵呵,好多好多水果~~ Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.现在他想要一份水果销售情况的明细表,这样Joe就可以很容易掌握所有水果的销售情况了.

Input

第一行正整数N(0<N<=10)表示有N组测试数据. 每组测试数据的第一行是一个整数M(0<M<=100),表示工有M次成功的交易.其后有M行数据,每行表示一次交易,由水果名称(小写字母组成,长度不超过80),水果产地(小写字母组成,长度不超过80)和交易的水果数目(正整数,不超过100)组成.

Output

对于每一组测试数据,请你输出一份排版格式正确(请分析样本输出)的水果销售情况明细表.这份明细表包括所有水果的产地,名称和销售数目的信息.水果先按产地分类,产地按字母顺序排列;同一产地的水果按照名称排序,名称按字母顺序排序. 两组测试数据之间有一个空行.最后一组测试数据之后没有空行.

Sample Input

1

5

apple shandong 3

pineapple guangdong 1

sugarcane guangdong 1

pineapple guangdong 3

pineapple guangdong 1

Sample Output

guangdong

  |----pineapple(5)

  |----sugarcane(1)

shandong

 |----apple(3)

解题思路:这道题的要求就是相同产地归为一类,相同水果进行计数,且输出是按字典序输出的。很基础的题目。怎么处理相同产地相同种类的水果数呢?我的做法就是如果当前的记录与下一条记录有相同的产地和相同的某种水果,就将这条记录的num计数存放到下一个记录中,同时将这条记录的num赋值为0,当比较到与下一个不相同的时候就先输出当前的产地,然后从前往当前遍历,如果产地相同,且num不为0,即可输出当前产地某种水果的总数量。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct node
 4 {
 5     char fruit[81];//水果名称
 6     char area[81];//产地名称
 7     int num;//交易次数
 8 }c[101];
 9 bool cmp(node x,node y)//排序规则
10 {
11     if(strcmp(x.area,y.area)<0)return true;//产地先从小到大排序
12     if(strcmp(x.area,y.area)==0 && strcmp(x.fruit,y.fruit)<0)return true;//如果产地相同,则按照字典将水果排序
13     return false;//否则返回假
14 }
15 int main()
16 {
17     int N,M;
18     cin>>N;
19     while(N--){    //测试数据组数
20         cin>>M;
21         getchar();   //吃掉回车符
22         for(int i=0;i<M;i++)//M次交易
23             cin>>c[i].fruit>>c[i].area>>c[i].num;
24         sort(c,c+M,cmp);//按规则排序
25         for(int i=0;i<M;i++){
26             if(strcmp(c[i].area,c[i+1].area)==0){//如果当前产地与下一个产地相同
27                 if(strcmp(c[i].fruit,c[i+1].fruit)==0){//且水果名称相同
28                     c[i+1].num+=c[i].num;//则将水果数目进行相加
29                     c[i].num=0;//将原来的水果数目清空
30                 }
31             }
32             else{//如果不同
33                 cout<<c[i].area<<endl;//不同就先输出产地
34                 for(int j=0;j<M;j++){//依次再进行比较
35                     if(strcmp(c[i].area,c[j].area)==0 && c[j].num)//找到一个num是不为0的,即该产地某种水果的总数
36                         cout<<"   |----"<<c[j].fruit<<‘(‘<<c[j].num<<‘)‘<<endl;//输出最后的水果数
37                 }
38             }
39         }
40         if(N!=0)cout<<endl;//案例之间输出空行
41     }
42     return 0;
43 }

下面是string版本:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct node
 4 {
 5     string fruit;//水果名称
 6     string area;//产地名称
 7     int num;//交易次数
 8 }c[101];
 9 bool cmp(node x,node y)//排序规则
10 {
11     if(x.area!=y.area)return x.area<y.area;//产地先从小到大排序
12     return x.fruit<y.fruit;//如果产地相同,水果按字典排序
13 }
14 int main()
15 {
16     int N,M;
17     cin>>N;
18     while(N--){    //测试数据组数
19         cin>>M;
20         getchar();   //吃掉回车符
21         for(int i=0;i<M;i++)//M次交易
22             cin>>c[i].fruit>>c[i].area>>c[i].num;
23         sort(c,c+M,cmp);//按规则排序
24         for(int i=0;i<M;i++){
25             if(c[i].area==c[i+1].area){//如果当前产地与下一个产地相同
26                 if(c[i].fruit==c[i+1].fruit){//且水果名称相同
27                     c[i+1].num+=c[i].num;//则将水果数目进行相加
28                     c[i].num=0;//将原来相同水果的数目清空
29                 }
30             }
31             else{//如果不同
32                 cout<<c[i].area<<endl;//不同就先输出产地
33                 for(int j=0;j<M;j++){//依次再进行比较
34                     if((c[i].area==c[j].area) && c[j].num)//找到此时水果的最后一个计数num是不为0的,即为该产地某种水果的总数
35                         cout<<"   |----"<<c[j].fruit<<‘(‘<<c[j].num<<‘)‘<<endl;//输出最后的水果数
36                 }
37             }
38         }
39         if(N!=0)cout<<endl;//案例之间输出空行
40     }
41     return 0;
42 }

原文地址:https://www.cnblogs.com/acgoto/p/8686241.html

时间: 2024-10-01 00:37:22

题解报告:hdu 1263 水果的相关文章

hdu 1263 水果(map)

水果 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3831    Accepted Submission(s): 1433 Problem Description 夏天来了~~好开心啊,呵呵,好多好多水果~~ Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.现在他想要一份水果销售情况的明细表,这样Joe就可以

Hdu 1263 水果

水果 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6986    Accepted Submission(s): 2748 Problem Description 夏天来了~~好开心啊,呵呵,好多好多水果~~Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.现在他想要一份水果销售情况的明细表,这样Joe就可以很容

hdu 1263 水果 sort对结构体中字符串二级排序

#include <stdio.h> #include <string.h> #include <algorithm> using namespace std; struct node { char name[90],place[90]; int num; }c[105]; bool cmp(node x,node y) { if(strcmp(x.place,y.place)<0) return true; if(strcmp(x.place,y.place)=

题解报告:hdu 1162 Eddy&#39;s picture

Problem Description Eddy begins to like painting pictures recently ,he is sure of himself to become a painter.Every day Eddy draws pictures in his small room, and he usually puts out his newest pictures to let his friends appreciate. but the result i

线段树&#183;题解报告

线段树·题解报告 参考资料 ·课件 线段树 --刘汝佳 统计的力量,线段树全接触 --张昆玮 ·Blog [完全版]线段树 从普通线段树到zkw线段树 [总结][数据结构]ZKW线段树详解 选题目录 · Hdu1166 敌兵布阵(单点更新,区间求和) · Hdu1754 I Hate It(单点更新,RMQ) · Hdu3308 LCIS(单点更新,区间并) · Poj3468 A Simple Problem with Integers(区间加减,区间求和) · Poj2777 Count C

题解报告(CDUT暑期集训——第三场)

题解报告(CDUT暑期集训--第三场) A - Problem A. Ascending Rating HDU - 6319 思路:单调队列板子题?(但是弱的一批的我还是不会用(有空补上 用的滑动窗口算法 按着题解的从后往前做(ps:菜是原罪 AC代码 #include<stdio.h> #include<iostream> #include<math.h> #include<algorithm> #include<string.h> #incl

cojs 强连通图计数1-2 题解报告

OwO 题目含义都是一样的,只是数据范围扩大了 对于n<=7的问题,我们直接暴力搜索就可以了 对于n<=1000的问题,我们不难联想到<主旋律>这一道题 没错,只需要把方程改一改就可以了 首先我们考虑不合法的方案强连通分量缩点后一定是DAG 考虑子问题:DAG计数 做法可以参考<cojs DAG计数1-4 题解报告> 这里给出转移方程 f(n)=sigma((-1)^(k-1)*C(n,k)*2^(k*(n-k))*f(n-k)) 如果考虑上强连通分量缩点的情况呢? 我

HDU 1263

第一次写map的嵌套 和less<>的排序 #include <map> #include <cstdio> #include <iostream> #include <string.h> #include <cstring> #include <string> using namespace std; map<string,map<string,int>,less<string> >

2016 年宁波工程学院第七届ACM校赛题解报告

2016 年宁波工程学院第七届ACM校赛题解报告 本题解代码直接为比赛代码,仅供参考. A,B,C,D,G,H,J,K,L,M 来自 Ticsmtc 同学. F 来自 Gealo 同学. E,I 来自Alex 学长. Promblem A :    Two Sum 时间限制: 1 Sec  内存限制: 64 MB 题目描述: 给出n个数,另外给出?个整数S,判断是否可以从中取出2个数,使得这两个数的和是S. 输入: 第?行有个整数T(1 <= T <= 10),代表数据组数. 对于每组数据,第