ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

P3052 [USACO12MAR]Cows in a Skyscraper G

2021-10-26 16:02:59  阅读:180  来源: 互联网

标签:std 一台 int since P3052 system Cows 电梯 USACO12MAR


看到这个数据范围,显然状压
用\(f[i][j]\)表示开了i个电梯,装的牛的集合为j,每次往最后一台电梯加入牛,让最后一台电梯的重量为\(f[i][j]\)

std::mt19937 r(std::chrono::system_clock::now().time_since_epoch().count());
const int N = 21;
int n, W, w[N];

namespace DP {
	int f[19][1 << 19], mx; //¿ªÁËi¸öµçÌÝ£¬Ñ¡ÁËj¼¯ºÏÀïÃæµÄÅ££¬ÖØÁ¿Îªfij

	int main() {
		memset(f, 0x3f, sizeof f);
		mx = (1 << n) - 1;

		rep(i, 1, n) {
			f[1][1 << (i - 1)] = w[i];
		}

		rep(i, 1, n) { //µçÌÝÊý
			rep(j, 0, mx) {
				if(f[i][j] > 1e9) continue;
				rep(k, 1, n) {
					if(j & (1 << (k - 1))) continue;
					if(f[i][j] + w[k] <= W) {
						f[i][j | 1 << (k - 1)] = min(f[i][j | 1 << (k - 1)], f[i][j] + w[k]);
					} else {
						f[i + 1][j | 1 << (k - 1)] = min(f[i][j | 1 << (k - 1)], w[k]);
					}
				}
			}
		}
		rep(i, 1, n) {
			if(f[i][mx] < 1e9) {
				out(i, '\n');
				break;
			}
		}

		return 0;
	}

}

namespace rnd {
	int main() {
		int t = clock();
		int ans(n);
		
		while(clock() - t < CLOCKS_PER_SEC * 0.98)
		{
			srand(r());
			int g(0), num(1);
			rep(i, 1, n) {
				if(g + w[i] <= W) {
					g += w[i];
				} else {
					g = w[i];
					++num;
				}
			}
			ans = min(ans, num);
			std::random_shuffle(w + 1, w + n + 1);
		}
		out(ans, '\n');
		return 0;
	}
}

标签:std,一台,int,since,P3052,system,Cows,电梯,USACO12MAR
来源: https://www.cnblogs.com/QQ2519/p/15466189.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有