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

AtCoder Beginner Contest 362

时间:2024-07-29 10:17:43浏览次数:14  
标签:AtCoder Beginner int cin long i64 using 362 dis

AtCoder Beginner Contest 362

前言

vp 的时候出了四题,被 C 题卡了一会,很久才出,D 题是 dijkstra 的板子,改下条件即可,E 题是个计数 dp,这类题一直不怎么擅长,想起之前杭电第一场那个序列立方的题也是类似这种计数 dp,需要加强练习。

A - Buy a Pen (atcoder.jp)

思路

判断两两最小。

代码

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int a, b, c;
	cin >> a >> b >> c;

	string x;
	cin >> x;

	if (x == "Red") cout << min(b, c) << '\n';
	if (x == "Blue") cout << min(a, b) << '\n';
	if (x == "Green") cout << min(a, c) << '\n';

	return 0;
}

B - Right Triangle (atcoder.jp)

思路

根据勾股定理判一下即可,这里坐标都很小,可以不用开方,开方的话还会涉及到精度问题。

代码

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

struct point {
	i64 x;
	i64 y;
} ;

//求两点之间的距离
i64 dis(point p1, point p2) {
	return ((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	point a, b, c;
	cin >> a.x >> a.y >> b.x >> b.y >> c.x >> c.y;
	i64 ab = dis(a, b);
	i64 ac = dis(a, c);
	i64 bc = dis(b, c);
	if ((ab + ac == bc) || (ab + bc == ac) || (ac + bc == ab)) {
		printf("Yes");
	}
	else {
		printf("No");
	}

	return 0;
}

C - Sum = 0 (atcoder.jp)

思路

先累计两边边界的和,记为 \(sum_l\) 和 \(sum_r\) ,如果 \(sum_l>0\) 说明左边取全最小都还是不可能等于 0 ,右边同理,这种特殊处理一下即可。

考虑当 \(sum_l\le 0\) 的时候,那我们只要往右边偏移 \(|sum_l|\) 即可,把小于 0 的那部分用正数来补;右边同理。

代码

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int n;
	cin >> n;

	i64 lsum = 0, rsum = 0;
	vector<array<i64, 2>> node(n);
	for (auto &[x, y] : node) {
		cin >> x >> y;
		lsum += x, rsum += y;
	}

	if (lsum > 0 || rsum < 0) {
		cout << "No\n";
		return 0;
	}

	cout << "Yes\n";

	if (lsum <= 0) {
		i64 now = -lsum;
		for (auto [x, y] : node) {
			if (now) {
				cout << min(x + now, y) << ' ';
				now -= min(x + now, y) - x;
			} else
				cout << x << ' ';
		}
	} else {
		i64 now = rsum;
		for (auto [x, y] : node) {
			if (now) {
				cout << max(x, y - now) << ' ';
				now -= y - max(y - now, x);
			} else
				cout << y << ' ';
		}
	}


	return 0;
}

D - Shortest Path 3 (atcoder.jp)

思路

dijkstra 板子题,只要在判断条件那里增加一个 \(a_v\) 即可。

代码

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int n, m;
	cin >> n >> m;

	vector<int> a(n + 1);
	for (int i = 1; i <= n; i ++)
		cin >> a[i];

	vector g(n + 1, vector<array<int, 2>>());
	for (int i = 0; i < m; i ++) {
		int u, v, w;
		cin >> u >> v >> w;
		g[u].push_back({v, w});
		g[v].push_back({u, w});
	}

	vector<i64> dis(n + 1, LLONG_MAX >> 1);
	priority_queue<pair<i64, i64>, vector<pair<i64, i64>>, greater<>> Q;
	dis[1] = a[1];

	Q.push({dis[1], 1});

	while (Q.size()) {
		auto [_, u] = Q.top();
		Q.pop();

		if (dis[u] < _) continue;

		for (auto [v, w] : g[u]) {
			if (dis[v] > dis[u] + w + a[v]) {
				dis[v] = dis[u] + w + a[v];
				Q.push({dis[v], v});
			}
		}
	}

	for (int i = 2; i <= n; i ++)
		cout << dis[i] << " \n"[i == n];

	return 0;
}

E - Count Arithmetic Subsequences (atcoder.jp)

思路

考虑计数 dp。

设 \(dp_{i,j,k}\) 为长度为 i 的子序列末尾两项为 \(a_j\) 和 \(a_k\) 的方案数。

转移的时候可以枚举倒数第三项来转移:

\[dp_{len,j,k} = dp_{len,j,k}+\sum\limits_{i=len-2}^{j-1}dp_{len-1,i,j}[a_j-a_i=a_k-a_j] \]

代码

// LUOGU_RID: 169183095
#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

constexpr i64 mod = 998244353, N = 300;
i64 dp[N][N][N] {};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    cin >> n;

    vector<int> a(n + 1);
    for (int i = 1; i <= n; i ++)
        cin >> a[i];

    if (n == 1) {
        cout << 1 << '\n';
        return 0;
    }

    vector<int> ans(n + 1);
    ans[1] = n, ans[2] = n * (n - 1) / 2;

    for (int i = 1; i <= n; i ++) {
        for (int j = i + 1; j <= n; j ++) {
            dp[2][i][j] = 1;
        }
    }

    for (int len = 3; len <= n; len ++) {
        for (int j = len - 1; j <= n; j ++) {
            for (int k = j + 1; k <= n; k ++) {
                for (int i = len - 2; i < j; i ++) {
                    if (a[j] - a[i] == a[k] - a[j]) {
                        (dp[len][j][k] += dp[len - 1][i][j]) %= mod;
                    }
                }
                (ans[len] += dp[len][j][k]) %= mod;
            }
        }
    }

    for (int i = 1; i <= n; i ++)
        cout << ans[i] << " \n"[i == n];

    return 0;
}

标签:AtCoder,Beginner,int,cin,long,i64,using,362,dis
From: https://www.cnblogs.com/Kescholar/p/18329496

相关文章

  • Solution - Atcoder ABC280Ex Substring Sort
    对于这种子串问题,且有多个基础串,一个比较直观的想法就是先上个广义SAM。考虑SAM与字典序如何联系上。因为跳\(\operatorname{fail}\)相当于是删除子串的一个前缀,直接这样子明显是不行的,因为跳了\(\operatorname{fail}\)字典序没有一个很直观地表示。但是反过来考虑反串,......
  • Solution - Atcoder ARC114F Permutation Division
    令\(a\)为题目中的\(P\)。首先考虑后手的重排策略是什么。因为\(a\)是个排列,元素互不相同,那么肯定就是按照每一段的第一个数的大小,越大的放在越前面。那么当\(a_1\lek\)的时候,显然先手会把以\(1\simk\)开头来划分段。因为否则存在一个开头\(>k\)的段,后手把其放......
  • AtCoder Beginner Contest 363 题解 A-D(待补充)
    A-PilingUp1.1思路其实就是向上取百位的整,需要增加多少,123则为200-123=177;1.2代码voidsolve(){intn;cin>>n;intt=n/100;cout<<(t+1)*100-n;}B-JapaneseCursedDoll 2.1思路就是判断最少需要多少天,会有大于等于P个人......
  • AtCoder Beginner Contest 363
    比赛地址添加链接描述A-PilingUp算法:模拟题目大意在AtCoder竞赛平台中,用户的等级通过正整数分数表示,并根据分数显示相应数量的^符号。分数与^符号显示的规则如下:当分数在1到99(包括99)之间时,显示一个^。当分数在100到199(包括199)之间时,显示两个^。......
  • AtCoder Beginner Contest 364 补题记录(A~F)
    VP五十八分钟苏童流体。好耶A#defineGLIBCXX_DEBUG#include<iostream>#include<cstring>#include<cstdio>#defineintlonglongconstintN=500100;std::strings[N];signedmain(){intn,cnt=1;scanf("%lld",&n);f......
  • C#(asp.net)二手手机交易平台设计与实现33627-计算机毕业设计项目选题推荐(附源码)
    摘 要信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对二手手机交易平台等问题,对二手手机交易平台进行研究分析,然后开发设计出二手手机交易平台......
  • AtCoder Beginner Contest 364
    A-GluttonTakahashi(abc364A)题目大意给定\(n\)个字符串,问是否有两个相邻的sweet。解题思路遍历判断当前字符串与上一个字符串是否都为sweet即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_......
  • AtCoder Beginner Contest 364 复盘
    AtCoderBeginnerContest364当你发现你的做法假了时,再看看题目的时限和空限,你就有可能发现,你的做法真了。本场口胡出了\(5\)题的正解,但是只写出了\(3\)题。弱弱又智智。A-GluttonTakahashi&B-GridWalk&C-MinimumGlutton签到D-K-thNearest算口胡出半......
  • AtCoder Beginner Contest 362
    题目链接:AtCoderBeginnerContest362A.BuyaPentag:签到B.RightTriangletag:模拟C.RightTriangletag:贪心Description:给定\(n\)对整数\(l_i,r_i\);求一个整数序列,满足\(l_i<=x_i<=r_i\),且\(\sum_{i}^{n}x_i=0\);如果没有则输出\(-1\)。Solution:先判断是否有解,令......
  • AtCoder Beginner Contest 363
    上周去玩了(逃A-PilingUp(abc363A)题目大意给定分数,问晋级还差多少分。分别到\(100,200,300\)分能晋级。解题思路找到第一个大于当前分数的,其差即为答案。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){io......