2019年3月9日训练日记

本文介绍了如何利用C++中Map的嵌套特性解决水果销售明细的问题,通过实例代码详细展示了数据结构的设计与实现过程。此外,还探讨了贪心算法的基本思想及其在装箱问题中的应用,提供了完整的AC代码。

今天实在周六,早上七点起床,洗漱,然后把被子晒好就去阅览室待了一天,先看了一下stl一些不理解的例题,然后预习了一下贪心算法,01背包问题。

夏天来了~~好开心啊,呵呵,好多好多水果~~
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)

可以使用map嵌套map来实现
#include <cstdio>
#include <iostream>
#include <string>
#include <map>
using namespace std;
struct place
{
	map<string,int> fruit;
}; 
 
int main()
{
	map<string,place> f;
	//在map中套用map 
	map<string,place>::iterator it; 
	map<string,int>::iterator it1;
	//创建两个迭代器 
	string fr,pl;
	int n,num,m; cin >> n;
	while (n--)
	{
		f.clear();
		cin >> m;
		while (m--)
		{
			cin >> fr >> pl >> num;
			f[pl].fruit[fr]+=num;
		}
		for (it=f.begin();it!=f.end();it++)
		{
			cout << it->first << endl;
			//it->first表示[]中的元素值,同理second表示对应的元素值 
			for (it1=it->second.fruit.begin();it1!=it->second.fruit.end();it1++)
				cout<<"   |----"<<it1->first<<"("<<it1->second<<")"<<endl;  
		}
		if(n) cout << endl;
	}
	return 0;
}

这道题的思路就是使用map的嵌套,关于这一点我之前没有接触过,也没有考虑过,对于这种多个元素绑定使用map的嵌套还是比较方便的,第一个是把水果和售出数量进行绑定,然后再和产地绑定。
这里有几个知识点需要注意一下,->是成员指针访问运算符,就是指向一个位置。
还有就是迭代器
迭代器类似于指针类型,它也提供了对对象的间接访问。
指针是c语言中就有的东西,迭代器是c++中才有的,指针用起来灵活高效,迭代器功能更丰富些。
迭代器提供一个对容器对象或者string对象的访问的方法,并且定义了容器范围。
::是界定符,意思是后面属于前面。

然后就是贪心算法了
贪心算法就是来寻找最优解的一种方法,贪心算法是一种比较简便的方法,通过简单的贪心规则,只考虑局部的状况,不考虑局部解对于整体最优解未来的影响。
基本思想
贪婪法求解步骤。
(1)建立对问题精确描述的数学模型,包括定义最优解的模型;
(2)将问题分解为一系列子问题,同时定义子问题的最优解结构;
(3)应用贪心原则确定每个子问题的局部最优解,并根据最优解的模型,用子问题的局部最优解堆叠出全局最优解。
最优解的模型一般都体现了最优解子问题的分解结构和堆叠方式。
之前51nod上有个装箱问题就是最为典型的贪心算法
装箱问题:
有若干个体积为V的箱子;
有N个物品体积为:v0,v1,v2,v3…
要求:
将所有的物品装入箱子中,使得打开的箱子最少;

贪婪准则:
1.将所有物品按照体积降序排列;
2.每次取出一个物品(当前没有装入箱子的体积最大的);
3.遍历所有已打开的箱子,放入一个较早打开的箱子,如果放不下便开一个新箱子;

输入:一个整数v,表示箱子容量
一个整数n,表示有n个物品
接下来 n 个整数,分别表示这 n 个物品的各自体积
输出
输出:一个整数,表示箱子最小的剩余空间
输入样例
24
6
8
3
12
7
9
7
输出样例
0
ac代码如下
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include<iomanip>
#include<string>
using namespace std;
int V,N,v[35],f[20005];
int main()
{
    scanf("%d%d",&V,&N);
    for(int i=1;i<=N;i++)
        scanf("%d",&v[i]);
    for(int i=1;i<=N;i++)
        for(int j=V;j>=v[i];j--)
        {
            f[j]=max(f[j],f[j-v[i]]+v[i]);
        }
    cout<<V-f[V]<<endl;
}
其实这个我用的是01背包,
贪心和动态规划还是有很大的区别呢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值