• 洛谷刷题C语言:娘子、淘气的猴子、Ranker、暴龙的火锅、Cupcake Party


    记录洛谷刷题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
    • 2
    • 3

    样例输出 #1

    0
    
    • 1

    样例 #2

    样例输入 #2

    5
    10010
    00100
    
    • 1
    • 2
    • 3

    样例输出 #2

    1
    
    • 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 1n103 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
    #include
    #include
    #include 
    
    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;
     } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    C++

    #include 
    #include 
    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    『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 3m+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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    样例输出 #1

    1 1 2 1 1
    
    • 1

    提示

    本题采用捆绑测试。

    子任务编号分值特殊限制
    125 1 ≤ n , m ≤ 10 1\leq n,m\leq 10 1n,m10
    225 1 ≤ n ≤ 100 1\leq n\leq 100 1n100,$1\leq m \leq 50 $
    550
    • 对于 100 % 100\% 100% 的数据满足 1 ≤ n ≤ 1 0 3 1\leq n\le 10^3 1n103 1 ≤ m ≤ 200 1\leq m\le 200 1m200,对于任意的 $ i $ $ ( 1\leq i \leq n ) $,有 1 ≤ a i , b i ≤ 2 60 1\leq a_{i},b_{i} \leq 2^{60} 1ai,bi260

    代码如下

    C语言

    #include
    #include
    #include
    #include 
    
    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;
     } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    C++

    #include 
    #include 
    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    「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+1sr 拼接成的一个字符串。


    定义括号匹配串如下:

    • 空串是括号匹配串。
    • 如果 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

    样例输出 #1

    2
    
    • 1

    样例 #2

    样例输入 #2

    2
    ()
    
    • 1
    • 2

    样例输出 #2

    2
    
    • 1

    提示

    本题采用 Subtask \texttt{Subtask} Subtask 计分方式,只有通过该 Subtask \texttt{Subtask} Subtask 的所有测试点才能得到该点的分数。

    Subtask \texttt{Subtask} Subtask 编号特殊限制分值
    1只含左括号或只含右括号2
    2 n ≤ 2 n \leq 2 n23
    3 n ≤ 10 n \leq 10 n1010
    4 n ≤ 1000 n \leq 1000 n100020
    565

    对于 100 % 100\% 100% 的数据,保证 $ 1\leq n\leq10^6$。

    代码如下

    C语言

    #include
    #include
    #include
    #include 
    
    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;
     } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    C++

    #include 
    #include 
    #include 
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    [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(x1)+fib(x2) (x3).

    现在给定 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
    • 2
    • 3
    • 4

    样例输出 #1

    6
    5
    8
    
    • 1
    • 2
    • 3

    提示

    【样例解释】

    对于第一组询问, 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.      (S(fib(1))+S(fib(2))+S(fib(6))+S(fib(7)))mod      (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, n10
    • 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, n103
    • 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 1T105, 1n106

    代码如下

    C语言

    #include
    #include
    #include
    #include 
    
    
    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;
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    C++

    #include
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    [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

    样例输出 #1

    3
    
    • 1

    样例 #2

    样例输入 #2

    2 4
    
    • 1

    样例输出 #2

    0
    
    • 1

    提示

    对于全部数据: 0 ≤ n , m ≤ 100 0\le n,m\le100 0n,m100

    代码如下

    C语言

    #include
    #include
    #include
    #include 
    
    int main()
    {
    	int n,m;
    	scanf("%d%d",&n,&m);
    	
    	printf("%d",n*8+m*3-28);
    	return 0;	
    } 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    C++

    #include
    
    using namespace std;
    
    int main() {
    	int n, m;
    	cin >> n>>m;
    	cout << n * 8 + m * 3 - 28;
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  • 相关阅读:
    Midjourney艺术家分享|By Moebius
    TensorFlow2.x基础与mnist手写数字识别示例
    基于图像识别的迁移学习之一
    selenium报错:没有打开网页或selenium.common.exceptions.NoSuchDriverException
    基于斑马优化的BP神经网络(分类应用) - 附代码
    ansible 003 常用模块
    双目视觉(双目相机)
    基于AT89S52单片机的汽车LED尾灯控制器设计
    Spring框架是什么&Spring框架的体系结构
    Java泛型知识总结
  • 原文地址:https://blog.csdn.net/weixin_62529383/article/details/126769971