ABC171 A~D
注:本文中代码均使用
C++编写。A - αlphabet
题目大意
输入一个英文字母a aa,判断它是大写还是小写。
输入格式
a aa
输出格式
如果a aa为小写,输出a;
如果a aa为大写,输出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 NN的数组p 1 , p 2 , p 3 , . . . , p N p_1, p_2, p_3, ..., p_Np1,p2,p3,...,pN,要求从其中选出K KK个数,使它们的和最小。
1 ≤ K ≤ N ≤ 1000 1\le K\le N\le 10001≤K≤N≤1000
1 ≤ p i ≤ 1000 1\le p_i\le 10001≤pi≤1000 (1 ≤ i ≤ N 1\le i\le N1≤i≤N)
输入格式
N K N KNK
p 1 p 2 p 3 … p N p_1~p_2~p_3~\dots~p_Np1 p2 p3 … pN
输出格式
一行,即最小的和。
样例输入1
5 3
50 100 80 120 80
最小的和是50 + 80 + 80 = 210 50+80+80=21050+80+80=210。
样例输出1
210
B为大写,所以输出A。
样例输入2
1 1
1000
样例输出2
1000
因为只有一个数,所以最小的和就是1000 10001000。(此注释为笔者所加)
代码
题目要求和最小,其实只要找到数组中最小的K KK个数字的和即可。可以使用<algorithm>库中的sort()函数对p数组进行升序排序,再取前K KK个数字之和作为结果输出。
#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 10000000000000011000000000000001(1 0 15 + 1 10^{15}+11015+1)只狗,它们的名字分别为:
a, b, …, z, aa, ab, …, az, ba, bb, …, bz, …, za, zb, …, zz, aaa, aab, …, aaz, aba, abb, …, abz, ., zzz, aaaa, …
问题:第N NN只狗的名字是什么?
1 ≤ N ≤ 1 0 15 + 1 1\le N\le 10^{15}+11≤N≤1015+1
输入格式
N NN
输出格式
一行,即第N NN只狗的名字。
样例
样例较多,为了节省文章篇幅,所以直接整合成表格:
| 输入 | 输出 |
|---|---|
| 2 | b |
| 27 | aa |
| 123456789 | jjddja |
代码
其实就是把十进制转换成二十六进制:
#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_NA1,A2,…,AN。
执行如下Q QQ个操作:
- 在第i ii个操作中,将数组中所有的B i B_iBi替换成C i C_iCi。
- 输出操作后A AA中所有数之和(记为S i S_iSi)。
1 ≤ N , Q , A i , B i , C i ≤ 1 0 5 1\le N, Q, A_i, B_i, C_i\le 10^51≤N,Q,Ai,Bi,Ci≤105 (1 ≤ i ≤ N 1\le i\le N1≤i≤N)
B i ≠ C i B_i\ne C_iBi=Ci
输入格式
N NN
A 1 A 2 . . . A N A_1~A_2~...~A_NA1 A2 ... AN
Q QQ
B 1 C 1 B_1~C_1B1 C1
B 2 C 2 B_2~C_2B2 C2
: ::
B Q C Q B_Q~C_QBQ CQ
输出格式
S 1 S_1S1
S 2 S_2S2
: ::
S N S_NSN
样例输入1
4
1 2 3 4
3
1 2
3 4
2 4
样例输出1
11
12
16
| 时间 | 数组A AA |
|---|---|
| 开始 | { 1 , 2 , 3 , 4 } \{1, 2, 3, 4\}{1,2,3,4} |
| i = 1 i=1i=1 | { 2 , 2 , 3 , 4 } \{2, 2, 3, 4\}{2,2,3,4} |
| i = 2 i=2i=2 | { 2 , 2 , 4 , 4 } \{2, 2, 4, 4\}{2,2,4,4} |
| i = 3 i=3i=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_iBi不一定存在列表中。
样例输出2
8
4
4
样例输入3
2
1 2
3
1 100
2 100
100 1000
样例输出3
102
200
2000
代码
可以用数组记录A AA中每个值出现的次数。这里由于题目原因,还需要记录数组A AA每个数之和。
#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;
}