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

63 篇文章 7 订阅
17 篇文章 1 订阅

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

1 1 2 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<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+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

样例 #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 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<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(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

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, 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<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 0n,m100

代码如下

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值