首页 > 其他分享 >寒假训练 2024/2/11凌晨

寒假训练 2024/2/11凌晨

时间:2024-02-11 09:02:37浏览次数:30  
标签:11 int st 2024 寒假 push tb tc ta

紫书

uva437

标签:

二位偏序,区间dp

题意:

给$n$种长方体,每种有无限块,要求罗列最高的高度。限制条件是在下面的长方体的长和宽要严格大于上面的。

思路:

思路很简单,题目给的$n 的 范围[1, 50]$,模拟一下我们可以推断,每一种长方体有$A_3^{3} = 6$ 种排列方式,我们把每一种的六种排列方式压入集合(只需要压入一遍,因为题目要求是严格小于),然后按照第一和第二关键字排序,最后区间dp就行。

复杂度:

O($m ^ 2$, m = 6n), 可行

#include <bits/stdc++.h>
using namespace std;

#define int long long
	
struct inf {
	int a, b, c;
};

bool cmp1 (inf A, inf B) {
	if(A.a == B.a) {
		return A.b < B.b;
	}
	return A.a < B.a;
}

void solve(int n, int Case) {
	vector<inf> v;

	for (int i = 0; i < n; i++) {
		int ta, tb, tc;
		cin >> ta >> tb >> tc;
		v.push_back({ta, tb, tc});
		v.push_back({ta, tc, tb});
		v.push_back({tb, ta, tc});
		v.push_back({tb, tc, ta});
		v.push_back({tc, ta, tb});
		v.push_back({tc, tb, ta});
	}

	sort(v.begin(), v.end(), cmp1);
	
	vector<int> dp(n * 6 + 1, 0);
	int ans = 0;
	for (int i = 1; i <= v.size(); i++) {
		for (int j = 0; j < i; j++) {
			if(!j || v[j - 1].a < v[i - 1].a && v[j - 1].b < v[i - 1].b) {
				dp[i] = max(dp[i], dp[j] + v[i - 1].c);
			}
		}
		ans = max(ans, dp[i]);
	}

	cout << "Case " << Case << ": maximum height = " << ans << endl;
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);

	int n, cnt = 1;
	while(cin >> n && n) {
		solve(n, cnt++);
	}

	return 0;
}

uva10048

题意:

给了n$\le 100$个点,m$\le 1000$个条边,q$\le 10000$个个询问,

每个询问给初始点和终点,求经过边最大值的最小值。

思路:

起初我想到最大值最小,就想到了二分,但是这个题是边,直接走一遍就可以得出,我考虑用搜索,考虑到dfs之前出现过爆栈的情况,这次我选用bfs,每个bfs跑一边所有边,时间复杂度就是O(mq),可行。

#include <bits/stdc++.h>
using namespace std;

#define int long long

void solve(int Case) {
	int n, m, q;
	cin >> n >> m >> q;
	if(!n) {
		exit(0);
	}

	vector<vector<pair<int, int>>> adj(n + 1, vector<pair<int, int>>());

	for (int i = 0; i < m; i++) {
		int a, b, c;
		cin >> a >> b >> c;
		adj[a].push_back({b, c});
		adj[b].push_back({a, c});
	}

	auto f=[&] (int st, int ed) {
		vector<int> dis (n + 1, 1e18);

		dis[st] = 0;
		queue<int> q;
		q.push(st);
		int res = 1e18;
		while(q.size()) {
			auto x = q.front();
			// cerr << x << " " << dis[x] << endl;
			q.pop();
			if(x == ed) {
				continue;
			}	
			for (auto [ne, cos] : adj[x]) {
				if(dis[ne] > max(cos ,dis[x])) {
					q.push(ne);
					dis[ne] = max(cos, dis[x]);
				}
			}
		}

		return dis[ed];
	};

	if(Case > 1) {
		cout << endl;
	}
	cout << "Case " << "#" << Case << endl;

	for (int i = 0; i < q; i++) {
		int st, ed;
		cin >> st >> ed;
		int res = f(st, ed);
		if(res == 1e18) {
			cout << "no path\n";
		}
		else {
			cout << res << endl;
		}
	}
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);

	// int T = 1;
	// cin >> T;
	int cnt = 1;
	while(1) {
		solve(cnt++);
	}

	return 0;
}

uva11572

题意:

求最长的区间:区间内没有重复的数字。

思路:

一眼哈希。需要注意的是有两段,开始到重复的第二个数字的前一个数字和第一个数字到第二个数字的前一个数字。

#include <bits/stdc++.h>
using namespace std;

#define int long long

void solve() {
	int n;
	cin >> n;

	vector<int>v(n);
	map<int, int>mp;

	int ans = 0;
	int st = 0;
	for (int i = 0; i < n; i++) {
		cin >> v[i];
		if(mp.count(v[i]) != 0 && mp[v[i]] >= st) {
			ans = max(max(ans, i - mp[v[i]]), i - st);
			st = mp[v[i]] + 1;
		}
		mp[v[i]] = i;
	}

	ans = max(ans, n - st);
	
	cout << ans << endl;
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);

	int T = 1;
	cin >> T;
	while(T--) {
		solve();
	}

	return 0;
}

标签:11,int,st,2024,寒假,push,tb,tc,ta
From: https://www.cnblogs.com/yyc4591/p/18013146

相关文章

  • 2024/2/10学习进度笔记
    RDD,学名可伸缩的分布式数据集(ResilientDistributedDataset)。是一种对数据集形态的抽象,基于此抽象,使用者可以在集群中执行一系列计算,而不用将中间结果落盘。而这正是之前MR抽象的一个重要痛点,每一个步骤都需要落盘,使得不必要的开销很高。对于分布式系统,容错支持是必不可少的。......
  • POJ--1179 Polygon(区间DP)
    记录22:012024-2-10http://poj.org/problem?id=1179区间DP问题。区间DP问题可能需要注意的点就是是根据区间长度来计算的,随着迭代区间长度不断增加,结果也就计算出来了这种“任意选择一个位置断开,复制形成2倍长度的链”的方法,是解决DP中环形结构的常用手段之一因此读入数......
  • C++11 用户定义字面量
    C++11用户定义字面量C++11引入了一项功能,称为用户自定义字面量(user-definedliterals),它允许程序员定义自己的字面量后缀,以扩展现有的字面量语法。内置字面量C++自带4种字面量:整形123浮点型12.3字符'1'字符串"123"字面量又可添加后缀来表明具体类型,建议大写:无符......
  • P1102 A-B 数对
    原题链接解法一:二分搜素首先我们知晓A-B=C,那么A=B+C,我们只需要遍历数组中的每一个元素然后在数组中搜素a[i]+c的值是否存在即可。Code #include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=2e5+5;lla[N];intmain(){intn,c;l......
  • BeginCTF 2024(自由赛道)MISC
    realcheckin题目:从catf1y的笔记本中发现了这个神秘的代码MJSWO2LOPNLUKTCDJ5GWKX3UN5PUEM2HNFXEGVCGL4ZDAMRUL5EDAUDFL5MU6VK7O5UUYMK7GEYWWZK7NE3X2===你能帮助我找到最后的flag吗?我的解答:base32解码begin{WELCOMe_to_B3GinCTF_2024_H0Pe_YOU_wiL1_11ke_i7}下一站上岸......
  • 2024年应该关注的十大人工智能创新
    人工智能(AI)不再只是一个流行词,它已成为我们日常生活的重要组成部分。人工智能在去年深入地融入我们社会的各个方面,改变我们的生活方式、工作方式以及与技术互动的方式。今年是大年初一,我们将探讨2024年可能出现的十大人工智能创新,拥抱这些即将到来的人工智能创新,可以为一个充满激......
  • 关于刘谦2024春晚的数学游戏原理
    自己想出来的!首先牌的顺序肯定是形如\(ABCDABCD\)。将牌的顺序考虑成一个字符环。按照名字长度对该字符环进行左移,本质上没有打乱这个环的顺序。因此在置换后,牌的顺序还是会形如\(ABCDABCD\)。将前三张随机放到牌堆中间,我们发现此时牌堆顶和牌堆底的两张牌是一样的。因此......
  • 2024.2.8&2024.2.9
    1.重写是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形参都不改变。即外科不变,核心重写。重写的好处在于,子类可以根据需求,定义特定于自己的行为。也就是说子类可以根据需求实现父类的方法。重写方法不能抛出新的检查异常或者比被重写方法更加宽泛的异常。例如:父......
  • 回顾2023,拥抱2024
    导航引言降本增效:一滴油的启示ChatGpt:助推AI落地的催化剂技术部为GMV负责:战略转型还是权宜之计做灯泡还是发动机:职业发展灵魂之问长期主义:坚持做高价值的事情2023年,你努力了吗发展是解决一切问题的总钥匙幸福是奋斗出来的结语引言农历新年的钟声即将敲响,再过几个小......
  • P1182 数列分段 Section II
    原题链接作为二分答案的入门题非常合适。很典型的二分答案。但是这题有一个坑点,left的值不能设为0这种确定的值,而是应该设为这个数组的最大值。这道题警示了我二分答案的一个重要前提:确定合理的二分区间。题解首先,判断单调性,对于一个最大值mid,如果能够满足check(),那么mid+1,mid+......