UVA 1423 - Guess(拓扑排序)

UVA 1423 - Guess

题目链接

题意:给定一个每个区间和的正负,构造一个序列,使得满足这个矩阵

思路:每个区间和等于两个前缀和的差,这样就可以知道每两个前缀和的大小关系,利用拓扑排序可以求出顺序,然后对应要控制不超过|10|,所以从-10开始,大的就+1,然后构造出这个前缀和序列,对应每个ai就等于c[i] - c[i - 1]

代码:

#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;

int t, n, du[15], ans[15], tmp[15], tn;
char str[105];
vector<int> g[15];
queue<int> Q;

int main() {
	scanf("%d", &t);
	while (t--) {
		scanf("%d%s", &n, str);
		int sn = 0;
		while (!Q.empty()) Q.pop();
		for (int i = 0; i <= n; i++) {
			du[i] = 0;
			g[i].clear();
		}
		for (int i = 1; i <= n; i++) {
			for (int j = i; j <= n; j++) {
				if (str[sn] == '+') {
					g[i - 1].push_back(j);
					du[j]++;
				}
				else if (str[sn] == '-') {
					g[j].push_back(i - 1);
					du[i - 1]++;
				}
				sn++;
			}
		}
		for (int i = 0; i <= n; i++)
			if (du[i] == 0) Q.push(i);
		int cnt = -10;
		while (!Q.empty()) {
			tn = 0;
			while (!Q.empty()) {
				tmp[tn] = Q.front();
				ans[tmp[tn]] = cnt;
				tn++;
				Q.pop();
			}
			for (int i = 0; i < tn; i++) {
				int u = tmp[i];
				for (int j = 0; j < g[u].size(); j++) {
					du[g[u][j]]--;
					if (du[g[u][j]] == 0)
						Q.push(g[u][j]);
				}
			}
			cnt++;
		}
		for (int i = 1; i <= n; i++) {
			printf("%d%c", ans[i] - ans[0] - (ans[i - 1] - ans[0]), i == n ? '\n' : ' ');
		}
	}
	return 0;
}
时间: 2024-10-13 17:48:51

UVA 1423 - Guess(拓扑排序)的相关文章

uvalive 6393(uva 1572) Self-Assembly 拓扑排序

题意: 给出一些正方形,这些正方形的每一条边都有一个标号,这些标号有两种形式:1.一个大写字母+一个加减号(如:A+, B-, A-......), 2.两个0(如:00):这些正方形可以随意翻转和旋转,当两个正方形通过旋转或翻转,使得他们的公共边为相同大写字母并且符号相反时,他们就可以彼此结合拼在一起,现在给出n中正方形,每种正方形有无限多种,问这些正方形能否拼成一个无限大的结构. 题解: 容易想到,要使这些正方形形成无限大地结构,那么这些正方形通过拼接后一定能循环(即通过不断地拼接出现了和以

UVA - 10305 - Ordering Tasks (拓扑排序!)

UVA - 10305 Ordering Tasks Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & %llu Submit Status Description Problem F Ordering Tasks Input: standard input Output: standard output Time Limit: 1 second Memory Limit: 32 MB John has n task

UVA 1572 Self-Assembly(拓扑排序)

1 // 把一个图的所有结点排序,使得每一条有向边(u,v)对应的u都排在v的前面. 2 // 在图论中,这个问题称为拓扑排序.(toposort) 3 // 不难发现:如果图中存在有向环,则不存在拓扑排序,反之则存在. 4 // 不包含有向环的有向图称为有向无环图(DAG). 5 // 可以借助DFS完成拓扑排序:在访问完一个结点之后把它加到当前拓扑序的首部. 6 7 int c[maxn]; 8 int topo[maxn],t; 9 bool dfs(int u) 10 { 11 c[u]

Ordering Tasks From:UVA, 10305(拓扑排序)

Ordering Tasks From:UVA, 10305 Submit Time Limit: 3000 MS      Special Judge John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task is only possible if other tasks have already been executed. Input The inpu

UVA 124 &amp; POJ 1270 Following Orders(拓扑排序)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=60 http://poj.org/problem?id=1270 Following Orders Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3806   Accepted: 1507 Description Or

UVa 10305 - Ordering Tasks 拓扑排序题解

Topological Sort题解.本题是简单的入门题目. Topological Sort的思想很简单,就是按没有入度的点,先输出,然后删除这个点的出度.然后输出下一组没有入度的点. 如何实现也是很简单的: 这里使用邻接表,建图的时候反过来建图,建立一个入度邻接表. 然后使用一个vis数组,记录访问过的节点,也可以根据这个信息知道哪些是已经输出的点,这个时候这些点的入度可以不算为当前入度了. #include <stdio.h> #include <vector> using

UVa 872 - Ordering 输出全拓扑排序

本题要求输出全部拓扑排序的序列. 还好本题的数据量不是很大,限制在26个大写英文字母,故此可以使用递归法输出. 这个递归输出全部解在Leetcode很多这样的题目的,不小心的话,还是很难调试的. 总体考了递归和拓扑排序,还有判断是否可以拓扑排序-就是是否图有环. 考了三大知识点,难度还是有的.因为数据量不大,故此判断环可以使用一般递归方法,递归只需要注意细节就好了. #include <stdio.h> #include <vector> #include <string.h

uva 10305 Ordering Tasks(拓扑排序)

拓扑排序,不用判断是否有环,dfs挺简单的 代码: #include<stdio.h> #include<string.h> #include<stdlib.h> int map[105][105]; int visit[105]; int c[105]; int n,m,t; void dfs(int x) { visit[x] = 1; for(int i=1; i<=n; i++) { if(!visit[i]&&map[i][x]==1)

[拓扑排序]Ordering Tasks UVA - 10305

拓扑排序模版题型: John has n tasks to do.Unfortunately, the tasks are not independent and the execution of one task is only possible if other tasks have already been executed. Input The input will consist of several instances of the problem. Each instance be