洛谷刷题C语言:等差数列、模拟赛、小D与笔试、黑蚊子多、光骓者的荣耀

记录洛谷刷题QAQ,一些不太优雅的代码


一、【XR-3】等差数列

题目描述

小 X 给了你一个等差数列的前两项以及项数,请你求出这个等差数列各项之和。

等差数列:对于一个 n n n 项数列 a a a,如果满足对于任意 i ∈ [ 1 , n ) i \in [1,n) i[1,n),有 a i + 1 − a i = d a_{i+1} - a_i = d ai+1ai=d,其中 d d d 为定值,则称这个数列为一个等差数列。

输入格式

一行 3 3 3 个整数 a 1 , a 2 , n a_1, a_2, n a1,a2,n,表示等差数列的第 1 , 2 1,2 1,2 项以及项数。

数据范围:

  • ∣ a 1 ∣ , ∣ a 2 ∣ ≤ 1 0 6 |a_1|,|a_2| \le 10^6 a1,a2106
  • 3 ≤ n ≤ 1 0 6 3 \le n \le 10^6 3n106

输出格式

一行一个整数,表示答案。

样例 #1

样例输入 #1

1 2 3

样例输出 #1

6

样例 #2

样例输入 #2

-5 -10 5

样例输出 #2

-75

提示

【样例 1 1 1 说明】

这个等差数列为 1 2 3,其各项之和为 6 6 6

代码如下

#include
#include
#include
#include 

int main()

{
	long long  a1, a2, n;
	scanf("%lld%lld%lld",&a1,&a2,&n);
	
	long long sum = 0;
	long long k = a2 - a1;
	sum = n*a1 + n*(n - 1)*k/2; 
	
	printf("%lld\n",sum);
	return 0;
}

二、【XR-4】模拟赛

题目描述

X 校正在进行 CSP 前的校内集训。

一共有 n n n 名 OIer 参与这次集训,教练为他们精心准备了 m m m 套模拟赛题。

然而,每名 OIer 都有各自的时间安排,巧合的是,他们在接下来的 k k k 天中都恰好有 m m m 天有空打模拟赛。

为了方便管理,教练规定一个人必须按顺序打完 m m m 套模拟赛题。

比如,小 X 在接下来的第 2 , 3 , 5 2,3,5 2,3,5 天有空打模拟赛,那么他就必须在第 2 2 2 天打第 1 1 1 套模拟赛题,第 3 3 3 天打第 2 2 2 套模拟赛题,第 5 5 5 天打第 3 3 3 套模拟赛题。

教练需要为每一个人的每一次模拟赛做准备,为了减小工作量,如果在某一天有多个人打同一套模拟赛题,那么教练只需要在这一天准备一场使用这一套题的模拟赛即可。

你作为机房大佬,教练想请你帮他计算一下,他每天需要准备多少场模拟赛。

输入格式

第一行三个整数 n , m , k n,m,k n,m,k

接下来 n n n 行,每行 m m m 个整数,第 i i i 行第 j j j 列的整数 a i , j a_{i,j} ai,j 表示第 i i i 个人在接下来的 k k k 天中第 j j j 个有空的日子为第 a i , j a_{i,j} ai,j 天。

输出格式

一行 k k k 个整数,第 i i i 个整数表示接下来的第 i i i 天教练需要准备的模拟赛场数。

样例 #1

样例输入 #1

1 3 5
2 3 5

样例输出 #1

0 1 1 0 1

样例 #2

样例输入 #2

6 3 7
2 3 4
2 5 7
3 5 7
1 3 5
5 6 7
1 2 3

样例输出 #2

1 2 3 1 3 1 1

样例 #3

样例输入 #3

10 10 20
2 3 4 8 9 11 12 16 17 18
2 3 6 10 12 13 14 15 19 20
1 3 7 10 11 13 14 15 17 19
1 2 4 6 7 9 15 17 19 20
2 3 5 6 9 11 14 16 19 20
1 2 3 8 9 10 11 12 15 19
1 4 6 7 9 12 13 17 18 19
1 7 8 9 10 11 13 15 18 20
1 5 6 7 8 9 13 16 18 19
4 5 7 10 11 13 14 17 18 20

样例输出 #3

1 2 2 3 2 2 4 3 3 3 3 4 2 1 3 1 2 2 2 1

提示

本题采用捆绑测试。

  • Subtask 1(13 points): n = m = k = 1 n = m = k = 1 n=m=k=1
  • Subtask 2(24 points): n = 1 n = 1 n=1
  • Subtask 3(24 points): m = 1 m = 1 m=1
  • Subtask 4(39 points):无特殊限制。

对于 100 % 100\% 100% 的数据, 1 ≤ n , m , k ≤ 1 0 3 1 \le n,m,k \le 10^3 1n,m,k103 m ≤ k m \le k mk 1 ≤ a i , 1 < a i , 2 < ⋯ < a i , m ≤ k 1 \le a_{i,1} < a_{i,2} < \cdots < a_{i,m} \le k 1ai,1<ai,2<<ai,mk

代码如下

#include
#include
#include
#include 

int n, m, k, tot[1004], vis[1004][1004], a[1004][1004];

int main() {
	scanf("%d%d%d", &n, &m, &k);
	for(int i = 1; i <= n; ++i)
		for(int j = 1; j <= m; ++j)
			scanf("%d", &a[i][j]);
	for(int i = 1; i <= n; ++i) {
		for(int j = 1; j <= m; ++j) {
			if(!vis[j][a[i][j]]) {
				vis[j][a[i][j]] = 1;
				tot[a[i][j]]++;
			}
		}
	}
	for(int i = 1; i <= k; ++i)
		printf("%d ", tot[i]);
	return 0;
}

三、小D与笔试

题目背景

小 D 是一位即将参加 ION 的 IO 选手,然而笔试题库中数量繁多的奇怪题目让他大伤脑筋,快来帮帮他!

题目描述

笔试题库可以抽象为 n n n 道题目,每道题目由题面和答案组成,都是一个字符串,保证所有题目题面互不相同。

为了检验小 D 背笔试的效果,教练进行了一次模拟考试,考试包含 q q q 道题目,每道题目都有 4 4 4 个选项,小 D 需要从 4 4 4 个选项中选出与答案相符的选项。

现在你需要帮助小 D 完成这场考试。

输入格式

第一行两个正整数 n , q n, q n,q

接下来 n n n 行,每行 2 2 2 个用空格分隔的字符串,表示这道题目的题面和答案。

接下来 q q q 行,每行 5 5 5 个用空格分隔的字符串,第一个字符串表示模拟考试中这道题目的题面,其余 4 4 4 个字符串按顺序分别为这道题目的选项 A 到选项 D,保证选项各不相同。

输出格式

对于模拟考试中的每道题目,输出一个字符表示这道题目答案对应的选项,保证所有题目均有解。

样例 #1

样例输入 #1

3 4
decoak yes
duliuchutiren nonono
csps noiptg
decoak yes no qwq qaq
csps noiptg noippj noi cspj
decoak qwq qaq yesyes yes
duliuchutiren yes no nono nonono

样例输出 #1

A
A
D
D

提示

【数据范围】

s s s 为输入中字符串长度的最大值。

对于 30 % 30 \% 30% 的数据, n , q , s ≤ 10 n, q, s \le 10 n,q,s10
对于另 20 % 20 \% 20% 的数据, s = 1 s = 1 s=1
对于 100 % 100 \% 100% 的数据, n , q , s ≤ 100 n, q, s \le 100 n,q,s100,所有字符串都由小写拉丁字母组成。

代码如下

#include
#include
#include
#include 

char a[101][101],ans[101][101];
char p[101],pp[101][101];
char h[5]={'0','A','B','C','D'};
int main()
{
	int n,m,qwq=0;
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%s",a[i]+1);
		scanf("%s",ans[i]+1);
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%s",p+1);
		for(int j=1;j<=n;j++)
		{
			if(strcmp(p+1,a[j]+1)==0)
			{
				for(int t=1;t<=4;t++)
					scanf("%s",pp[t]+1);
				for(int t=1;t<=4;t++)
				{
					if(strcmp(pp[t]+1,ans[j]+1)==0)
					{
						printf("%c\n",h[t]);
						qwq=1;
						break;
					}
				}
				if(qwq)
					break;
			}
		}
		qwq=0;
	}
}

四、[MtOI2019]黑蚊子多

题目背景

性★感☆大★草 在☆线★开☆门
定☆数★一☆零 实★则☆虚★高
加★速☆转★圈 开☆幕★雷☆击
疯☆狂★交☆互 劲★爆☆咚★咚
黑★蚊☆子★多 邀☆您★来☆爽
超☆越★模☆式 直★角☆旋★钮
山★东☆卫★星 马☆上★联☆动
变☆成★十☆加 已★经☆爽★爆

题目描述

Hikari 的面前有 n ( 1 ≤ n ≤ 1000 ) n(1\leq n\leq 1000) n(1n1000) 级台阶,每 1 s 1s 1s 她可以向上跳 m ( 1 ≤ m ≤ n ) m(1\leq m\leq n) m(1mn) 级台阶。(不在中间的台阶上停留)

台阶上有 k ( k ≤ 10 ) k(k\leq 10) k(k10) 个特殊的平台 a i a_i ai,Hikari 在该平台 停留 时会使得 m m m 增加 1 1 1

请问 Hikari 到达台阶顶部花费的时间。

输入格式

2 2 2 行。

1 1 1 行输入 3 3 3 个非负整数 n , m , k n,m,k n,m,k

2 2 2 行输入 k k k 个正整数,第 i i i 个正整数表示 a i a_i ai,保证输入的 a i a_i ai 单调递增。

输出格式

1 1 1 行,输出 1 1 1 个正整数表示花费的时间。

样例 #1

样例输入 #1

10 5 0

样例输出 #1

2

样例 #2

样例输入 #2

31 4 2
8 13

样例输出 #2

6

提示

子任务

对于 60 % 60\% 60% 的数据, k = 0 k=0 k=0

对于 100 % 100\% 100% 的数据, 1 ≤ m ≤ n ≤ 1000 1\leq m\leq n\leq 1000 1mn1000 k ≤ 10 k\leq 10 k10

题目来源

MtOI2019 Extra Round T1

出题人:disangan233

代码如下

#include
#include
#include
#include 

int main()
{
	int n, m, k;
	scanf("%d%d%d",&n,&m,&k);
	
	int num[k+1];
	for(int i  = 1;i <= k;i++)
	{
		scanf("%d",&num[i]);
	}
	
	int sum = 0;
	int j = 1;
	int time = 0;
	while(sum < n)
	{
		sum = sum + m;
		for(int j = 1;j <= k;j++)
		{
		
			if(sum == num[j])
			{
				m++;
			}
		}
		time++;
	}
	
	printf("%d\n",time);
	return 0;
}

五、【CSGRound2】光骓者的荣耀

题目背景

洛谷刷题C语言:等差数列、模拟赛、小D与笔试、黑蚊子多、光骓者的荣耀_第1张图片

小 K 又在做白日梦了。他进入到他的幻想中,发现他打下了一片江山。

题目描述

小 K 打下的江山一共有 n n n 个城市,城市 i i i 和城市 i + 1 i+1 i+1 有一条双向高速公路连接,走这条路要耗费时间 a i a_i ai

小 K 为了关心人民生活,决定定期进行走访。他每一次会从 1 1 1 号城市到 n n n 号城市并在经过的城市进行访问。其中终点必须为城市 n n n

不仅如此,他还有一个传送器,传送半径为 k k k,也就是可以传送到 i − k i-k ik i + k i+k i+k。如果目标城市编号小于 1 1 1 则为 1 1 1,大于 n n n 则为 n n n

但是他的传送器电量不足,只能传送一次,况且由于一些原因,他想尽量快的完成访问,于是就想问交通部部长您最快的时间是多少。

注意:他可以不访问所有的城市,使用传送器不耗费时间

输入格式

两行,第一行 n , k n,k n,k

第二行 n − 1 n-1 n1 个整数,第 i i i 个表示 a i a_i ai

输出格式

一个整数,表示答案。

样例 #1

样例输入 #1

4 0
1 2 3

样例输出 #1

6

样例 #2

样例输入 #2

4 1
1 2 3

样例输出 #2

3

提示

样例解释 1:

样例 1,2 的图示均为以下图片:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pVGMRQcM-1658836203174)(https://s2.ax1x.com/2019/11/08/MZbuTK.png)]

不使用传送器直接走,答案为 6 6 6,可以证明这个是最小值。

样例解释 2:

3 3 3 处使用,传送到 4 4 4,答案为 3 3 3,可以证明这个是最小值。

数据范围:

对于所有数据, a i > 0 a_i > 0 ai>0

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7i401n5Z-1658836203175)(https://s2.ax1x.com/2019/11/04/Kvrl34.jpg)]

代码如下

#include
#include
#include
#include 
long long a[1000005];
int main()
{
	long long n,k,maxx=0;
	scanf("%ld%ld",&n,&k);
	for (int i=1;i<n;++i)
	{
		scanf("%ld",&a[i]);
		a[i]+=a[i-1];//前缀和
	}
	for (int i=1;i<=n-k;++i)
	{
		if(maxx < a[i+k-1]-a[i-1])
		{
			maxx = a[i+k-1]-a[i-1];
		}//求最多能越过的权值
	}
	printf("%ld",a[n-1]-maxx);//别忘了用总路程减去能越过的路程
	return 0;
}

你可能感兴趣的:(C语言学习,洛谷,c语言)