首页 > 其他分享 >AtCoder Beginner Contest 281 (A-D)

AtCoder Beginner Contest 281 (A-D)

时间:2022-12-18 13:14:05浏览次数:44  
标签:AtCoder prev Beginner int ll 281 include sum dp

A

题意:输入一个整数,输出(n + 1)行,从n一直输出到0.

解法/思路:一个循环完事儿。

代码:

#include <iostream>
using namespace std;
int main() {
	int n;
	cin >> n;
	for (int i = n; i >= 0; --i) {
		cout << i << endl;
	}
	return 0;
}

 

B

题意:判断字符串s是否满足以下条件:

·总长度为8

·第1个和第8个字符均为大写字母

·第2-7个字符的组合为一个不含前导0的六位整数

解法/思路:简单的if判断即可。

代码:

#include <iostream>
#include <string>
using namespace std;
int main() {
	string s;
	cin >> s;
	int len = s.length();
	if (len == 8 && 65 <= s[0] && s[0] <= 90 && 65 <= s[7] && s[7] <= 90 && 49 <= s[1] && s[1] <= 57) {
		for (int i = 2; i <= 6; ++i) {
			if (s[i] <= 47 || s[i] >= 58) {
				cout << "No";
				return 0;
			}
		}
		cout << "Yes";
	} else {
		cout << "No";
	}
	return 0;
}

 

C

题意:歌单总共包含n首歌,每首歌的播放时间为ai列表循环播放,问经过时间t后播放到第几首歌的什么时间点。

解法/思路:先统计出播放整个歌单所需时间sum,t模等于sum,就可以消去循环歌单的时间,最后从第一首个开始逐个减去每首歌的时长,终止条件为t <= ai,即结束时播放到第i首歌。

代码:

#include <iostream>
using namespace std;
#define ll long long
ll a[100005];
int main() {
	ll n, t;
	ll sum = 0;
	cin >> n >> t;
	for (ll k = 1; k <= n; ++k) {
		cin >> a[k];
		sum += a[k];
	}
	t %= sum;
	ll p = 1;
	while (t > a[p]) {
		t -= a[p];
		++p;
	}
	cout << p << ' ' << t;
	return 0;
}

 

D

题意:在有n个数的数组中取出k个数,求出当这k个数的和s为d的倍数时最大的s。

解法/思路:暴力枚举显然会超时,所以考虑动态规划。用dp[x][y][z]表示在前x个数中取y个数,其和s模d等于z时的最大的s,答案为dp[n][k][0]。对于每个a[x],都有取或不取两种情况。若不取,则dp[x][y][z] = dp[x - 1][y][z]。若取,则dp[x][y][z] = dp[x - 1][y - 1][prev] + a[x]。其中prev = ((z - a[x]) % d + d) % d,这样就能保证prev一定在[0, d - 1]范围内。需要注意的是,若dp[x - 1][y - 1][prev] = -1,则该"状态"是不可达的,令dp[x][y][z] = dp[x - 1][y - 1][prev] + a[x]显然不符合逻辑。

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
ll a[105];
ll dp[105][105][105];
int main() {
	ll n, k, d;
	scanf("%lld %lld %lld", &n, &k, &d);
	for (ll i = 1; i <= n; ++i) {
		scanf("%lld", &a[i]);
	}
	memset(dp, -1, sizeof(dp));
	dp[0][0][0] = 0;
	for (ll x = 1; x <= n; ++x) {
		for (ll y = 0; y <= min(x, k); ++y) {
			for (ll z = 0; z <= d - 1; ++z) {
				dp[x][y][z] = dp[x - 1][y][z];
				ll prev = ((z - a[x]) % d + d) % d;
				if (dp[x - 1][y - 1][prev] != -1 && y > 0) {                    // 注意这里的判断条件
					dp[x][y][z] = max(dp[x][y][z], dp[x - 1][y - 1][prev] + a[x]);
				}
			}
		}
	}
	printf("%lld", dp[n][k][0]);
	return 0;
}

 

标签:AtCoder,prev,Beginner,int,ll,281,include,sum,dp
From: https://www.cnblogs.com/xbai2/p/16988924.html

相关文章

  • AtCoder Beginner Contest 280 (A-D)
    本人第一次写博客,若有不足还望指出(•̀ω•́)✧A题意:输入一个H行W列的字符矩阵,统计'#'的个数。解法/思路:挺简单的,直接贴代码吧。代码:#include<iostream>#incl......
  • HHKB Programming Contest 2022 Winter(AtCoder Beginner Contest 282)
    前言好久没有打AtCoder了。有点手生。只拿到了\(\operatorname{rk}1510\),应该上不了多少分。只切了\(\texttt{A,B,C,D}\)四题。A-GeneralizedABC简要题意给出......
  • Android平台GB28181设备接入模块摄像头采集方向不对怎么办?
    技术背景我们在做Android平台GB28181设备接入模块的时候,有开发者提到这样的诉求:他们的智能头盔、执法记录仪等设备,采集到的图像,是旋转了90、180甚至270°的,设备本身无法针对......
  • AtCoder Regular Contest 143 E Reversi
    AtCoder传送门洛谷传送门翻转一个点会把它相邻的点全部翻转,因此先从叶子开始自下而上考虑。不难发现,如果这个叶子是白色,那么它一定比它的父亲先翻转(否则它就翻不了了);而......
  • AtCoder Regular Contest 150 F Constant Sum Subsequence
    AtCoder传送门洛谷传送门定义\(\mathrm{nxt}(i,x)\)为最小的\(j\)满足\(a_j=x\)且\(j>i\),\(\mathrm{pre}(i,x)\)为最大的\(j\)满足\(a_j=x\)且\(j<......
  • atcoder beginner 281 DEFG 题解
    比赛链接:https://atcoder.jp/contests/abc281题解:D\(dp[i][j][k]\)表示考虑到第i个数,集合加入了\(k\)个数,余数为\(j\)的答案转移即可//bySkyRainWind#inclu......
  • AtCoder Beginner Contest 281
    A-CountDown(abc281a)题目大意给定\(n\),输出\(n\)到\(1\)。解题思路直接输出即可。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=l......
  • atcoder beginner contest 144 Gluttony(二分答案)
    题目大意:有an,bn,我们找到an和bn每个元素的一种一一对应关系。使得min(max(ai*bi))。已知我们可以进行操作让an中的任一个元素减少1。操作数最大为k,问我们怎么操作,可以min(......
  • [ABC281F] Xor Minimization
    divclass="part">ProblemStatementYouaregivenasequenceofnon-negativeintegers$A=(a_1,\ldots,a_N)$.Letusperformthefollowingoperationon$A$just......
  • atcoder ABC 281(A-C)
    A要求你从N开始,一直打印到0。NN-1......3210简单#include<iostream>usingnamespacestd;intn;intmain(){ cin>>n; for(inti=n;i>=0;i--)cout<<i<<en......