现在的位置: 首页 > 综合 > 正文

1896 展厅

2012年05月13日 ⁄ 综合 ⁄ 共 1226字 ⁄ 字号 评论关闭

描述

世博会正在如火如荼的举行中,dandelion和她的朋友也打算好好游览一番,不过由于经费有限,她们只能去园区游览一天。经过全方位调研,她们得到了园区的展厅分布图。

园区是一个圆形,共有n个展厅,每个展厅都有不同的主题(一共有m种主题),有舞蹈表演的,有传统工艺展示的,有高新科技展示的等等,现在dandelion和她的朋友想知道,假设她们可以随机选取一个展厅为起点,她们至少要经过多少距离才能参观完所有主题。

输入

第一行是case数T(1<=T<=50),接下来有T组数据。

对于每组数据,第一行有3个整数n, m, t(2 <= n <= 1000000, 1 <= m <= 100, 0 < t < 231) t 表示圆区的周长。

接下去m行,每行以一个整数k开始,(1 <= k <= n)表示该种主题的展厅有k个,接下去有k个递增整数Li (0 <= Li < t),表示该展厅距离1号展厅的顺时针距离。

输出

输出dandelion要参观所有主题的场馆要走的最短距离。

样例输入
1
3 2 80133375
2 0 24951291
1 49140546
样例输出
24189255

模拟题

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

struct node
{
	int dist;
	int sub;
}pos[1000001];

int cmp(const void *a, const void *b)
{
	struct node *aa = (struct node *)a;
	struct node *bb = (struct node *)b;
	return aa->dist - bb->dist;
}

int main()
{
	int test;
	int n, m, sum;
	int view[100];
	int i, j, num, count, dist;
	int s, t, temp, min;

	scanf("%d", &test);
	while(test--)
	{
		scanf("%d %d %d", &n, &m, &sum);
		count = 0;
		for (i = 0; i < m; ++i)
		{
			scanf("%d", &num);
			for (j = 0; j < num; ++j)
			{
				scanf("%d", &dist);
				pos[count].dist = dist;
				pos[count].sub = i;
				++count;
			}
		}
		qsort(pos, n, sizeof(pos[0]), cmp);
		
		s = 0;
		t = -1;
		memset(view, 0, sizeof(view));
		min = 0x7fffffff;
		while(s < n)
		{
			for (i = 0; i < m; ++i)
				if (view[i] == 0)
					break;
			if (i < m)
			{
				++t;
				++view[pos[t % n].sub];
			}
			else
			{
				temp = pos[t % n].dist - pos[s].dist;
				if (t >= n)
					temp += sum;
				if (min > temp)
					min = temp;
				--view[pos[s].sub];
				++s;
			}
		}
		printf("%d\n", min);
	}
	return 0;
}

抱歉!评论已关闭.