C++
编写。
输入一个英文字母 a a a,判断它是大写还是小写。
a a a
如果 a a a为小写,输出a
;
如果 a a a为大写,输出A
。
B
A
B
为大写,所以输出A
。
a
a
a
为小写,所以输出a
。
#include
using namespace std;
int main(int argc, char** argv)
{
char a = getchar();
if('a' <= a && a <= 'z') putchar('a');
else putchar('A');
return 0;
}
给定一个长度为 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 1≤K≤N≤1000
1 ≤ p i ≤ 1000 1\le p_i\le 1000 1≤pi≤1000 ( 1 ≤ i ≤ N 1\le i\le N 1≤i≤N)
N K N K NK
p 0 p 1 p 2 p 3 . . . p N p_0~p_1~p_2~p_3~...~p_N p0 p1 p2 p3 ... pN
一行,即最小的和。
5 3
50 100 80 120 80
最小的和是 50 + 80 + 80 = 210 50+80+80=210 50+80+80=210。
210
B
为大写,所以输出A
。
1 1
1000
1000
因为只有一个数,所以最小的和就是 1000 1000 1000。(此注释为笔者所加)
题目要求和最小,其实只要找到数组中最小的 K K K个数字的和即可。可以使用
库中的sort()
函数对p
数组进行升序排序,再取前 K K K个数字之和作为结果输出。
#include
#include
#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;
}
有 1000000000000001 1000000000000001 1000000000000001只狗,它们的名字分别为:
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 ≤ 1000000000000001 1\le N\le 1000000000000001 1≤N≤1000000000000001
N N N
一行,即第 N N N只狗的名字。
样例较多,为了节省文章篇幅,所以直接整合成表格:
输入 | 输出 |
---|---|
2 | b |
27 | aa |
123456789 | jjddja |
其实就是把十进制转换成二十六进制:
#include
#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;
}
有一个数组 A 1 , A 2 , . . . , A N A_1, A_2, ..., A_N A1,A2,...,AN。
执行如下 Q Q Q个操作:
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 1≤N,Q,Ai,Bi,Ci≤105 ( 1 ≤ i ≤ N 1\le i\le N 1≤i≤N)
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
4
1 2 3 4
3
1 2
3 4
2 4
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} |
4
1 1 1 1
3
1 2
2 1
3 5
注意: B i B_i Bi不一定存在列表中。
8
4
4
2
1 2
3
1 100
2 100
100 1000
102
200
2000
可以使用动态规划的思想,用数组记录 A A A中每个值出现的次数。这里由于题目原因,还需要记录数组 A A A每个数之和。
#include
#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;
}