uva 812(暴力)

题意:有n个货架上摆放了b个货物,然后从左到右的给出每个货架上货物买入的价格,要拿去卖掉以统一价10,问如果买入形式是栈,要买一个货物必须把他左边的东西都买了才可以,问最大利润是多少,要买多少个货物达到最大利润,按字典序输出所有可能情况(最多10种)。

题解:水题,暴力出所有情况。

第二组样例举例:

3 10 9 10 10

购买数量可能情况:2 4 5

9 17 24 30 30 24 24 30 24

购买数量可能情况: 4 5 8

然后就是6个数字的排列组合相加得到所有解。注意数量可能为0。

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int M = 1005;
const int N = 55;
int box[N], n, num[N][N], mp[M], num2[N];

void dfs(int cur, int sum) {
	if (cur >= n) {
		mp[sum] = 1;
		return;
	}
	for (int i = 0; i < num2[cur]; i++)
		dfs(cur + 1, sum + num[cur][i]);
}

int main() {
	int cas = 0;
	while (scanf("%d", &n) == 1 && n) {
		memset(mp, 0, sizeof(mp));
		int temp, res = 0;
		for (int i = 0; i < n; i++) {
			scanf("%d", &temp);
			int sum = 0, maxx = 0;
			for (int j = 0; j < temp; j++) {
				scanf("%d", &box[j]);
				sum += 10 - box[j];
				maxx = max(maxx, sum);
			}
			res += maxx;
			sum = 0;
			int cnt = 0;
			if (maxx == 0)
				num[i][cnt++] = 0;
			for (int j = 0; j < temp; j++) {
				sum += 10 - box[j];
				if (sum == maxx)
					num[i][cnt++] = j + 1;
			}
			num2[i] = cnt;
		}
		if (cas)
			printf("\n");
		printf("Workyards %d\n", ++cas);
		printf("Maximum profit is %d.\n", res);
		printf("Number of pruls to buy:");
		dfs(0, 0);
		temp = 0;
		for (int i = 0; i < M; i++) {
			if (temp == 10)
				break;
			if (mp[i]) {
				temp++;
				printf(" %d", i);
			}
		}
		printf("\n");
	}
	return 0;
}
时间: 2024-10-26 16:12:52

uva 812(暴力)的相关文章

uva 812 Trade on Verweggistan

题意: 给w个货架, 每个货架上有bi个货物, 每次只能拿最上面的货物, 每个货物有个价值, 所有货物的售价均为10. 问:能获得的最大利润, 以及能获得这个利润需要多少个货物. (有多种组合时只需输出前10种) 思路: 最开始我是先将最大价值预处理了出来, 然后dfs查找方案数, 结果超时了, 后来发现复杂度是O(w*bi), 完全的暴力,可以先将每个货架的最大利润处理出来, 同时处理出来获得这个最大利润所需要的物品数. 后来又WA了几发, 第一次是发现自己没有处理如果利润为负时, 结果应该输

UVA 11754 (暴力+中国剩余定理)

题目链接: http://www.bnuoj.com/v3/problem_show.php?pid=20172 题目大意:有C个模方程,每个方程可能有k余数,求最小的S个解. 解题思路: 看见模方程就想到中国剩余定理,然后看下确定的方程情况. 由乘法原理,共有II ki 种情况,即求解II ki 次.k比较大时基本完蛋. 其实解模方程还有一种暴力方法,就是选定一个模方程,令t=0,1...., n=t*LCM+余数(n一定要大于0) 通过t不断增大这种迭代方式从小到大创造一些可能解n,然后去测

uva 11127(暴力)

题意:给出一个字符串,包括0.1.*,其中×是可以替换成0或者1的,如果字符串的某个子串S有SSS这样的连续重复3次出现,不是Triple-free串,问给出的字符串可以形成多少个非Triple-free串. 题解:因为串长度最多31,所以可以暴力枚举每一位,边枚举边判断. #include <stdio.h> #include <string.h> const int N = 35; char str[N], str2[N]; int n; long long res; bool

uva 669(暴力)

题意:有连续n块内存,然后有k个文件,每个文件可以分为ki块放到内存里,其他内存块为空,现在给出每个文件的ki个碎片在内存中的放在第几块(碎片有序),然后开始进行内存块内容的移动,操作a b表示把内存a中的东西放到内存b中,前提是b为空,要求最少的操作使文件能够按顺序从最小的内存块开始存储,输出顺序操作过程. 题解:用一个flag[i] = j表示位置i上放的碎片应该放到位置j上,可以先遍历一遍把能放碎片的先放,然后开始循环,挑出一个摆放不正确的位置,把碎片放到空闲位置,然后循环遍历把能放到正确

UVA 11464 暴力+位运算 ***

题意:给你一个 n * n 的 01 矩阵,现在你的任务是将这个矩阵中尽量少的 0 转化为 1 ,使得每个数的上下左右四个相邻的数加起来是偶数.求最少的转化个数. 新风格代码 lrj书上说的很清楚了,就是判断下一行的代码有点冗余了,但是很好理解,就是模拟每位有的数字之和,然后判断未知为应该填的数字 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring>

uva 1374(暴力)

题意:给出一个数字x,然后n = 1,每次计算可以让n翻倍,或者加或减之前x计算得过的数,问至少经过几次计算可以让n等于x. 题解:枚举次数,然后dfs是否能在这个次数得到x. #include <stdio.h> const int N = 100; int x, s[N]; bool dfs(int cur, int num, int pre) { if (cur == num && pre == x) return true; if (cur >= num || p

UVA - 812 Trade on Verweggistan dfs + 贪心

题目大意:有n堆东西,只能从上往下买,如果要买下面的东西,只能把上面的所有东西买了才可以,类似一个栈 每个东西都有价格,每个东西卖出去都只能卖10,问能卖的最大利润,和要卖多少个才能达到最大利润 解题思路:贪心的来说每个买了的都要卖出去,才能使得利润最大化,纪录每堆卖出最大利润的所有情况,然后用dfs一一枚举,要判重和排序输出 注意特例,都是0的情况 1 5 10 10 10 10 10 输出应该有0 1 2 3 4 5 #include<cstdio> #include<cstring

UVa 725暴力求解

A - Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Su Description Write a program that finds and displays all pairs of 5-digit numbers that between them use the digits 0 through 9 once each, such that the first number divided

uva 10570(暴力)

题意:有一个长度为n的序列,数字是从1到n,然后问至少交换多少次可以让序列成为升序或降序的序列,环是升序或降序也可以.比如 2 1 4 3也是可以的. 题解:把从1到n和从n到1所有成立情况放到数组内,共有2×n种情况,然后拿输入的序列和这2n种情况比对,不成功的交换后继续比对,直到完全匹配,找出交换次数最小值. #include <stdio.h> #include <algorithm> using namespace std; const int N = 505; int n