首页 > 其他分享 >AtCoder Beginner Contest 376

AtCoder Beginner Contest 376

时间:2024-10-21 20:31:51浏览次数:1  
标签:AtCoder Beginner int cin long ++ solve ans 376



A - Candy Button

题意

按一次按钮得到一块糖,条件是这次按按钮的时间间隔上次得到糖的时间\(\ge c\)。现在按\(n\)次按钮,已知第\(i\)次按按钮时间为\(t_i\),求得到的糖果数。

思路

模拟。

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long

const int mxn = 1e6 + 5;

void solve()
{
	int n, c, sum = 1;
	cin >> n >> c;
	vector<int> v(n);
	for (int i = 0; i < n; i++)
	{
		cin >> v[i];
	}
	int last = v[0];
	for (int i = 1; i < n; i++)
	{
		if (v[i] - last >= c)
		{
			sum++;
			last = v[i];
		}
	}
	cout << sum << endl;
}

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

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

	return 0;
}


B - Hands on Ring (Easy)

题意

一个环分成\(n\)块(下标从\(1\)开始),最初左手在\(1\),右手在\(2\)。现在操作\(q\)次,\(h_i\)代表要移动的手,\(t_i\)代表移动到哪。问总移动步数(一次只能移动一步,且两只手不能重叠)。

思路

\(n\)和\(q\)都很小,直接暴力模拟。注意取余操作会出现\(0\),所以把下标统一减一处理。

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long

void solve()
{
	int n, q;
	cin >> n >> q;
	int l = 0, r = 1, ans = 0;
	for (int i = 0; i < q; i++)
	{
		char h;
		int t;
		cin >> h >> t;
		t--;
		bool f = false;
		if (h == 'L')
		{
			int j = l;
			while (j != t)
			{
				j = (j + 1) % n;
				if (j == r)
				{
					f = true;
				}
			}
			ans += ((f ? l - t : t - l) + n) % n;
			l = t;
		}
		else
		{
			int j = r;
			while (j != t)
			{
				j = (j + 1) % n;
				if (j == l)
				{
					f = true;
				}
			}
			ans += ((f ? r - t : t - r) + n) % n;
			r = t;
		}
	}
	cout << ans << endl;
}

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

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

	return 0;
}


C - Prepare Another Box

题意

\(n\)个玩具,大小为\(a_i\);\(n-1\)个盒子,大小为\(b_i\)。现在加一个尽量小的盒子使得所有玩具都能被装进盒子。

思路

因为只能加一个盒子,所以除去加的盒子外还有装不下的就无解;否则升序排序后第一个装不下的就是答案。

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long

void solve()
{
	int n;
	cin >> n;
	vector<int> a(n), b(n - 1);
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	for (int i = 0; i < n - 1; i++)
	{
		cin >> b[i];
	}
	sort(a.begin(), a.end(), greater<int>());
	sort(b.begin(), b.end(), greater<int>());
	int i = 0;
	while (i < n - 1 && b[i] >= a[i]) // 找第一个装不下的
	{
		i++;
	}
	for (int j = i; j < n - 1; j++)
	{
		if (b[j] < a[j + 1]) // 除了加的盒子还有装不下的
		{
			cout << -1 << endl;
			return;
		}
	}
	cout << a[i] << endl; 
}

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

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

	return 0;
}



D - Cycle

题意

给定\(n\)个点的简单连通无向图(编号从\(1\)开始)。求包含顶点\(1\)的最小环大小。

思路

等价于从\(1\)到\(1\)的最短路。

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long

const int mxn = 1e6 + 5;

void solve()
{
	int n, m;
	cin >> n >> m;
	vector<vector<int>> g(n + 1, vector<int>());
	for (int i = 0; i < m; i++)
	{
		int u, v;
		cin >> u >> v;
		g[u].push_back(v);
	}
	int ans = LLONG_MAX;
	vector<int> dis(n + 1, -1);
	queue<int> q;
	dis[1] = 0;
	q.push(1);
	while (q.size())
	{
		int u = q.front();
		q.pop();
		for (auto& v : g[u])
		{
			if (v == 1)
			{
				ans = min(ans, dis[u] + 1);
			}
			if (dis[v] == -1)
			{
				dis[v] = dis[u] + 1;
				q.push(v);
			}
		}
	}
	if (ans == LLONG_MAX)
	{
		cout << -1 << endl;
		return;
	}
	cout << ans << endl;
}

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

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

	return 0;
}

E - Max × Sum

题意

给定两个长度为\(n\)的序列\(A\)、\(B\),令\(S\)为\(\{ 1,2,···,n \}\)的子序列,长度为\(k\)。求 \(\max A_{i \in S}\ ×\ \sum B_{i \in S}\) 的最小值。

思路

枚举\(\max A_{i \in S}\),再用堆维护\(B\)的前\(K\)小即可。

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long

struct node
{
	int a, b;
	bool operator < (const node& x) const
	{
		if (x.a == a)
		{
			return b < x.b;
		}
		return a < x.a;
	}
};

void solve()
{
	int n, k;
	cin >> n >> k;
	vector<node> v(n);
	for (int i = 0; i < n; i++)
	{
		cin >> v[i].a;
	}
	for (int i = 0; i < n; i++)
	{
		cin >> v[i].b;
	}
	sort(v.begin(), v.end());
	int ans = LLONG_MAX, sum = 0;
	priority_queue<int> q;
	for (int i = 0; i < k; i++)
	{
		q.push(v[i].b);
		sum += v[i].b;
	}
	ans = min(ans, sum * v[k - 1].a);
	for (int i = k; i < n; i++) // 枚举 max a[i],维护b的前k小
	{
		int now = q.top();
		ans = min(ans, v[i].a * (sum - now + v[i].b));
		q.push(v[i].b);
		sum += v[i].b;
		now = q.top();
		q.pop();
		sum -= now;
	}
	cout << ans << endl;
}

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

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

	return 0;
}


比赛链接 https://atcoder.jp/contests/abc376

标签:AtCoder,Beginner,int,cin,long,++,solve,ans,376
From: https://www.cnblogs.com/Seii/p/18490311

相关文章

  • AtCoder Beginner Contest 369 - VP记录
    A-369样例已经包括了所有的情况(真良心)。点击查看代码#include<cstdio>#include<algorithm>usingnamespacestd;intmain(){ inta,b;scanf("%d%d",&a,&b); intans=0; if(a>b)swap(a,b); if(a==b)ans=1; elseif((b-a)&1)ans=2; else......
  • AtCoder Beginner Contest 376
    AtCoderBeginnerContest376A-CandyButton有一个人按若干次按钮,如果距离上次得分的时间超过\(C\),那么就会获得一颗糖。给出这个人按按钮的时刻,回答最终会获得有多少糖。模拟题#include<iostream>#include<cstdio>usingnamespacestd;intn,c,a,ans;intmain(){......
  • 题解:AT_abc376_c [ABC376C] Prepare Another Box
    很好的一道二分答案题。听说CSP考前写tj可以让rp+=inf?注:下文中\(w\)指物品重量序列,\(x\)指箱子容量序列。先问个问题:为什么我上来就敢肯定这是个二分答案题?或者说,单调性在哪儿?非常简单:如果一个盒子的容量越大,能装下的东西就更多(废话)。那么如果\(v\)不够用,可以扩......
  • 题解:AT_abc376_c [ABC376C] Prepare Another Box
    这道题要求把\(a\)数组和\(b\)数组一一匹配,且要求无法匹配的数量最多为一,并且这个无法匹配的元素最小。可以注意到我们把两个数组排序以后一一对应以后如果出现一个无法匹配的元素,那么这一定就是答案。但是如果我们从小到大枚举,会发现最后剩下的元素不一定最小,所以我们选择......
  • abc376C Prepare Another Box
    有N个玩具,大小分别为A[i];另外有N-1个盒子,大小分别为B[i]。现要再买一个盒子,把所有玩具装到盒子里,要求每个玩具都装一个盒子,并且玩具大小不超过盒子大小。问买的盒子至少为多大?如果无法满足,输出-1。2<=N<=2E5,1<=A[i],B[i]<=1E9分析:将玩具按从大到小排序再依次处理,每次用不小于......
  • abc376D Cycle
    有N个顶点M条边的简单有向图,求包含1号点的最小环的顶点数,如果不存在,输出-1。2<=N<=2E5,1<=M<=2E5分析:bfs求最小环。#include<bits/stdc++.h>usingi64=longlong;voidsolve(){ intN,M; std::cin>>N>>M; std::vector<std::vector<int>>adj(N); fo......
  • abc376E Max x Sum
    有序列A[N]和B[N],选出一组大小为K的下标,让A[i]的最大值乘以(B[i]之和)的结果最小,求最小值。1<=T<=2E5,1<=K<=N<=2E5,1<=A[i],B[i]<=1E6分析:因为A[i]跟B[i]要同步选,因此对下标排序,然后枚举每个A[i]作为最大值,从B[i]中选出最小的K个求和,得到结果,B[i]之和可以用堆来维护。#inclu......
  • abc376B Hands on Ring (Easy)
    由1~N的块构成的环,最初左手在1号、右手在2号,接下来有Q组操作{H,T},H可以是L或者R,分别表示左手和右手,T是目标位置,移动时要求左右手不能在同一个块上。3<=N<=100,1<=Q<=100分析:模拟,关键在于如何判断是顺时针移动还是逆时针移动。#include<bits/stdc++.h>usingi64=longlong......
  • Atcoder Library 配置入门
    配置首先,你需要在这个blog里面下载AtcoderLibrary的压缩包。可以发现里面有三堆东西,一个python程序,两种语言的document,还有一个库文件夹。把库文件夹直接拖到你的编译器库文件相同目录下。Mingw的路径应该都是\lib\gcc\x86_64-w64-mingw32\8.1.0\include\c++,如果不是......
  • Atcoder Beginner Contest 376
    新猫ΛΛ__/(*゚ー゚)/\/| ̄UU ̄|\/||/A.CandyButton\(\text{diff}19\)你按一次按钮就会得到一颗糖,如果这次按按钮和上次得到糖的间隔时间小于\(C\)则不会得到糖,给你若干按按钮的时间,问能得到多少糖intn,c;inta[1000001];signedmain(){cin>>n>>......