首页 > 其他分享 >AtCoder Beginner Contest 187 A~D 题解

AtCoder Beginner Contest 187 A~D 题解

时间:2024-09-08 20:52:27浏览次数:4  
标签:AtCoder le 输出 int 题解 样例 187 include 10

A - Large Digits

题目大意

给定两个三位整数\(A\)和\(B\),求它们数位和的最大值。
数位和:例如,\(123\)的数位和是\(1+2+3=6\)。

\(100\le A,B\le 999\)

输入格式

\(A~~B\)

输出格式

一行,即\(A\)和\(B\)数位和的最大值。

样例

输入 输出
123 234 9
593 953 17
100 999 27

分析

直接按题目照做即可。

代码

#include <cstdio>
#include <algorithm>
using namespace std;

int main(int argc, char** argv)
{
	char a[10], b[10];
	scanf("%s%s", a, b);
	int as = 0, bs = 0;
	for(int i=0; a[i]; i++)
		as += a[i] - '0';
	for(int i=0; b[i]; i++)
		bs += b[i] - '0';
	printf("%d\n", max(as, bs));
	return 0;
}

B - Gentle Pairs

题目大意

有\(N\)个点,每个点的坐标是\((x_i,y_i)\),\(x\)坐标互不相同。
有多少对符合“\(-1\le斜率\le1\)”的点?

\(1\le N\le 10^3\)
\(|x_i|,|y_i|\le 10^3\)
\(x_i \ne x_j\) (\(i < j\))

输入格式

\(N\)
\(x_1~y_1\)
\(\vdots\)
\(x_n~y_n\)

输出格式

输出答案。

样例

样例输入1

3
0 0
1 2
2 1

样例输出1

2

有三个点\((0,0)\)、\((1,2)\)、\((2,1)\)。

有\(2\)对符合条件的点。

样例输入2

1
-691 273

样例输出2

0

只有\(1\)个点,无法组成对,输出\(0\)。

样例输入3

10
-31 -35
8 -36
22 64
5 73
-14 8
18 -58
-41 -85
1 -88
-21 -85
-11 82

样例输出3

11

分析

\((x_1,y_1)\)到\((x_2,y_2)\)的斜率是\(\frac{y_1-y_2}{x1-x2}\)。
推理过程:

\[-1 \le \frac{y_1-y_2}{x_1-x_2} \le 1 \]

\[|\frac{y_1-y_2}{x_1-x_2}| \le 1 \]

\[\frac{|y_1-y_2|}{|x_1-x_2|}\le 1 \]

为了防止浮点数精度误差,我们继续:

\[|y_1-y_2|\le|x1-x2| \]

这时,就可以写代码了。

代码

枚举所有对点即可。

#include <cstdio>
#include <cmath>
#define maxn 1005
using namespace std;
 
int x[maxn], y[maxn];
 
inline bool slope_check(int x1, int y1, int x2, int y2)
{
	int dx = abs(x1 - x2), dy = abs(y1 - y2);
	return dy <= dx;
}
 
int main(int argc, char** argv)
{
	int n, cnt = 0;
	scanf("%d", &n);
	for(int i=0; i<n; i++)
		scanf("%d%d", x + i, y + i);
	for(int i=0; i<n-1; i++)
		for(int j=i+1; j<n; j++)
			if(slope_check(x[i], y[i], x[j], y[j]))
				cnt ++;
	printf("%d\n", cnt);
	return 0;
}

C - 1-SAT

题目大意

给你\(N\)个字符串\(S_1,S_2,...,S_N\)。每个字符串都由小写字母组成,前面有至多\(1\)个!
找到\(S_1,S_2,...,S_N\)中任意一个字符串,使\(S\)中出现了“!+这个字符串”(没有引号)。如果没有符合条件的字符串,输出satisfiable

\(1\le N\le 10^5\)
\(1\le |S_i|\le 10\)

输入格式

\(N\)
\(S_1\)
\(\vdots\)
\(S_N\)

输出格式

如果有符合条件的字符串,输出任意一个;
否则,输出satisfiable

样例

样例输入1

6
a
!a
b
!c
d
!d

样例输出1

a

\(S_1\)为a,\(S_2\)为!a,所以\(S_1\)符合条件;
\(S_5\)为d,\(S_6\)为!d,所以\(S_5\)也符合条件,输出d也会被判为正确。

样例输入2

10
red
red
red
!orange
yellow
!blue
cyan
!green
brown
!gray

样例输出2

satisfiable

没有符合条件的字符串。

分析

如果暴力去枚举两个字符串(如,a!a),需要两重循环,复杂度为\(\mathcal O(N^2)\)(由于字符串太短可以忽略字符串比较),这里\(N\)最大为\(10^5\),所以,枚举法不可用。
我们再考虑\(\mathcal O(n\log n)\)。
可以每次输入字符串时判断一下,如果它以!开头将它的!后面的内容放入set中,否则将整个字符串放入vector中。最后,循环遍历vector(\(\mathcal O(n)\)),每次在set中查找这个字符串(\(\mathcal O(\log n)\))。总时间复杂度为\(\mathcal O(n\log n)\)。

代码

#include <iostream>
#include <set>
#include <string>
#include <vector>
using namespace std;

vector<string> v;
set<string> s;

int main(int argc, char** argv)
{
	ios::sync_with_stdio(false); cin.tie(0);
	int n;
	cin >> n;
	while(n--)
	{
		string x;
		cin >> x;
		if(x[0] == '!')
			s.insert(x.substr(1));
		else v.push_back(x);
	}
	for(int i=0; i<v.size(); i++)
		if(s.find(v[i]) != s.end())
		{
			cout << v[i] << endl;
			return 0;
		}
	cout << "satisfiable\n";
	return 0;
}

D - Choose Me

题目大意

题目大意略,请自行前往AtCoder查看。
数据范围:
\(1\le N\le 10^5\)
\(1\le A_i,B_i\le 10^9\)

输入格式

\(N\)
\(A_1~B_1\)
\(\vdots\)
\(A_N~B_N\)

输出格式

输出答案。

样例

样例输入1

4
2 1
2 2
5 1
1 3

样例输出1

1

Takahashi在第三个城市演讲后,AokiTakahashi将分别得到\(5\)和\(6\)个投票。

样例输入2

5
2 1
2 1
2 1
2 1
2 1

样例输出2

3

在任意三个城市演讲后,AokiTakahashi将分别得到\(4\)和\(9\)个投票。

样例输入3

1
273 691

样例输出3

1

分析

换句话说,我们的目的就是使得AokiTakahashi的票数差距逐渐减少。
最开始,票数的差距是Aoki票数的和,也就是\(\sum\limits_{i=1}^nA_i\)。
每去第\(i\)个城市,差距减少\(2A_i+B_i\),因此,我们可以贪心地先前往差距减少多的城市。这一点可以用数组+排序setpriority_queue三种方法实现(我选择的是priority_queuesetpriority_queue更快一些)。

代码

注意:一定不能忘记使用long long!!!

#include <cstdio>
#include <queue>
using namespace std;

typedef long long LL;

priority_queue<LL> q;

int main(int argc, char** argv)
{
	int n;
	scanf("%d", &n);
	LL diff = 0;
	while(n--)
	{
		LL ao, ta;
		scanf("%lld%lld", &ao, &ta);
		diff += ao;
		q.push(ao + ao + ta);
	}
	int ans = 0;
	while(!q.empty())
	{
		ans ++;
		if((diff -= q.top()) < 0)
		{
			printf("%d\n", ans);
			return 0;
		}
		q.pop();
	}
	return 0;
}

标签:AtCoder,le,输出,int,题解,样例,187,include,10
From: https://www.cnblogs.com/stanleys/p/18403446/abc187

相关文章

  • AtCoder Beginner Contest 173 A~D 题解
    A-Payment题目大意如果使用价值\(1000\)元的纸币(假设有)支付\(N\)元,服务员会找多少钱?\(1\leN\le10000\)输入格式\(N\)输出格式一行,即服务员找的钱数。样例输入输出190010030000分析特判:如果\(N\)除以\(1000\)能整除,那么不需要找钱,输出\(0\);如果......
  • Panasonic Programming Contest 2020 C (Sqrt Inequality) 题解
    题目大意输入三个整数\(a\),\(b\),\(c\),如果\(\sqrta+\sqrtb<\sqrtc\)成立,输出Yes,否则输出No。样例输入#1239输出#1No\(\sqrt2+\sqrt3<\sqrt9\)不成立。输入#22310输出#2Yes\(\sqrt2+\sqrt3<\sqrt10\)成立。分析错误思路首先,由......
  • AtCoder Beginner Contest 188 A~D 题解
    A-Three-PointShot题目大意有两个球队,分别得到\(X\)分和\(Y\)分,问得分较少的球队能否在获得三分后超越对方。\(0\leX,Y\le100\)\(X\neY\)\(X\)和\(Y\)都是整数。输入格式\(X~Y\)输出格式如果能,输出Yes;否则,输出No。样例XY输出35Yes分析这个不用......
  • AtCoder Beginner Contest 161D 题解
    原题链接:洛谷链接;AtCoder链接思路每次根据上一位,计算下一位为TA-1/TA/TA+1,放入queue中,最后输出第\(K\)次弹出的整数。注意事项不用longlong会WA!上一位为\(0\)时下一位不能为\(-1\)!(要特判)上一位为\(9\)时下一位不能为\(10\)!(也要特判)代码#include<cstdio>#include<que......
  • CodeForces Round #621 ABC (1307A+1307B+1307C) 题解
    A.CowandHaybales题面TheUSAConstructionOperation(USACO)recentlyorderedFarmerJohntoarrangearowofnhaybalepilesonthefarm.The\(i\)-thpilecontains\(a_i\)haybales.However,FarmerJohnhasjustleftforvacation,leavingBessieal......
  • 2024CCPC网络赛题解
    前言开局掉线30min比较搞心态,不过比赛延迟了1个小时,但是后面也一直没过题,如果时间再少点可能排名还更好看。最后是8题前面,这里简单讲一下我有写的题,队友写的题就放一下队友的赛时代码,大家自己看看吧。B队友写的,签到,但是数据范围\(n\)给\(10^3\)给队友整不自信了,因为答案的......
  • AT_dwacon6th_prelims_c Cookie Distribution 题解
    组合意义保平安。思路发现\(\prod\)的贡献不好统计。我们可以考虑\(\prod\)的组合意义。容易发现:\[\prodc_i=\prod\sum_{j=1}^{c_i}1\]那么依照分配律,我们发现这个东西的组合意义是每个人从获得的饼干中选一个出来的方案。这样就会变好统计很多。设\(dp_{i,j}\)为......
  • CF1534F2 Falling Sand (Hard Version) 题解
    题目链接点击打开链接题目解法做法1一个沙子消失,会带走所有它所在列下面的沙子我们记每列从下往上第\(a_i\)个沙子为关键点,第\(i\)列至少消失\(a_i\)个沙子等价于所有关键点都消失一个显然的事情是:记一列最上面的沙子为起始点,则我们只会干扰起始点第一感觉是找到一......
  • LOJ4218 「IOI2024」尼罗河船运 题解
    题目描述有\(n\)件手工艺品,第\(i\)件重量为\(w_i\),有参数\(a_i\)和\(b_i\)。每艘船最多可以运输两件手工艺品:如果只运输第\(i\)件,重量没有要求,代价为\(a_i\)。如果同时运输第\(i\)和第\(j\)件,要求\(|w_i-w_j|\leD\),代价\(b_i+b_j\)。\(q\)次询问,给......
  • Leetcode第 414 场周赛题解
    Leetcode第414场周赛题解Q1.将日期转换为二进制表示给你一个字符串date,它的格式为yyyy-mm-dd,表示一个公历日期。date可以重写为二进制表示,只需要将年、月、日分别转换为对应的二进制表示(不带前导零)并遵循year-month-day的格式。返回date的二进制表示。解法:STL一......