UVa 10295 - Hay Points

题目:有非常多工人。相应一个能力描写叙述表,每种能力有一个权值,求每一个工人的能力值。

分析:字符串。hash表,字典树。利用散列表或者字典树存储相应的单词和权值。查询就可以。

说明:注意初始化,计算完将数据清除。

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>

using namespace std;

//hash_define
typedef struct hnode
{
	char   words[20];
	int    value;
	hnode* next;
}hash;
hash  hash_node[2001];
hash* hash_table[2005];
int   hash_size;

int hash_initial()
{
	hash_size = 0;
	memset(hash_table, 0, sizeof(hash_table));
	memset(hash_node, 0, sizeof(hash_node));
} 

int hash_value(char *str)
{
	int value = 0;
	for (int i = 0 ; str[i] ; ++ i) {
		value = value*26%1000;
		value += str[i];
	}
	return value;
}

int hash_insert(char *str, int val)
{
	int value = hash_value(str);
	hash_node[hash_size].value = val;
	strcpy(hash_node[hash_size].words, str);
	hash_node[hash_size].next = hash_table[value];
	hash_table[value] = &hash_node[hash_size ++];
}

int hash_find(char *str)
{
	int value = hash_value(str);
	for (hash* p = hash_table[value] ; p ; p = p->next)
		if (!strcmp(p->words, str))
			return p->value;
	return 0;
}
//hash_end

int main()
{
	int  m,n,v;
	char buf[2001];
	while (~scanf("%d%d",&m,&n)) {
		hash_initial();
		for (int i = 0 ; i < m ; ++ i) {
			scanf("%s%d",buf,&v);
			hash_insert(buf, v);
		}

		for (int i = 0 ; i < n ; ++ i) {
			int sum = 0;
			while (~scanf("%s",buf)) {
				if (!strcmp(buf, "."))
					break;
				sum += hash_find(buf);
			}
			printf("%d\n",sum);
		}
	}
	return 0;
}
时间: 2024-11-08 14:28:46

UVa 10295 - Hay Points的相关文章

UVA 10869 - Brownie Points II(树状数组)

UVA 10869 - Brownie Points II 题目链接 题意:平面上n个点,两个人,第一个人先选一条经过点的垂直x轴的线,然后另一个人在这条线上穿过的点选一点作垂直该直线的线,然后划分出4个象限,第一个人得到分数为1,3象限,第二个人为二四象限,问第一个个人按最优取法,能得到最小分数的最大值,和这个值下另一个人的得分可能情况 思路:树状数组,可以枚举一点,如果能求出右上和左下点的个数就好办了,其实用一个树状数组,把y坐标离散化掉,然后记录进来,然后把点按x从左往右,每次删掉点后查询

UVA 11355 Cool Points

Cool Points We have a circle of radius R and several line segments situated within the circumference of this circle. Let's define a cool point to be a point on the circumference of this circle so that the line segment that is formed by this point and

UVA 12714 Two Points Revisited(简单数学题)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4452 题意: 给出两个点组成一条直线,要你任意输出两个点,要求这两点组成的直线和给出的直线垂直(注意输出的点不能有负数): 代码如下: #include <cstdio> int main(

UVA 10869 - Brownie Points II(树阵)

UVA 10869 - Brownie Points II 题目链接 题意:平面上n个点,两个人,第一个人先选一条经过点的垂直x轴的线.然后还有一个人在这条线上穿过的点选一点作垂直该直线的线,然后划分出4个象限,第一个人得到分数为1.3象限,第二个人为二四象限.问第一个个人按最优取法,能得到最小分数的最大值,和这个值下还有一个人的得分可能情况 思路:树状数组,能够枚举一点,假设能求出右上和左下点的个数就好办了,其有用一个树状数组,把y坐标离散化掉,然后记录进来,然后把点按x从左往右,每次删掉点后

Problem 1008 Hay Points

Problem Description Each employee of a bureaucracy has a job description - a few paragraphs that describe the responsibilities of the job. The employee's job description, combined with other factors, such as seniority, is used to determine his or her

UVA 11355 Cool Points( 极角计算 )

We have a circle of radius R and several line segments situated within the circumference of this circle. Let’s define a cool point to be a point on the circumference of this circle so that the line segment that is formed by this point and the centre

UVA 10869 - Brownie Points II(树状数组+离散化)

题目链接:点击打开链接 思路:统计区间和, 我们想到了树状数组, 离散化后, 枚举第一个人选取的x坐标, 用两个树状数组,以y坐标为下标建树, 一个表示当前左边的情况, 一个表示右边的情况, 再枚举当前垂直线上的每个点, 可以用树状数组快速统计结果, 该题题意挺难理解的, 要求输出第一个人的最小得分的最大值ans, 还有就是当第一个人取ans时第二个人的可能得分.时间复杂度O(nlogn) 细节参见代码: #include <cstdio> #include <cstring> #

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京

(转载)ACM训练计划,先过一遍基础再按此拼搏吧!!!!

ACM大量习题题库 ACM大量习题题库 现在网上有许多题库,大多是可以在线评测,所以叫做Online Judge.除了USACO是为IOI准备外,其余几乎全部是大学的ACM竞赛题库. USACO http://ace.delos.com/usacogate 美国著名在线题库,专门为信息学竞赛选手准备 TJU http://acm.tongji.edu.cn/ 同济大学在线题库,唯一的中文题库,适合NOIP选手 ZJU http://acm.zju.edu.cn/ 浙江大学在线题库 JLU htt