ABC352编程笔记

ABC352 编程笔记

在这里插入图片描述
题意:输入,四个数 a , b , c , d a,b,c,d a,b,c,d,若 d d d c , d c,d c,d 之间,则输出 Yes,否则输出 No

正解:直接判断。

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

void solve()
{
	int a,b,c,d;
	cin >> a >> b >> c >> d;
	if (d >= b && d <= c || d >= c && d <= b) cout << "Yes";
	else cout << "No";
}

signed main()
{
	int TTT;
//	cin >> TTT;
	TTT = 1;
	while (TTT--) solve();
	return 0;
}

在这里插入图片描述
题意:有两个字符串 S , T S,T S,T,找出 T T T 里所有 S S S 的字符的下标,并输出。

正解:模拟。

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

void solve()
{
	string s,t;
	cin >> s >> t;
	for (int i = 0,j = 0;i < t.size();i++)
		if (s[j] == t[i]) cout << i+1 << ' ',j++;
}

signed main()
{
	int TTT;
//	cin >> TTT;
	TTT = 1;
	while (TTT--) solve();
	return 0;
}

在这里插入图片描述
题意:给出所有人的肩膀的海拔高度和头部的海拔高度,求出所有人叠高高后的最高海拔高度。

正解:贪心。

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

struct node
{
	int a,b;
}a[200010];
bool cmp(node a,node b)
{
	if (a.a == b.a) return a.b > b.b;
	return a.a > b.a;
}

void solve()
{
	int n,sum = 0,mx = -1e18;
	cin >> n;
	for (int i = 1;i <= n;i++) cin >> a[i].a >> a[i].b,sum += a[i].a;
	sort(a+1,a+n+1,cmp);
	for (int i = 1;i <= n;i++)
	{
		int now = sum - a[i].a + a[i].b;
		mx = max(mx,now);
	}
	cout << mx;
}

signed main()
{
	int TTT;
//	cin >> TTT;
	TTT = 1;
	while (TTT--) solve();
	return 0;
}

在这里插入图片描述
题意:给你一个 1 1 1 n n n 的排列 p p p,找到一个长为 k k k 的子序列,满足子序列中元素重排后构成公差为 1 1 1 的等差数列,求子序列的最小跨度。

正解:用 p i p_i pi 表示 i i i 这个数在原数组里的下标,则只需算 min ⁡ ( p k − p 1 , p k + 1 − p 2 , p k + 2 − p 3 , … , p n − p n − k + 1 ) \min(p_k-p_1,p_{k+1}-p_2,p_{k+2}-p_3,\dots,p_n-p_{n-k+1}) min(pkp1,pk+1p2,pk+2p3,,pnpnk+1),并且让 p a − p a − k + 1 > 0 p_a-p_{a-k+1}>0 papak+1>0

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

int n,k;
int a[200010],b[200010]; 

void solve()
{
	cin >> n >> k;
	for (int i = 1;i <= n;i++) cin >> a[i],b[a[i]] = i;
	set <int> id; //记录选取的数字的下标,自动排序
	for (int i = 1;i <= k;i++) id.insert(b[i]);
	int ans = *id.rbegin() - *id.begin();
	for (int i = k+1;i <= n;i++)
	{
		id.erase(b[i-k]);
		id.insert(b[i]);
		ans = min(ans,*id.rbegin() - *id.begin());
	}
	cout << ans;
}

signed main()
{
	int TTT;
//	cin >> TTT;
	TTT = 1;
	while (TTT--) solve();
	return 0;
}

在这里插入图片描述
题意:

给你一个加权无向图 G G G,有 N N N 个顶点,编号为 1 1 1 N N N。最初, G G G 没有边。

您将执行 M M M 次操作来为 G G G 添加边。第 i i i 次操作 ( 1 ≤ i ≤ M ) (1\le i\le M) (1iM) 如下:

  • 给你一个由 K i K_i Ki 个顶点组成的顶点子集 S i = A i , 1 , A i , 2 , … , A i , K i S_i={A_{i,1}, A_{i,2},\dots,A_{i,K_i}} Si=Ai,1,Ai,2,,Ai,Ki。对于每一对 u , v u,v u,v,即 u , v ∈ S i u,v∈S_i u,vSi u < v u<v u<v,在顶点 u u u v v v 之间添加一条边,权重为 C i C_i Ci

执行所有 M M M 操作后,确定 G G G 是否相连。如果是,求 G G G 最小生成树中各条边的总重。

正解:

用 Kruskal 的原理:每次添加最小的边。把所有的边权种类从小到大排序后每次添加最小的边。

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

int n,m;
pair <int,vector<int> > a[666666];
int fa[666666];

int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);}
int merge(int x,int y)
{
	int fx = find(x),fy = find(y);
	if (fx == fy) return 0;
	fa[fy] = fx;
	return 1;
}
bool cmp(pair<int,vector<int> > c,pair<int,vector<int> > b) {return c.first < b.first;}

void solve()
{
	cin >> n >> m;
	for (int i = 1;i <= n;i++) fa[i] = i;
	for (int i = 1;i <= m;i++)
	{
		int k,c;
		cin >> k >> c;
		vector <int> v(k);
		for (int i = 0;i < k;i++) cin >> v[i];
		a[i] = {c,v}; 
	}
	sort(a+1,a+m+1,cmp);
	int ans = 0;
	for (int i = 1;i <= m;i++)
	{
		int c = a[i].first;
		vector <int> v;
		for (int j = 0;j < a[i].second.size();j++) v.push_back(a[i].second[j]);
		int id = v[0];
		for (int j = 0;j < v.size();j++)
			if (merge(id,v[j]))
				ans += c;
	}
	for (int i = 1;i <= n;i++)
		if (find(1) != find(i))
		{
			cout << "-1\n";
			return ;
		}
	cout << ans << '\n';
}

signed main()
{
	int TTT;
//	cin >> TTT;
	TTT = 1;
	while (TTT--) solve();
	return 0;
}

相关推荐

  1. abc362abcde

    2024-05-10 15:48:05       24 阅读
  2. AtCoder ABC351 A-D题解

    2024-05-10 15:48:05       32 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-10 15:48:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-10 15:48:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-10 15:48:05       82 阅读
  4. Python语言-面向对象

    2024-05-10 15:48:05       91 阅读

热门阅读

  1. ORACLE 生成AWR常用脚本

    2024-05-10 15:48:05       35 阅读
  2. C#中override与重载的区别

    2024-05-10 15:48:05       34 阅读
  3. 设计模式之单例模式

    2024-05-10 15:48:05       36 阅读
  4. 如何在Windows和Linux中杀死Python进程

    2024-05-10 15:48:05       37 阅读
  5. 二、Redis五种常用数据类型-String

    2024-05-10 15:48:05       34 阅读
  6. 【思考&讨论】如何利用AI提高内容生产效率?

    2024-05-10 15:48:05       34 阅读
  7. MongoDB聚合运算符:$toInt

    2024-05-10 15:48:05       39 阅读
  8. python时间戳与时间字符串的转化

    2024-05-10 15:48:05       35 阅读