BestCoder Round #92 1001 Skip the Class —— 字典树 or map容器
题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=748&pid=1001
题解:
1.trie树
关键是如何将科目与分数进行对应,即如果将字符串与数字对应。由于之前解除了字典树,所以就想到用字典树存储单词,并为每种编上编号,之后就用这个编号与分数对应。
就个人观点而言,a[][]数组应该不用清零,因为下个case会将之前的case覆盖掉,但是错了,也找不出原因。所以以后为了安全起见,不管是否会被覆盖,都清零吧,这样保险一点。
代码如下:
#include<bits/stdc++.h>//字典树 using namespace std; int a[][],deg[], b[],vis[],sum;
//a[][]记录单词的值,从1开始记录。deg[]记录单词有多少个值。sum为单词的种数。 typedef struct node//字典树的结点
{
struct node *next[];
int pos;
}Trie, *PT; int init(PT &p)//初始化结点
{
p = (PT)malloc(sizeof(Trie));
p->pos = ;
for(int i = ; i<; i++)
p->next[i] = NULL;
} //访问字典树,若果单词已存在,则返回这个单词的编号,如果不存在,则编号加1,并返回。
int trie(char *s, int k, PT &p)
{
if(!s[k])
{
if(p->pos) return p->pos;
p->pos = ++sum;
return p->pos;
} else
{
if(!p->next[s[k]-'a'])
init(p->next[s[k]-'a']);
return trie(s,k+,p->next[s[k]-'a']);
}
} int cmp(int a,int b)
{
return a > b;
} int main()
{
int T,n,val,ans;
char s[];
PT p;
scanf("%d",&T);
while(T--)
{
init(p);
scanf("%d",&n);
ans = ; sum = ;
memset(deg,,sizeof(deg));
memset(vis,,sizeof(vis));
memset(a,,sizeof(a));//为什么少了这步会出错,这步好像不是必要的吧?
for(int i = ; i<n; i++)
{
scanf("%s%d",s,&val);
b[i] = trie(s,,p);//获取单词的编号,并将其储存到b[]中,
a[b[i]][deg[b[i]]++] = val;//更新a数组和deg数组
} for(int i = ; i<n; i++)
{
if(!vis[b[i]])//如果没有访问编号为b[i]的单词,则访问。
{ //对这个单词的值进行排序,选其前二,并标为已访问。
sort(a[b[i]],a[b[i]]+deg[b[i]],cmp);
vis[b[i]] = ;
ans += a[b[i]][] + a[b[i]][];
}
}
printf("%d\n",ans);
}
return ;
}
2.map容器
其实做题时想到用c++的map会很方便,只可惜没有学map的操作。也好,现在补回来了。
对于map的认识:
1.map一个key只能对应一个val,而multimap一个key能对应多个val。所以如果对map的key进行多次复制,其旧val会被新val覆盖。而multimap则插入新的val。
2.由于map一对一,所以可以直接用map[key] = val,以数组的形式直接赋值,而multimap则只能用map.insert(pair<string,int>("ss",11))进行插入赋值。
3.要访问元素要使用迭代器map<string,int>::iterator it,last; 4
4.两种map都自动根据key值进行递增排序。
代码如下:
#include<bits/stdc++.h>
#define MAX(a,b) (a>b?a:b) using namespace std; int main()
{
int n,val,T;
char s[];
map<string,int> m1,m2;
map<string,int>::iterator it,last;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
m1.clear(); m2.clear();//清空map
for(int i = ; i<n; i++)
{
scanf("%s%d",s,&val);
//更新第一二大值
m2[s] = MAX(m2[s],val);
if(m1[s]<m2[s]) swap(m1[s],m2[s]);
} int ans = ;
for(it = m1.begin(),last = m1.end(); it!=last; it++)
ans += it->second;
for(it = m2.begin(),last = m2.end(); it!=last; it++)
ans += it->second;
printf("%d\n",ans);
}
return ;
}
BestCoder Round #92 1001 Skip the Class —— 字典树 or map容器的更多相关文章
- 贪心 BestCoder Round #39 1001 Delete
题目传送门 /* 贪心水题:找出出现次数>1的次数和res,如果要减去的比res小,那么总的不同的数字tot不会少: 否则再在tot里减去多余的即为答案 用set容器也可以做,思路一样 */ # ...
- 暴力 BestCoder Round #41 1001 ZCC loves straight flush
题目传送门 /* m数组记录出现的花色和数值,按照数值每5个搜索,看看有几个已满足,剩下 5 - cnt需要替换 ╰· */ #include <cstdio> #include < ...
- 暴力 BestCoder Round #46 1001 YJC tricks time
题目传送门 /* 暴力:模拟枚举每一个时间的度数 详细解释:http://blog.csdn.net/enjoying_science/article/details/46759085 期末考结束第一 ...
- 字符串处理 BestCoder Round #43 1001 pog loves szh I
题目传送门 /* 字符串处理:是一道水题,但是WA了3次,要注意是没有加'\0'的字符串不要用%s输出,否则在多组测试时输出多余的字符 */ #include <cstdio> #incl ...
- BestCoder Round #75 1001 - King's Cake
Problem Description It is the king's birthday before the military parade . The ministers prepared a ...
- 山东第一届省赛1001 Phone Number(字典树)
Phone Number Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 We know that if a phone numb ...
- hdu 5195 DZY Loves Topological Sorting BestCoder Round #35 1002 [ 拓扑排序 + 优先队列 || 线段树 ]
传送门 DZY Loves Topological Sorting Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131 ...
- hdu1251 字典树or map
一道字典树的题,不过看起来用map更为简单 传送门 题意: 给出一堆字符串构成一个字典,求字典里以某字符串为前缀的字符串有几个 思路: 输入字符串时把字符串的前缀全部存进map并标记次数 查询时直接输 ...
- TOJ3097: 单词后缀 (字典树 or map瞎搞)
传送门 (<---可以点击的~) 时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte 描述 有些英语单词后缀都是一样的,现在我们需要从给定的一堆单词里 ...
随机推荐
- GitHub 上受欢迎的 Android UI Library 整理二
通知 https://github.com/Tapadoo/Alerter ★2528 - 克服Toast和Snackbar的限制https://github.com/wenmingvs/Notify ...
- va_list 简介
原文:http://blog.sina.com.cn/s/blog_590be5290100qhxr.html va_list是一个宏,由va_start和va_end界定. typedef char ...
- Wdatepick控件只能选当前时间以前的时间
WdatePicker限制只能选当天,只能选以前的时间 (1)WdatePicker限制只能选以前的时间(不能选当天): onfocus="WdatePicker({startDate:'% ...
- vcl.Forms等与VCL界面有关的单元不支持跨平台
vcl.Forms等与VCL界面有关的单元不支持跨平台 midaslib也不支持
- 邁向IT專家成功之路的三十則鐵律 鐵律二十九 IT人富足之道-信仰
天地自然的循環法則,讓每一個人都必須經歷生.老.病.死.喜.怒.哀.樂,然而至始至終無盡的煩惱總是遠多於快樂,因此筆者深信每一個人在一生當中,都必須要有適合自己的正確信仰,他可以在你無法以物質力量來解 ...
- react/redux组件库、模板、学习教程
开源的有蚂蚁金服的: 1.https://pro.ant.design/index-cn 2.https://pro.ant.design/docs/getting-started-cn 3.http ...
- 自定义PropertyGrid控件【转】
自定义PropertyGrid控件 这篇随笔其实是从别人博客上载录的.感觉很有价值,整理了一下放在了我自己的博客上,希望原作者不要介意. 可自定义PropertyGrid控件的属性.也可将属性名称显示 ...
- C#网络编程系列文章(一)之Socket实现异步TCPserver
原创性声明 本文作者:小竹zz 本文地址http://blog.csdn.net/zhujunxxxxx/article/details/44258719 转载请注明出处 文章系列文件夹 C#网络编程 ...
- TCP三次握手与DDOS攻击原理
TCP三次握手与DDOS攻击原理 作者:冰盾防火墙 网站:www.bingdun.com 日期:2014-12-09 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. ...
- 从TCP协议的原理来谈谈rst复位攻击
在谈RST攻击前,必须先了解TCP:如何通过三次握手建立TCP连接.四次握手如何把全双工的连接关闭掉.滑动窗体是怎么数据传输的.TCP的flag标志位里RST在哪些情况下出现.以下我会画一些尽量简化的 ...