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

AtCoder Beginner Contest 048

时间:2024-08-22 22:05:13浏览次数:11  
标签:AtCoder Beginner int sum cin long i64 048 using

A - AtCoder *** Contest

先输出首字母,然后遍历字符串,遇到空格就输出后面的第一个字符。

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	string s;
	getline(cin, s);
	cout << s[0];
	for (int i = 0; i < s.size(); i++) {
		if (s[i] == ' ') cout << s[i + 1];
	}
	return 0;
}

B - Between a and b ...

如果暴力来做的话肯定会超时。问 \([a,b]\) 之间有多少数可以整除 \(x\),考虑计算 \(x\) 的倍数 \(k\)。分别用 \(a\) 除以 \(x\) 上取整、\(b\) 除以 \(x\)(自然下取整)分别得到 \(k_1\)、\(k_2\),则 \(k_1x\)、\(k_2x\) 是 \([a,b]\) 之间的两个数且能整除 \(x\)。答案即为 \(k_2-k_1+1\).

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	i64 a, b, x;
	cin >> a >> b >> x;
	i64 k1 = (a + x - 1) / x, k2 = b / x;
	cout << k2 - k1 + 1;
	return 0;
}

C - Boxes and Candies

简单贪心。对于相邻的两个箱子,肯定优先吃右边箱子的糖果,因为其可以兼顾左边和右边。

首先需要注意的是 \(a[i]+a[i-1]\) 有可能爆 \(\rm int\),需要开 \(\rm long\) \(\rm long\)。

一开始的做法:WA 了最后四个点。

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int N, x;
	cin >> N >> x;
	vector<int> a(N);
	for (int i = 0; i < N; i++) cin >> a[i];
	i64 ans = 0;
	for (int i = 1; i < N; i++) {
		i64 sum = a[i] + a[i - 1];
		if (sum > x) {
			i64 t = sum - x;
			a[i] -= t;
			ans += t;
		}
	}
	cout << ans;
	return 0;
}

这里犯的错误在于,\(a[i]+a[i-1]\) 比 \(x\) 多出的那一块,\(a[i]\) 不一定够减的,这时就需要将 \(a[i-1]\) 也减去。

代码:

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int N, x;
	cin >> N >> x;
	vector<int> a(N);
	for (int i = 0; i < N; i++) cin >> a[i];
	i64 ans = 0;
	for (int i = 1; i < N; i++) {
		i64 sum = a[i] + a[i - 1];
		if (sum > x) {
			i64 t = sum - x;
			if (a[i] >= t) {
				a[i] -= t;
				ans += t;
			} else {
				a[i] = 0;
				a[i - 1] -= (t - a[i]);
				ans += t;
			} 
		}
	}
	cout << ans;
	return 0;
}

D - An Ordinary Game

思维题。

我们发现:当删除到无法删除时,字符串一定是这样的:\(abababab...abab\),即字符串中出现且只出现两种不同的字符,且所有奇数下标位置上的字符相同,所有偶数下标位置上的字符相同,即奇偶交替出现(或只剩两个,但也可以看作这种情况)

哪方操作后率先出现这样的死局,哪方先获胜。当字符串长度为奇数时,首尾字符下标均为奇数,若首尾字符不同则最后一定无法在己方形成死局,己方获胜。反之,当字符串长度为偶数且首尾字符不同时,我做了一步操作之后对方进入必胜态。

当首尾字符相同时,如果字符串长度为奇数我方必败(形成死局),反之则胜。

#include <bits/stdc++.h>

using namespace std;
using i64 = long long;

int main() {
	ios::sync_with_stdio(false), cin.tie(nullptr);
	string s;
	cin >> s;
	int n = s.size();
	if ((n % 2 == 1 && s[0] != s[n - 1]) || (n % 2 == 0 && s[0] == s[n - 1])) cout << "First";
	else cout << "Second";
	return 0;
}

标签:AtCoder,Beginner,int,sum,cin,long,i64,048,using
From: https://www.cnblogs.com/pangyou3s/p/18374849

相关文章

  • Atcoder Beginner Contest 365
    AtcoderBeginnerContest365A题意输入年份,输出该年份天数。思路略B题意输入一个序列,输出该序列次大值的位置。思路略C题意给定\(N\),序列\(A\)和\(M\)。求满足下条件的\(x\)最大值。\[\sum_{i=1}^{n}\min(x,A_i)\leM\]思路式子左边有单调性,二分\(x\)......
  • AtCoder Beginner Contest 047
    A-FightingoverCandies简单排序。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios::sync_with_stdio(false),cin.tie(nullptr); vector<int>a(3); cin>>a[0]>>a[1]>>a[2]; sort(a.begi......
  • AtCoder Beginner Contest 367
    A-ShoutEveryday思路:水题一道,模拟即可。B-Cut.0思路:直接cin和cout即可,c++输入输出性质。C-EnumerateSequences思路:注意到数据范围很小,因此考虑到搜素所有的序列,然后判断是否合法。D-Pedometer思路:观察到是环上问题,先断环为链,观察题目,可以发现,对于s,它的终......
  • AtCoder Beginner Contest 046
    A-AtCoDeerandPaintCans#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios::sync_with_stdio(false),cin.tie(nullptr); set<int>s; for(inti=0;i<3;i++){ intx; cin>>x; s.inser......
  • [AtCoder - tdpc_game] :ゲーム 题解
    [AtCoder-tdpc_game]:ゲーム题解一道小清新\(dp\)题。定义\(dp_{i,j}\)为第一堆山还有\(i\)个物品,第二堆山还有\(j\)个物品,すぬけ君能取得物品的最大价值。由于只能取两座山最上面的物品,假设当前两座山分别有\({x,y}\)个物品,すぬけ君选后只能有两种情况,分别为\(d......
  • AtCoder ABC 367
    前言本题解部分思路来自于网络,仅供参考。A-ShoutEveryday题目大意给定Takahashi每天的睡觉时间和起床时间,求Takahashi在$A$时是睡着的还是清醒的。解题思路根据题意模拟即可。code#include<bits/stdc++.h>usingnamespacestd;intmain(){inta,b,c;......
  • AtCoder Beginner Contest 367
    题目链接:AtCoderBeginnerContest367总结:发挥很一般,A一直wa。开场有点事,导致D也没debug出来。A.ShoutEverydaytag:模拟Solution:注意\(B>C\)与\(B<C\)的不同情况即可。voidsolve(){  inta,b,c;  cin>>a>>b>>c;  if(c>b){    if(......
  • P2048 [NOI2010] 超级钢琴
    题意在一个数组中选择\(k\)个长度为\([l,r]\)的序列,对每个序列求和,使每个序列的和的和最大。思路首先,我们可以将序列之和转化为前缀和,如果固定左端点\(l\),那么我们只需要在\([l+len_l,l+len_r]\)中寻找最大的右端点,减去\(sum[l-1]\)就是在长度为\([len_l,le......
  • Atcoder [ABC367F] Rearrange Query 题解
    简要题意给定两个长度为\(N\)的序列\(A\)和\(B\)。有\(Q\)个查询,每个查询给定\(l,r,L,R\),其中\(l\leqr,L\leqR\),要求判断\(A\)的第\(l\)项到第\(r\)项构成的集合与\(B\)的第\(L\)项到第\(R\)项构成的集合是否相等。题解显然两个相等的集合所有元素......
  • Atcoder [ABC367C] Enumerate Sequences 题解
    简要题意给定\(n,k\)和\(R_i\),你需要输出所有满足下列条件的整数序列:长度为\(n\)。第\(i\)个元素的范围为\([1,R_i]\)。一个序列的所有元素的总和为\(k\)的倍数。输出请按照按照从左至右按位从小到大的顺序输出。题解注意到数据范围很小,我们可以直接爆搜,这里用......