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

AtCoder Beginner Contest 368

时间:2024-08-28 16:17:39浏览次数:9  
标签:AtCoder Beginner int scanf mxn ++ solve 368 ans


A - Cut

题意

签到题

思路

代码

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

void solve()
{
    int n, k;
    scanf("%d%d", &n, &k);
    vector<int> v(n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &v[i]);
    }
    for (int i = n - k; i < n; i++)
    {
        printf("%d ", v[i]);
    }
    for (int i = 0; i < n - k; i++)
    {
        printf("%d ", v[i]);
    }
}

int main()
{
    int T = 1;
    // scanf("%d", &T);
    while (T--)
    {
        solve();
    }

    return 0;
}


B - Decrease 2 max elements

题意

签到题

思路

数据很小,直接模拟。
其实是一个很经典的贪心算法,算的就是每次任意选两个正数减 1,最多能减多少次,而这个问题的答案就是min(sum / 2, sum - maxn)。

代码一

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

const int mxn = 1e6 + 5;


void solve()
{
	int n;
	scanf("%d", &n);
	vector<int> v(n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &v[i]);
	}
	int ans = 0;
	while (true)
	{
		sort(v.begin(), v.end(), greater<int>());
		if (v[1] <= 0)
		{
			break;
		}
		v[0]--;
		v[1]--;
		ans++;
	}
	printf("%d", ans);
}


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

	int T = 1;
	//scanf("%d", &T);
	while (T--)
	{
		solve();
	}

	return 0;
}

代码二

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

const int mxn = 1e6 + 5;


void solve()
{
	int n, sum = 0, maxn = -1;
	scanf("%d", &n);
	vector<int> v(n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &v[i]);
        sum += v[i];
        maxn = max(maxn, v[i]);
	}
	
	printf("%d", min(sum / 2, sum - maxn));
}


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

	int T = 1;
	//scanf("%d", &T);
	while (T--)
	{
		solve();
	}

	return 0;
}

C - Triple Attack

题意

n个人,第i个人的血量是h_i,t从0开始计数,每次操作t++,t是3的倍数扣3点血,否则扣1点血。求使所有人血量<=0的操作数。

思路

每3次为一循环,每轮循环扣5点血,超出一次循环的部分可以直接计算,剩下的至多模拟2次即可。

代码

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

const int mxn = 1e6 + 5;

void solve()
{
	int n;
	scanf("%lld", &n);
	vector<int> v(n);
	for (int i = 0; i < n; i++)
	{
		scanf("%lld", &v[i]);
	}
	int ans = 0;
	for (int i = 0; i < n; i++)
	{
		ans += v[i] / 5 * 3;
		v[i] %= 5;
		while (v[i] > 0)
		{
			ans++;
			v[i] -= (ans % 3 ? 1 : 3);
		}
	}
	printf("%lld", ans);
}


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

	int T = 1;
	//scanf("%lld", &T);
	while (T--)
	{
		solve();
	}

	return 0;
}

D - Minimum Steiner Tree

题意

给定一棵n条边的树,以及k个点,删点删边使得剩下的点中包含所给的k个点,问剩下结点数的最小值。

思路

从一个要保留的点出发,以各最终要保留点为根分治每颗子树,将各自要保留的点数相加。
(感觉树的题大部分是dfs?

标签:AtCoder,Beginner,int,scanf,mxn,++,solve,368,ans
From: https://www.cnblogs.com/Seii/p/18384824

相关文章

  • ABC368
     D树从叶子到根,对于某个点,如果其子树不存在需要的点,那么这个点和它的父亲所连的边,自然不需要,否则需要。有一个问题,比如需要点2、4、5,那么点1和点2所连的边也算进去了。实际上,到了它们的LCS(最大公共祖先)后,这些边就不用算了。用一个变量统计当前遍历过多少需要的点,如果所有需要......
  • AtCoder Beginner Contest 052
    A-TwoRectangles#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios::sync_with_stdio(false),cin.tie(nullptr); intA,B,C,D; cin>>A>>B>>C>>D; cout<<max(A*B,C*D); ......
  • AtCoder Beginner Contest 051
    A-Haiku直接模拟。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios::sync_with_stdio(false),cin.tie(nullptr); strings; cin>>s; stringa,b,c; a=s.substr(0,5); b=s.substr(6,7); c=s.substr(......
  • ABC368G
    前言最简单的一次,终于AK了ABC,纪念一下。思路看到题目中有一句加粗的话入力で与えられるタイプ$3$のクエリの答えは$10^{18}$以下であることが保証されています。翻译出来是对于所有操作\(3\),答案不超过\(10^{18}\)。首先,\(a_i\)一定不会是\(0\),考虑一种情况,......
  • Hitachi Vantara Programming Contest 2024(AtCoder Beginner Contest 368)题解A~D
    A-Cut题意:将数组的后k个字符移到前面思路:可以用rotate()函数让数组中的元素滚动旋转rotate(v.begin(),v.begin()+n-k,v.end());直接输出后k个元素,再输出前n-k个元素for(inti=n-k;i<n;i++)write(v[i]);for(inti=0;i<n-k;i++)write(v[i]);B-Decrease2......
  • AtCoder ABC 368题解
    前言本题解部分思路来自于网络。A-Cut题目大意有\(n\)张卡片叠在一起,从上到下给出\(n\)卡片的编号,将\(k\)张卡片从牌堆底部放到顶部后,从上到下输出卡片的编号。解题思路按照题意模拟即可。code#include<bits/stdc++.h>usingnamespacestd;inta[105];intmai......
  • AtCoder Beginner Contest 368(ABC368)
    [ABC368F]DividingGame题意:有\(n\)堆石子,第\(i\)堆有\(a_i\)颗石子,每次可以拿走任意一堆石子数量任何数量的棋子,但是要保证拿走之后该堆的石子数量为原来的约数(不能不拿)。问是先手必胜还是后手必胜。\(n,a_i\le10^5\)。思路:发现与Nim游戏类似,且全局信息公开,状态......
  • ABC368
    A.Cut模拟代码实现#include<bits/stdc++.h>#definerep(i,n)for(inti=0;i<(n);++i)usingnamespacestd;intmain(){intn,k;cin>>n>>k;vector<int>a(n);rep(i,n)cin>>a[i];r......
  • Hitachi Vantara Programming Contest 2024(AtCoder Beginner Contest 368)- C
    题意概述有\(N\)个数,分别为\(H_1,H_2,H_3……H_N\)。你将使用初始化为\(0\)的变量\(T\)重复以下操作,直到所有数的值都变为\(0\)或更少。将\(T\)增加\(1\)。然后,减少最前方\(H_i\)值大于等于\(1\)的值。如果\(T\)是\(3\)的倍数,\(H_i\)的值会减少\(3\);......
  • ATcoder368D题详解
    D题传送门一道很无脑的题,但考试没写出来爆搜首先看朴素算法1.从根节点开始遍历每个节点2.遇到要保存的节点就进行标记,直到所有保存节点都标记时间复杂度\(O(n)\)其实已经能过了,但我没用(doge)树链剖分(LCA)首先分析1.每一次砍掉枝叶,都是在没有要保存的节点存在子树上时2.......