AtCoder Beginner Contest 171 A~D题解

46 篇文章 7 订阅
43 篇文章 5 订阅


注:本文中代码均使用 C++编写。

A - αlphabet

题目大意

输入一个英文字母 a a a,判断它是大写还是小写。

输入格式

a a a

输出格式

如果 a a a为小写,输出a
如果 a a a为大写,输出A

样例输入1

B

样例输出1

A

B为大写,所以输出A

样例输入2

a

样例输出2

a

a为小写,所以输出a

代码

#include <cstdio>
using namespace std;

int main(int argc, char** argv)
{
	char a = getchar();
	if('a' <= a && a <= 'z') putchar('a');
	else putchar('A');
	return 0;
}

B - Mix Juice

题目大意

给定一个长度为 N N N的数组 p 1 , p 2 , p 3 , . . . , p N p_1, p_2, p_3, ..., p_N p1,p2,p3,...,pN,要求从其中选出 K K K个数,使它们的和最小。

1 ≤ K ≤ N ≤ 1000 1\le K\le N\le 1000 1KN1000
1 ≤ p i ≤ 1000 1\le p_i\le 1000 1pi1000 ( 1 ≤ i ≤ N 1\le i\le N 1iN)

输入格式

N K N K NK
p 1   p 2   p 3   …   p N p_1~p_2~p_3~\dots~p_N p1 p2 p3  pN

输出格式

一行,即最小的和。

样例输入1

5 3
50 100 80 120 80

最小的和是 50 + 80 + 80 = 210 50+80+80=210 50+80+80=210

样例输出1

210

B为大写,所以输出A

样例输入2

1 1
1000

样例输出2

1000

因为只有一个数,所以最小的和就是 1000 1000 1000。(此注释为笔者所加)

代码

题目要求和最小,其实只要找到数组中最小的 K K K个数字的和即可。可以使用<algorithm>库中的sort()函数对p数组进行升序排序,再取前 K K K个数字之和作为结果输出。

#include <cstdio>
#include <algorithm>
#define maxn 1005
using namespace std;

int a[maxn];

int main(int argc, char** argv)
{
	int n, k, sum = 0;
	scanf("%d%d", &n, &k);
	for(int i=0; i<n; i++)
		scanf("%d", a + i);
	sort(a, a + n);
	for(int i=0; i<k; i++)
		sum += a[i];
	printf("%d\n", sum);
	return 0;
}

C - One Quadrillion and One Dalmatians

题目大意

1000000000000001 1000000000000001 1000000000000001 1 0 15 + 1 10^{15}+1 1015+1)只狗,它们的名字分别为:
a, b, …, z, aa, ab, …, az, ba, bb, …, bz, …, za, zb, …, zz, aaa, aab, …, aaz, aba, abb, …, abz, ., zzz, aaaa, …
问题:第 N N N只狗的名字是什么?

1 ≤ N ≤ 1 0 15 + 1 1\le N\le 10^{15}+1 1N1015+1

输入格式

N N N

输出格式

一行,即第 N N N只狗的名字。

样例

样例较多,为了节省文章篇幅,所以直接整合成表格:

输入输出
2b
27aa
123456789jjddja

代码

其实就是把十进制转换成二十六进制:

#include <cstdio>
#define BASE 26LL
using namespace std;

int main(int argc, char** argv)
{
	char s[12];
	int cnt = 0;
	long long n;
	scanf("%lld", &n);
	while(n > 0)
	{
		n --;
		s[cnt++] = n % BASE + 'a';
		n /= BASE;
	}
	for(int i=cnt-1; i>=0; i--) putchar(s[i]);
	putchar('\n');
	return 0;
}

D - Replacing

题目大意

有一个数组 A 1 , A 2 , … , A N A_1, A_2, \dots, A_N A1,A2,,AN
执行如下 Q Q Q个操作:

  • 在第 i i i个操作中,将数组中所有的 B i B_i Bi替换成 C i C_i Ci
  • 输出操作后 A A A中所有数之和(记为 S i S_i Si)。

1 ≤ N , Q , A i , B i , C i ≤ 1 0 5 1\le N, Q, A_i, B_i, C_i\le 10^5 1N,Q,Ai,Bi,Ci105 ( 1 ≤ i ≤ N 1\le i\le N 1iN)
B i ≠ C i B_i\ne C_i Bi=Ci

输入格式

N N N
A 1   A 2   . . .   A N A_1~A_2~...~A_N A1 A2 ... AN
Q Q Q
B 1   C 1 B_1~C_1 B1 C1
B 2   C 2 B_2~C_2 B2 C2
: : :
B Q   C Q B_Q~C_Q BQ CQ

输出格式

S 1 S_1 S1
S 2 S_2 S2
: : :
S N S_N SN

样例输入1

4
1 2 3 4
3
1 2
3 4
2 4

样例输出1

11
12
16
时间数组 A A A
开始 { 1 , 2 , 3 , 4 } \{1, 2, 3, 4\} {1,2,3,4}
i = 1 i=1 i=1 { 2 , 2 , 3 , 4 } \{2, 2, 3, 4\} {2,2,3,4}
i = 2 i=2 i=2 { 2 , 2 , 4 , 4 } \{2, 2, 4, 4\} {2,2,4,4}
i = 3 i=3 i=3 { 4 , 4 , 4 , 4 } \{4, 4, 4, 4\} {4,4,4,4}

样例输入2

4
1 1 1 1
3
1 2
2 1
3 5

注意: B i B_i Bi不一定存在列表中。

样例输出2

8
4
4

样例输入3

2
1 2
3
1 100
2 100
100 1000

样例输出3

102
200
2000

代码

可以用数组记录 A A A中每个值出现的次数。这里由于题目原因,还需要记录数组 A A A每个数之和。

#include <cstdio>
#define maxn 100005
using namespace std;

typedef long long LL;

int cnt[maxn];
LL sum = 0;

inline LL s(const LL& i)
{
	return cnt[i] * i;
}

int main(int argc, char** argv)
{
	int n, q;
	scanf("%d", &n);
	for(int i=0; i<n; i++)
	{
		int t;
		scanf("%d", &t);
		sum += t;
		cnt[t] ++;
	}
	scanf("%d", &q);
	while(q--)
	{
		int x, y;
		scanf("%d%d", &x, &y);
		sum -= s(x) + s(y);
		cnt[y] += cnt[x];
		cnt[x] = 0;
		sum += s(y);
		printf("%lld\n", sum);
	}
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值