uva :10123 - No Tipping(dfs + 几何力距 )

题目:uva :10123 - No Tipping

题目大意:给出l, m, n 分别表示 长度为l 的杠杆, 重量为 m, 有n个物体放在上方。问每次从上面挑选一个物品移除,是否能使杠杆继续平衡。这个过程中都可以的话,就输出移除顺序(不唯一) 否则就输出 impossible ,一开始,这个杠杆就不平衡的情况也会是有的。因为杠杆也是有重量的。

解题思路;

1、这题先前我就不明白什么怎么样的情况下,双支撑点的杠杆不平横,后面看了别人的报告才明白。

首先  我这里有两个支撑点 (1, 2) 左边的为1. 然后1支撑点的左力距为wl1.同理还有wr1, wl2, wr2. 有1个支撑点的力距的值可以比没有支撑点的力距大,因为多个支撑点支撑重量。所以 这里不平横情况 ( wl1 > wr1 || wr2 > wl2).

2、这题还有时间的问题,直接去dfs是会超时的。所以这里就需要优化。

首先放在两个支撑点中间的物体会使得这个杠杆更加的平衡,因此,这样的物体可以最后移除。然后将力距分左右从小到大的排序。因为要使得移除的任何一个过程都需要平衡,所以问题可以转换为把一个一个物体放到一开始为空的杠杆上的状态和顺序,最后逆向输出。物体一个一个放的话,当然是力距小比较不容易发生失衡的现象。然后左边的物体从例力距小的开始放,如果不能放就换放右边的力距小的物体。如果两边都不能放就说明是impossible。

注意:这题中间dfs需要考虑仔细点,例如如何判断两边都不能放的情况,如果一边都放完的情况,还有这边放一些去另外一边的情况。

还有两支撑点间的物体虽然dfs不需要考虑,但是他们的力距需要加到总的力距上。他们的加入会使得杠杆更加平衡,能支撑更多的物体。

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
#include <math.h>
using namespace std;

const int N = 30;
int l, m, n, ans[N][2], path[3], cnt[3];
int flag;
double wl1, wl2, wr1, wr2;

struct OB {

	int w, l;
} obl[N], obr[N], obm[N];

bool cmp (const OB & x,const  OB &y) {

	if (abs (x.l * x.w) < abs (y.l * y.w))
		return true;
	return false;
}

void solve (int dir, int cur, int bo) {

	if (cur >= n) {

		flag = 1;
		return;
	}
	if (dir == 0) {

		for (int i = path[dir]; i < cnt[dir]; i++) {
//			printf ("%.3lf %.3lf\n", wl1 + ( -3 - obl[i].l) * obl[i].w, wr1);
			if (wl1 + (-3 - obl[i].l) * obl[i].w > wr1) {

				if (bo) {

					flag = -1;
					return;
				}
				path[dir] = i;
				solve( 2 - dir, cur, bo + 1);
				if (flag)
					return;
			} else {

				ans[cur][0] = obl[i].l;
				ans[cur][1] = obl[i].w;
				wl1 += (-3 - obl[i].l) * obl[i].w;
				wl2 += (3 - obl[i].l) * obl[i].w;
				path[dir] = i + 1;
				cur++;
				bo = 0;

			}
		}
		if (path[2 - dir] <=  cnt[2 - dir])
			solve (2 - dir, cur, bo);
	} else {

		for (int i = path[dir]; i < cnt[dir]; i++) {

			if (wr2 + (obr[i].l - 3) * obr[i].w > wl2) {

				if (bo) {
					flag = -1;
					return;
				}
				path[dir] = i;
				solve (2 - dir, cur, bo + 1);
				if (flag)
					return;
			} else {

				ans[cur][0] = obr[i].l;
				ans[cur][1] = obr[i].w;
				wr1 += (obr[i].l + 3) * obr[i].w;
				wr2 += (obr[i].l - 3) * obr[i].w;
				path[dir] = i + 1;
				cur++;
				bo = 0;
			}
		}
		if (path[2 - dir] <= cnt[2 - dir])
			solve (2 - dir, cur, bo);
	}
	if (flag)
		return;
}

int main () {

	int p, w, t = 0;
	while (scanf ("%d%d%d", &l, &m, &n), l || m || n) {

		wl1 = wr2 = (l - 3.0) * (l - 3.0) * m / l / 4.0;
		wl2 = wr1 = (l + 3.0) * (l + 3.0) * m / l / 4.0;
//		printf ("wl1 = %.3lfwr1 =  %.3lf\n", wl1, wr1);
		memset (cnt, 0, sizeof (cnt));
		for (int i = 0; i < n; i++) {

			scanf ("%d%d", &p, &w);
			p = p * 2;
			if (p <= 3 && p >= -3){

				obm[cnt[1]].w = w;
				obm[cnt[1]].l = p;
				cnt[1]++;
			} else {

				if (p > 3) {

					obr[cnt[2]].w = w;
					obr[cnt[2]].l = p;
					cnt[2]++;
				} else {

					obl[cnt[0]].w = w;
					obl[cnt[0]].l = p;
					cnt[0]++;
				}
			}
		}
		sort (obl, obl + cnt[0], cmp);
		sort (obr, obr + cnt[2], cmp);
		memset (path, 0, sizeof (path));
		for (int i = 0; i < cnt[1]; i++) {

			wr1 += (obm[i].l + 3) * obm[i].w;
			wl2 += (3 -  obm[i].l) * obm[i].w;
		}
		printf ("Case %d:\n", ++t);
		flag = 0;
		if (wl1 <= wr1 && wr2 <= wl2) {

			solve (0, cnt[1], 0);
		}
		if (flag != 1)
			printf ("Impossible\n");
		else {

			for (int i = n - 1; i >= cnt[1]; i--)
				printf ("%d %d\n", ans[i][0]/2, ans[i][1]);
			if (cnt[1] - 1 >= 0)
				for (int i = cnt[1] - 1; i >= 0; i--)
					printf ("%d %d\n", obm[i].l/2, obm[i].w);
		}
	}
	return 0;
}

uva :10123 - No Tipping(dfs + 几何力距 )

时间: 2024-10-12 11:10:03

uva :10123 - No Tipping(dfs + 几何力距 )的相关文章

uva 10123 No Tipping(逆向思维+力矩)

uva 10123 No Tipping As Archimedes famously observed, if you put an object on a lever arm, it will exert a twisting force around the lever's fulcrum. This twisting is called torque and is equal to the object's weight multiplied by its distance from t

uva 10123 - No Tipping dp 记忆化搜索

这题的题意是 在双脚天平上有N块东西,依次从上面取走一些,最后使得这个天平保持平衡! 解题: 逆着来依次放入,如果可行那就可以,记得得有木板自身的重量. /************************************************************************* > File Name: 10123.cpp > Author: opas > Mail: [email protected] > Created Time: 2016年10月22日

UVa 572 Oil Deposits(DFS)

 Oil Deposits  The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSurvComp works with one large rectangular region of land at a time, and creates a grid that divides the land into numerous square plots.

UVA 10318 - Security Panel dfs 剪枝

UVA 10318 - Security Panel dfs 剪枝 ACM 题目地址:UVA 10318 - Security Panel 题意: 这题跟点灯的题目很像,点灯游戏选择一盏灯时会让它以及四周的灯改变状态. 但是我们有特殊的开开关技巧,它给出了改变状态的位置,而不是四周都改变. 问你从全部关着变成全部开着的最小开关步骤. 分析: 很明显,在一个位置上点两次或更多次是没有必要的,所以一个位置只有选择与不选择,用dfs即可,但如果暴力所有可能,复杂度是2^25,会超时,所以要剪枝. 由于

UVa 11178 Morley&#39;s Theorem (几何问题)

题意:给定三角形的三个点,让你求它每个角的三等分线所交的顶点. 析:根据自己的以前的数学知识,应该很容易想到思想,比如D点,就是应该求直线BD和CD的交点, 以前还得自己算,现在计算机帮你算,更方便,主要注意的是旋转是顺时针还是逆时针,不要搞错了. 要求BD和CD就得先求那个夹角ABC和ACD,然后三等分. 代码如下: #include <iostream> #include <cstdio> #include <cstring> #include <cmath&

uva 12253 - Simple Encryption(dfs)

题目链接:uva 12253 - Simple Encryption 题目大意:给定K1,求一个12位的K2,使得KK21=K2%1012 解题思路:按位枚举,不且借用用快速幂取模判断结果. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const ll ite=(1<<20)-1; ll N; /* l

uva 10641 - Barisal Stadium(dp+几何)

题目链接:uva 10641 - Barisal Stadium 题目大意:按照顺时针给出操场的周边点,然后给出周围可以建设照明灯的位置,以及在该位置建设照明灯的代价,照明灯照射的范围与操场的边界相切,现在要求一个最小的花费,要求操场的所有边都被照射到. 解题思路:dp[i][j]表示从第i个点到第j个点之间的边都被照射到的最小代价,这样转移方程也很好写,只要有某个等得照射范围有覆盖到i,j,就可以向外扩展. 然而现在最主要的问题是如何求各个点的照射范围,一开始我是用灯的位置和边界所有点求斜率,

UVA 1543 - Telescope(dp+几何)

题目链接:1543 - Telescope 题意:按顺序给定圆周上一些点,问用选一些点组成m边形面积的最大值. 思路:dp,dp[i][j][k] 表示第一个点为i,最后一个点为j,当前选择k的最大值,因为多选一个点,会多的面积为他和第一个点和最后一个点构成的三角形面积,然后利用海伦公式求面积,状态转移为:dp[i][j][x] = max(dp[i][j][x], dp[i - 1][j][k] + s); 代码: #include <stdio.h> #include <string

Uva LA6450 Social Advertising DFS

You have decided to start up a new social networking company. Other existing popular social networksalready have billions of users, so the only way to compete with them is to include novel features noother networks have.Your company has decided to ma