`
249326109
  • 浏览: 56278 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

uva 133 - The Dole Queue

    博客分类:
  • acm
 
阅读更多

题目不难,属于模拟类型的题目,需要比较仔细地处理各种边界情况。估计题目的本意是想让我们实现一个双向循环链表,我看了下N的值最大20,所以想先用数组实现试试,基本思路也是在数组里双向循环,删除的元素标记下;双向循环链表实现就比较好理解了,但是实现起来有些麻烦,指针神马的很容易搞错,需要非常仔细。

开始提交超时了,原因分析了下是因为:虽然N的值不大,但是k和m可以很大,所以找下k/m个的时候需要mod一下当前queue的size。

 

数组实现:

#include<stdio.h>

#define MAX 30
/*
 * status 0 means normal, status 1 means deleted
 * */
typedef struct Node {
	int num;
	int status;
} Node;


/*
 * startIdx1,startIdx2 mark the starting point of each round of picking.
 * */
typedef struct Queue {
	Node elements[MAX];
	int size;
	int startIdx1;
	int startIdx2;
} Queue;

int n, k, m;
Queue queue;

void printQue() {
	int i;
	for (i = 0; i < n; i++) {
		printf("%d:[%d,%d] ", i, queue.elements[i].num,
				queue.elements[i].status);
	}
	printf("size:%d\n", queue.size);

}

int getNextIdx(int current) {
	int result = current + 1;
	if (result == n)
		result = 0;
	return result;
}

int getPreIdx(int current) {
	int result = current - 1;
	if (result < 0)
		result = n - 1;
	return result;
}

int pickFirst(int idx) {
	int currentIdx = idx;
	int count = 1;
	int num = k % queue.size;
	if (num == 1 || (queue.size == 1))
		return currentIdx;
	if (num == 0)
		num = queue.size;
	while (1) {
		currentIdx = getNextIdx(currentIdx);
		if (queue.elements[currentIdx].status != 1)
			count++;
		if (count == num) {
			return currentIdx;
		}
	}

}

int pickSecond(int idx) {
	int currentIdx = idx;
	int count = 1;
	int num = m % queue.size;
	if (num == 1 || (queue.size == 1))
		return currentIdx;
	if (num == 0)
		num = queue.size;
	while (1) {
		currentIdx = getPreIdx(currentIdx);
		if (queue.elements[currentIdx].status != 1)
			count++;
		if (count == num) {
			return currentIdx;
		}

	}

	return 0;
}

void pick() {
	int firstPick = pickFirst(queue.startIdx1);
	int secondPick = pickSecond(queue.startIdx2);
	queue.elements[firstPick].status = 1;
	queue.elements[secondPick].status = 1;
	if (firstPick == secondPick)
		queue.size -= 1;
	else
		queue.size -= 2;

	if (firstPick != secondPick)
		printf("%3d%3d", queue.elements[firstPick].num,
				queue.elements[secondPick].num);

	else
		printf("%3d", queue.elements[firstPick].num);

	if (queue.size > 0)
		printf(",");
	else
		printf("\n");

	if (queue.size <= 0)
		return;

	int nextStartIdx1 = getNextIdx(firstPick);
	while (queue.elements[nextStartIdx1].status == 1)
		nextStartIdx1 = getNextIdx(nextStartIdx1);

	int nextStartIdx2 = getPreIdx(secondPick);
	while (queue.elements[nextStartIdx2].status == 1)
		nextStartIdx2 = getPreIdx(nextStartIdx2);

	queue.startIdx1 = nextStartIdx1;
	queue.startIdx2 = nextStartIdx2;
}

int main() {
/*	setbuf(stdout,NULL);*/
	while (scanf("%d%d%d", &n, &k, &m) != EOF) {
		if (n == 0)
		break;

		queue.size = n;
		queue.startIdx1 = 0;
		queue.startIdx2 = n - 1;
		int i;
		for (i = 0; i < n; i++) {
			queue.elements[i].num = i + 1;
			queue.elements[i].status = 0;
		}
		while (queue.size > 0) {
			pick();
		}

	}

	return 0;
}

 

 

链表实现:

#include<stdio.h>
#include<stdlib.h>

#define MAX 30

struct Node;
typedef struct Node* PtrToNode;

typedef struct Node {
	int num;
	PtrToNode next;
	PtrToNode pre;
} Node;

typedef struct Queue {
	PtrToNode head;
	int size;
	PtrToNode startIdx1;
	PtrToNode startIdx2;
} Queue;

int n, k, m;
Queue queue;
Queue *que = &queue;

void printQueue() {
	int i;
	PtrToNode cur = que->head;
	for (i = 0; i < que->size; i++) {
		printf("%d ", cur->num);
		cur = cur->next;
	}
	printf("size:%d,idx1:%d,idx2:%d", que->size, que->startIdx1->num,
			que->startIdx2->num);

	printf("\n");

}

void makeQueue() {
	PtrToNode head = (PtrToNode) malloc(sizeof(Node));
	head->num = 1;
	head->next = head;
	head->pre = head;
	que->head = head;
	que->size = n;
	que->startIdx1 = head;
	que->startIdx2 = head;
	if (n == 1)
		return;

	PtrToNode pre = head;
	int i;
	for (i = 1; i < n; i++) {
		PtrToNode current = (PtrToNode) malloc(sizeof(Node));
		current->num = i + 1;
		current->pre = pre;
		pre->next = current;
		if (i == n - 1) {
			current->next = head;
			head->pre = current;
		}
		pre = current;
	}
	que->startIdx1 = head;
	que->startIdx2 = head->pre;

}

PtrToNode getNextNNode(PtrToNode p, int n) {
	int i;
	int size = n % que->size;
	PtrToNode result = p;
	for (i = 0; i < size; i++) {
		result = result->next;
	}
	return result;
}

PtrToNode getPreNNode(PtrToNode p, int n) {
	int i;
	int size = n % que->size;
	PtrToNode result = p;
	for (i = 0; i < size; i++) {
		result = result->pre;
	}
	return result;

}
/*
 * type 0 means removing the first pick.
 * type 1 means removing the second pick.
 * type 2 means removing the same item when first pick equals second pick.
 *
 * */
int removeNode(PtrToNode p, int type) {
	if (p == NULL )
		return -1;
	int num = p->num;
	if (p == que->head)
		que->head = p->next;
	if (p == que->startIdx1)
		que->startIdx1 = p->next;
	if (p == que->startIdx2)
		que->startIdx2 = p->pre;

	if (type == 2) {
		que->startIdx1 = p->next;
		que->startIdx2 = p->pre;
	} else if (type == 0) {
		que->startIdx1 = p->next;
	} else {
		que->startIdx2 = p->pre;
	}

	p->pre->next = p->next;
	p->next->pre = p->pre;

	free(p);
	que->size--;
	return num;
}

void pick() {
	PtrToNode first = getNextNNode(que->startIdx1, k - 1);
	PtrToNode second = getPreNNode(que->startIdx2, m - 1);
	int one, two;
	if (first == second) {
		one = two = removeNode(first, 2);
	} else {
		one = removeNode(first, 0);
		two = removeNode(second, 1);
	}

	if (one != two)
		printf("%3d%3d", one, two);
	else
		printf("%3d", one);

	if (que->size > 0)
		printf(",");
	else
		printf("\n");
}

int main() {
/*	setbuf(stdout,NULL);*/
	while(scanf("%d%d%d",&n,&k,&m)!=EOF) {
		if(n==0)
		break;
		makeQueue();

		while(que->size>0) {
			pick();
		}

	}

	return 0;
}

 

 

 

分享到:
评论

相关推荐

    UVA133-TheDoleQueue.zip_site:www.pudn.com_uva133

    《UVA133 - 救济金发放问题:The Dole Queue》 在计算机科学领域,算法是解决问题的关键工具,特别是在处理复杂数据结构和优化问题时。UVA(University of Virginia)在线判题系统提供了丰富的算法题目供程序员挑战...

    当代研究生英语读写教程--下U7_Text A课件

    Text A 部分详细分析了“知识产权在美国的重要性如何反映研究型大学与社会之间关系的变化”,以及《拜杜法案》(Bayh-Dole Act)对此产生的影响。阅读理解部分(Reading—Text A)包括文本研究、主旨及结构解析。...

    大学知识产权所有权归属模式演进及其对技术转移的影响

    自20世纪80年代美国实施“Bayh-Dole”法案以来,这一议题成为了全球科技政策关注的核心。该法案旨在调整大学科研成果的知识产权归属,以促进技术转移和商业化。在中国,由于长期受到计划经济体制的影响,大学科研...

    专利制度基本原理1.ppt

    - 技术转移:1980年的拜杜法案(Bayh-Dole Act)允许大学拥有并管理政府资助研究产生的知识产权,推动了大学与产业界的合作,加强了技术转移。 - 案件背景:Madey教授在杜克大学使用其专利设备进行研究,但在与大学...

    大学专利和许可活动:文献回顾-研究论文

    这篇关于大学专利和许可活动的文献综述基于 1980 年至 2004 年间发表的 125 篇论文,这些论文是通过查询 ABI/INFORM 和 EconLit 获得的,使用关键词“大学”、“专利”、“许可”、“ Bayh-Dole”、“triple helix...

    与大学专利相关的实证分析-研究论文

    在过去的二十年中,... 然后讨论了 Bayh-Dole 法案,该法案促进了联邦资助的大学发明的专利和许可。 本章最后描述了过去 20 年中大学专利申请的实证研究,强调了该文献中的一些未解决的问题,并提出了新的研究途径。

    accrete-rb:星型发电机

    请参阅以获取Stephen H.Dole的原始论文 本地开发设置 先决条件 Ruby 通过\curl -L https://get.rvm.io | bash安装rvm \curl -L https://get.rvm.io | bash \curl -L https://get.rvm.io | bash 通过rvm install _...

    【北师大版】(安徽专用)2012届高三英语一轮复习精品学案:M7 Unit 19 Language.doc

    如"Dole always likes to surround himself with young people." 这表示多尔喜欢和年轻人在一起。"surrounding"形容词常用来描述周围的环境,而"surroundings"名词形式则特指周围环境或事物。 4. "adequate"形容词...

    专利制度基本原理概述.pptx

    1980年的拜杜法案(Bayh-Dole Act)是美国大学技术转移的一个转折点,它允许大学拥有并商业化由政府资助研究产生的知识产权。这一变革促使大学不仅局限于教学和科研,还积极参与社会经济发展,成为技术转移的重要...

    08年上半年程序员题目下午卷子

    第三个题目聚焦于使用Dole Rob算法生成N阶魔方阵(N为奇数)。魔方阵是一种特殊的矩阵,其中每一行、每一列以及两条对角线上的数字总和相等。Dole Rob算法提供了一种生成此类魔方阵的方法。 **算法步骤解析**: 1....

    程序员2008年5月考试的重难点

    3. 程序设计语言和算法:C语言是其中的重点,考察了数组、指针、循环等基础语法和概念,同时也测试了考生对算法的理解和应用能力,如Dole Rob算法用于生成魔方阵。 4. 软件工程:软件开发过程、需求分析、设计、...

    2008年上半年程序员考试下午试题及答案下载

    7. **算法实现** - 试题三描述的是Dole Rob算法,这是一种构造特定魔方阵的方法。算法的关键在于找到合适的插入位置,遵循特定的规则。此算法涉及递归思想,因为每次插入新值后,需要根据当前位置更新下一次插入的...

    leetcode伪代码-Aps:应用程序

    dole na tastaturata) -&gt; sluzi za generate code, konstruktor, getters setters... 查找班级 – Ctrl + N -&gt; 要查找您要查找的班级,只需按 Ctrl + N 并输入名称即可。 智能代码完成 –&gt; Ctrl + Shift + Space - ...

    美国知名科研机构技术转移报告.rar

    3. 法律政策框架:美国有一套完善的技术转移法律体系,包括《拜杜法案》(Bayh-Dole Act)等,鼓励科研机构持有和管理其研究成果的知识产权,促进了技术转移活动的活跃。 4. 技术评估与商业化路径:报告会详细介绍...

    IP需要IP吗? 适应知识产权范式之外的知识生产-研究论文

    学术研究长期以来一直在共享制度下进行,即使在 Bayh-Dole 法案允许大学对教师发明申请专利权之后,默顿主义的共产主义规范继续对学术实践产生强大的影响。 正如埃里克·冯·希Perl (Eric von Hippel) 充分证明的...

    Excel.ToDOLE病毒的专杀Delphi源码

    Excel.ToDOLE病毒是一种针对Microsoft Excel的恶意软件,它利用了DOLE对象库中的漏洞进行传播和感染。这种病毒通常会伪装成正常的Excel文件,当用户打开受感染的文件时,病毒会自动执行并可能对用户的系统造成破坏。...

    VMworld 2009 - VMware COO主题演讲

    VMware作为一家领先的企业级虚拟化解决方案提供商,其COO的演讲对 Fortune 1000强企业(如Allied Waste Industries、Amerco、Dole Food等)的IT决策者们具有重大意义,这些企业尚未采用VMware的技术,暗示了市场中仍...

    [7]Basic training (no endnote ref).pdf

    8. **数据兼容性**:支持与SCADA/GIS的数据交换,提供DOLE语言;可通过Excel输入输出数据;并能与PSSE/E、PSS/U等其他电力系统仿真软件进行数据转换。 【PowerFactory软件的主要功能】 PowerFactory的主要功能包括...

    第二讲专利制度基本原理1.pptx

    1980年的拜杜(Bayh-Dole)法案在美国知识产权法中占有重要地位,它允许大学拥有并管理由政府资助研究产生的知识产权。这一法案极大地推动了大学技术转移的进程,使大学成为科技创新和经济发展的驱动力。然而,Madey...

Global site tag (gtag.js) - Google Analytics