记录洛谷刷题C语言QAQ
[CoE R4 A/Stoi2041] 娘子
题目背景
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8M9O8Bqz-1662604640547)(bilibili:BV1fx411N7bU?page=4)]
题目描述
给定两个长度均为 n n n 的 0 0 0, 1 1 1 序列 a a a, b b b,首先,你可以选择一些 a i a_i ai 取反,即 0 0 0 变为 1 1 1, 1 1 1 变为 0 0 0,然后,任意排列序列 a a a。
要求上述过程结束后 a i a_i ai 等于 b i b_i bi,求取反的最少次数。
输入格式
第一行一个正整数 n n n。第二行 n n n 个数字表示序列 a a a。第三行 n n n 个数字表示序列 b b b。
输出格式
一个整数表示答案。
样例 #1
样例输入 #1
3
110
101
样例输出 #1
0
样例 #2
样例输入 #2
5
10010
00100
样例输出 #2
1
提示
样例解释
输入 #1:将 a = 110 a = 110 a=110 重排为 a = 101 a = 101 a=101 即可达到题目要求,故取反的最少次数为 0 0 0。
输入 #2:将 a = 10010 a = 10010 a=10010 的第四位取反(从左往右计数),得 a = 10000 a=10000 a=10000,然后再重排得到 a = 00100 a=00100 a=00100 即可达到题目要求,故取反的最少次数为 1 1 1。
数据规模
- 对于 10 % 10\% 10% 的数据, n = 1 n = 1 n=1;
- 对于另外 20 % 20\% 20% 的数据, b i = 0 b_i = 0 bi=0;
- 对于另外 20 % 20\% 20% 的数据, b i = 1 b_i = 1 bi=1;
- 对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 1 0 3 1 \le n \le 10^3 1≤n≤103, a i ∈ { 0 , 1 } a_i \in \{0, 1\} ai∈{0,1}, b i ∈ { 0 , 1 } b_i \in \{0, 1\} bi∈{0,1}。
代码如下:
C语言
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
int n;
scanf("%d",&n);
char a[n],b[n];
scanf("%s",&a);
scanf("%s",&b);
int a1 = 0, a0 = 0,b1 = 0,b0 = 0;
for(int i = 0;i < n;i++)
{
if(a[i] == '0')
a0++;
else if(a[i] == '0')
a1++;
if(b[i] == '0')
b0++;
else if(b[i] == '1')
b1++;
}
printf("%d\n",abs(a0 -b0));
return 0;
}
C++
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main()
{
int n;
cin >> n;
string a, b;
cin >> a >> b;
int a0 = 0, b0 = 0;
for (int i = 0; i < n; i++)
{
if (a[i] == '0')
a0++;
if (b[i] == '0')
b0++;
}
cout << abs(a0 - b0);
return 0;
}
『JROI-4』淘气的猴子
题目背景
众所周知,jockbutt 是一个可爱的女孩纸。
题目描述
jockbutt 有一个正整数序列,长度为 n n n,分别为 a 1 , a 2 . . . a n a_1,a_2...a_n a1,a2...an,她非常喜欢这个序列,平时都非常爱惜它们。
可是有一天,当 jockbutt 在和你约会的时候,有一只淘气的小猴子改变了这个序列。
猴子操作了 m m m 次。
猴子的操作有两种类型:
- 1 x y \texttt{1 x y} 1 x y 表示第 x x x 个元素加上第 y y y 个元素。
- 2 x y \texttt{2 x y} 2 x y 表示第 x x x 个元素乘上第 y y y 个元素。
特别且显然地,当 x = y x=y x=y,新的 x x x 就等于原来的 x x x 的两倍或平方。
序列最后结果形如 b 1 , b 2 . . . b n b_1,b_2...b_n b1,b2...bn。
等到 jockbutt 回来时,全洛谷的人都在看猴子。 其实 jockbutt 才是他们看的猴子吧 \colorbox{white}{\color{white}{\text{其实 jockbutt 才是他们看的猴子吧}}} 其实 jockbutt 才是他们看的猴子吧
jockbutt 非常生气,希望你能告诉她这个序列最初的形态,也就是 a 1 , a 2 , a 3 , . . . , a n a_1,a_2,a_3,...,a_n a1,a2,a3,...,an,否则她就会嘤嘤嘤…
输入格式
一共有 m + 2 m+2 m+2 行。
第一行输入两个数 n , m n,m n,m。
第二行输入 n n n 个数 b 1 , b 2 . . . b n b_1,b_2...b_n b1,b2...bn,表示经过操作后的序列。
第 3 ∼ m + 2 3\sim m+2 3∼m+2 行每一行输入 3 3 3 个数 k , x , y k,x,y k,x,y ,分别表示操作类型,以及操作中的 x x x 和 y y y。
输出格式
一行, n n n 个整数 a 1 , a 2 . . . a n a_1,a_2...a_n a1,a2...an,表示序列最初的样子。
样例 #1
样例输入 #1
5 5
12 1 12 4 2
1 3 2
1 4 3
2 3 4
1 5 2
2 1 3
样例输出 #1
1 1 2 1 1
提示
本题采用捆绑测试。
子任务编号 | 分值 | 特殊限制 |
---|---|---|
1 | 25 | 1 ≤ n , m ≤ 10 1\leq n,m\leq 10 1≤n,m≤10 |
2 | 25 | 1 ≤ n ≤ 100 1\leq n\leq 100 1≤n≤100,$1\leq m \leq 50 $ |
5 | 50 | 无 |
- 对于 100 % 100\% 100% 的数据满足 1 ≤ n ≤ 1 0 3 1\leq n\le 10^3 1≤n≤103, 1 ≤ m ≤ 200 1\leq m\le 200 1≤m≤200,对于任意的 $ i $ $ ( 1\leq i \leq n ) $,有 1 ≤ a i , b i ≤ 2 60 1\leq a_{i},b_{i} \leq 2^{60} 1≤ai,bi≤260。
代码如下:
C语言
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
long long n,m;
scanf("%lld%lld",&n,&m);
long long num[n+1];
for(long long i = 1;i <= n;i++)
{
scanf("%lld",&num[i]);
}
long long k[m], x[m], y[m];
for(long long i = 0;i < m;i++)
{
scanf("%lld%lld%lld",&k[i],&x[i],&y[i]);
}
for(long long i = m-1;i >= 0;i--)
{
if(k[i] == 1)
{
if(x[i]!=y[i])
num[x[i]] = num[x[i]] - num[y[i]];
else
num[x[i]] = num[x[i]]/2;
}
else if(k[i] == 2)
{
if(x[i] != y[i])
num[x[i]] = num[x[i]]/num[y[i]];
else
num[x[i]] = sqrt(num[x[i]]);
}
}
for(long long i = 1;i <= n;i++)
{
printf("%lld ",num[i]);
}
return 0;
}
C++
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
struct
{
int k, x, y;
}NUM[1001];
int main()
{
int n, m;
cin >> n >> m;
long long num[1000];
for (int i = 1; i <= n; i++)
{
cin >> num[i];
}
for (int i = 0; i < m; i++)
{
cin >> NUM[i].k >> NUM[i].x >> NUM[i].y;
}
for (int i = m - 1; i >= 0; i--)
{
if (NUM[i].k == 1)
{
if (NUM[i].x != NUM[i].y)
num[NUM[i].x] = num[NUM[i].x] - num[NUM[i].y];
else
num[NUM[i].x] = num[NUM[i].x] / 2;
}
else if (NUM[i].k == 2)
{
if (NUM[i].x != NUM[i].y)
num[NUM[i].x] = num[NUM[i].x] / num[NUM[i].y];
else
num[NUM[i].x] = sqrt(num[NUM[i].x]);
}
}
for (int i = 1; i <= n; i++)
{
cout << num[i] << " ";
}
return 0;
}
「WHOI-1」Ranker
题目背景
2077 2077 2077 年春。 15 15 15 岁的 miku 正在对着你谷发呆,突然看到一个奇怪的问题,你能帮帮他么??
你要先学会一些定义。
我们约定一个字符串下标从 1 1 1 开始, s [ l , r ] s[l,r] s[l,r] 表示 s l s l + 1 … s r s_ls_{l+1}\dots s_r slsl+1…sr 拼接成的一个字符串。
定义括号匹配串如下:
- 空串是括号匹配串。
- 如果 A A A 是括号匹配串,则 ( A ) (A) (A) 是括号匹配串。
- 如果 A , B A,B A,B 是括号匹配串,则 A B AB AB 是括号匹配串。
括号匹配前缀长度是指最大的 k k k 使得 s [ 1 , k ] s[1,k] s[1,k] 是一个括号匹配串。
比如:
- s = (())(() s=\text{(())(()} s=(())(() 时括号匹配前缀长度是 4 4 4。
- s = ()()()(()))( s=\text{()()()(()))(} s=()()()(()))( 时括号匹配前缀长度是 10 10 10。
题目描述
给你一个括号串 s s s。定义一次操作是交换他们当中相邻的两个字符。
你的任务是找出若干次操作后 s s s 的括号匹配前缀长度最大值。
输入格式
一行一个正整数 n n n 表示字符串长度。
接下来一行一个字符串表示 s s s。
输出格式
一行一个自然数表示答案。
样例 #1
样例输入 #1
3
(()
样例输出 #1
2
样例 #2
样例输入 #2
2
()
样例输出 #2
2
提示
本题采用 Subtask \texttt{Subtask} Subtask 计分方式,只有通过该 Subtask \texttt{Subtask} Subtask 的所有测试点才能得到该点的分数。
Subtask \texttt{Subtask} Subtask 编号 | 特殊限制 | 分值 |
---|---|---|
1 | 只含左括号或只含右括号 | 2 |
2 | n ≤ 2 n \leq 2 n≤2 | 3 |
3 | n ≤ 10 n \leq 10 n≤10 | 10 |
4 | n ≤ 1000 n \leq 1000 n≤1000 | 20 |
5 | 无 | 65 |
对于 100 % 100\% 100% 的数据,保证 $ 1\leq n\leq10^6$。
代码如下:
C语言
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
int n;
scanf("%d",&n);
char a[n];
scanf("%s",&a);
int left = 0,right = 0;
for(int i = 0;i < n;i++)
{
if(a[i] == '(')
left++;
else if(a[i] == ')')
right++;
}
if(right > left)
printf("%d\n",left*2);
else
printf("%d\n",right*2);
return 0;
}
C++
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main()
{
int n;
cin >> n;
string a;
cin >> a;
int a0 = 0, b0 = 0;
for (int i = 0; i < n; i++)
{
if (a[i] == '(')
a0++;
else if (a[i] == ')')
b0++;
}
cout << 2*min(a0, b0);
return 0;
}
[PFOI Round1] 暴龙的火锅
题目背景
暴龙爱吃火锅。
题目描述
定义 S ( x ) S(x) S(x) 表示 x x x 的每一位的数字之和,例如: S ( 14 ) = 1 + 4 = 5 S(14)=1+4=5 S(14)=1+4=5, S ( 114514 ) = 1 + 1 + 4 + 5 + 1 + 4 = 16. S(114514)=1+1+4+5+1+4=16. S(114514)=1+1+4+5+1+4=16.
另外,定义 f i b ( x ) fib(x) fib(x) 代表斐波那契数列的第 x x x 项,具体地:
f i b ( 1 ) = f i b ( 2 ) = 1 , f i b ( x ) = f i b ( x − 1 ) + f i b ( x − 2 ) ( x ≥ 3 ) . fib(1)=fib(2)=1,\ fib(x)=fib(x-1)+fib(x-2)\ (x≥3). fib(1)=fib(2)=1, fib(x)=fib(x−1)+fib(x−2) (x≥3).
现在给定 n n n,求出下式的值,其中 m o d 9 \bmod 9 mod9 表示对 9 9 9 取余数:
( S ( f i b ( 1 ) ) + S ( f i b ( 2 ) ) + S ( f i b ( 3 ) ) + . . . + S ( f i b ( n ) ) ) m o d 9. (S(fib(1))+S(fib(2))+S(fib(3))+...+S(fib(n))) \bmod 9. (S(fib(1))+S(fib(2))+S(fib(3))+...+S(fib(n)))mod9.
输入格式
第一行一个整数 T T T。
接下来 T T T 组问询,每次一个整数 n n n。
输出格式
T T T 行,每行一个整数代表答案。
样例 #1
样例输入 #1
3
7
14
114514
样例输出 #1
6
5
8
提示
【样例解释】
对于第一组询问, n = 7 n=7 n=7,答案为:
( S ( f i b ( 1 ) ) + S ( f i b ( 2 ) ) … + S ( f i b ( 6 ) ) + S ( f i b ( 7 ) ) ) m o d 9 = ( 1 + 1 + 2 + 3 + 5 + 8 + ( 1 + 3 ) ) m o d 9 = 6. \begin{aligned} & \ \ \ \ \ (S(fib(1))+S(fib(2))\ldots+S(fib(6))+S(fib(7)))\bmod 9 \\ & =(1+1+2+3+5+8+(1+3))\bmod 9 \\ & =6. \end{aligned} (S(fib(1))+S(fib(2))…+S(fib(6))+S(fib(7)))mod9=(1+1+2+3+5+8+(1+3))mod9=6.
【数据范围】
「本题采用捆绑测试」
- Subtask 1(10 pts): T = 1 , n ≤ 10 \texttt{Subtask 1(10 pts):}T=1,\ n\le 10 Subtask 1(10 pts):T=1, n≤10;
- Subtask 2(30 pts): T = 1 0 2 , n ≤ 1 0 3 \texttt{Subtask 2(30 pts):}T=10^2,\ n\le 10^3 Subtask 2(30 pts):T=102, n≤103;
- Subtask 3(60 pts): \texttt{Subtask 3(60 pts):} Subtask 3(60 pts):无特殊限制。
对于 100 % 100\% 100% 的数据,满足 1 ≤ T ≤ 1 0 5 , 1 ≤ n ≤ 1 0 6 1\le T\le 10^5,\ 1\le n\le 10^6 1≤T≤105, 1≤n≤106。
代码如下:
C语言
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int spa[] = { 0, 1, 1, 2, 3, 5, 8, 4, 3, 7, 1, 8, 0, 8, 8, 7, 6, 4, 1, 5, 6, 2, 8, 1, 0 };
int main() {
int n, data;
scanf("%d",&n);
while (n--) {
scanf("%d",&data);
int a = data % 24, ans = spa[a];
while (a--) ans = (ans + spa[a]) % 9;
printf("%d\n", ans);
}
return 0;
}
C++
#include<iostream>
using namespace std;
const int spa[] = { 0, 1, 1, 2, 3, 5, 8, 4, 3, 7, 1, 8, 0, 8, 8, 7, 6, 4, 1, 5, 6, 2, 8, 1, 0 };
int main() {
int n, data;
cin >> n;
while (n--) {
cin >> data;
int a = data % 24, ans = spa[a];
while (a--) ans = (ans + spa[a]) % 9;
printf("%d\n", ans);
}
return 0;
}
[CCC2022 J1] Cupcake Party
题目描述
幼儿园有 28 28 28 个小朋友,因此需要 28 28 28 个蛋糕。
一个大盒子可以装 8 8 8 块蛋糕,一个小盒子可以装 3 3 3 块蛋糕。现在有 n n n 个大盒子和 m m m 个小盒子,现在给每个小朋友一块蛋糕,问能剩下几个?
输入格式
一行,两个整数 n , m n,m n,m ,具体意义见题目描述。
输出格式
一行,表示剩余蛋糕的数量。
样例 #1
样例输入 #1
2 5
样例输出 #1
3
样例 #2
样例输入 #2
2 4
样例输出 #2
0
提示
对于全部数据: 0 ≤ n , m ≤ 100 0\le n,m\le100 0≤n,m≤100
代码如下:
C语言
#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>
int main()
{
int n,m;
scanf("%d%d",&n,&m);
printf("%d",n*8+m*3-28);
return 0;
}
C++
#include<iostream>
using namespace std;
int main() {
int n, m;
cin >> n>>m;
cout << n * 8 + m * 3 - 28;
return 0;
}