洛谷刷题C语言:ZAMKA、Number、子弦、NOI、Emacs

记录洛谷刷题C语言QAQ


一、[COCI2015-2016#5] ZAMKA

题目描述

给定三个整数 L , D , X L,D,X L,D,X,你需要找到两个整数 N , M N,M N,M,使得:

  • N N N 为满足条件的最小整数, L ≤ N ≤ D L\le N\le D LND N N N 的各位数字之和为 X X X
  • M M M 为满足条件的最大整数, L ≤ M ≤ D L\le M\le D LMD M M M 的各位数字之和为 X X X

保证 N , M N,M N,M 一定存在。

输入格式

输入共三行。

第一行一个整数 L L L,第二行一个整数 D D D,第三行一个整数 X X X

输出格式

输出共两行。

第一行为一个整数 N N N,第二行为一个整数 M M M

样例 #1

样例输入 #1

1
100
4

样例输出 #1

4
40

样例 #2

样例输入 #2

100
500
12

样例输出 #2

129
480

样例 #3

样例输入 #3

1
10000
1

样例输出 #3

1
10000

提示

数据规模与约定

对于 100 % 100\% 100% 的数据, 1 ≤ L ≤ D ≤ 1 0 4 1\le L\le D\le 10^4 1LD104 1 ≤ X ≤ 36 1\le X\le 36 1X36

说明

题目译自 COCI2015-2016 CONTEST #5 T1 ZAMKA

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>

int sum[10007];

int main() {
	for(int i = 1; i <= 10000; ++i) {
		int p = i;
		while(p) {
			sum[i] += p % 10;
			p /= 10;
		}
	}
	int l, d, x;
	scanf("%d%d%d", &l, &d, &x);
	for(int i = l; i <= d; ++i) {
		if(sum[i] == x) {
			printf("%d\n", i);
			break;
		}
	}
	for(int i = d; i >= l; --i) {
		if(sum[i] == x) {
			printf("%d\n", i);
			break;
		}
	}
	return 0;
}

二、『MdOI R3』Number

题目描述

生活中我们会碰到一些特殊数字,这些数字使用一些特殊表达方式后会方便记忆和使用。比如说, 1 0 9 + 7 10^9+7 109+7 就非常常见——它相比于 1000000007 1000000007 1000000007,更方便选手看清数字而不必数 0 0 0,而且没有科学计数法的精度损失。

你现在有一个形如 1 0 k + x 10^{k}+x 10k+x 的数字,请还原成一般写法。

输入格式

一行两个整数 k , x k,x k,x

输出格式

一行一个整数表示 1 0 k + x 10^k+x 10k+x

样例 #1

样例输入 #1

9 7

样例输出 #1

1000000007

提示

【样例解释】

1 0 9 + 7 = 1000000007 10^9+7=1000000007 109+7=1000000007

更多样例请到这里领取。

【数据范围】

本题采用捆绑测试,换言之,你只有通过一个子任务的所有测试点,才可以拿到该子任务对应分数。

子任务编号 x < x< x< k ≤ k\le k特殊性质分值
1 10 10 10 9 9 912
2 10 10 10 500 500 50015
3 1 0 18 10^{18} 1018 18 18 188
4 1 0 18 10^{18} 1018 500 500 500 k ≥ 18 k\ge18 k1825
5 1 0 18 10^{18} 1018 500 500 50040

对于所有数据, 0 ≤ x < 1 0 18 0\le x<10^{18} 0x<1018 0 ≤ k ≤ 500 0\leq k\leq 500 0k500

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>

char s[30];
int k,len;
int a[100001];
int main()
{
	scanf("%d",&k);
	scanf("%s",&s);
	for(int i=strlen(s)-1;i>=0;--i)
		a[++len]=s[i]-'0';//转换成数字
	a[k+1]++;//处理k
	if(len <= k + 1)
		len = k + 1;//获取位数
	for(int i=1;i<=len;++i)
		if(a[i]>9)
			a[i+1]++,a[i]%=10;//处理进位
	if(a[len+1])
		++len;//最高位的处理
	for(int i=len;i>=1;--i)
		printf("%d",a[i]);//倒序输出结果
	return 0;
}

三、[Cnoi2020]子弦

题目描述

Cirno 有一个字符串 S \texttt{S} S,并希望你能求出 S \texttt{S} S 出现次数最多的非空子串的出现次数,记作 p p p

输入格式

一行,一个字符串 S \texttt{S} S

输出格式

一行,一个整数 p p p

样例 #1

样例输入 #1

abababab

样例输出 #1

4

提示

数据范围与约定

对于 100 % 100\% 100% 的数据保证: 0 < ∣ S ∣ ≤ 1 0 7 0< |\texttt{S}| \le 10^7 0<S107 S x ∈ [ a , z ] \texttt{S}_x\in[\texttt{a},\texttt{z}] Sx[a,z]

子任务「本题采用捆绑测试」
  • Subtask1( 40 % 40\% 40%): ∣ S ∣ ≤ 100 |\texttt{S}| \le 100 S100
  • Subtask2( 40 % 40\% 40%): ∣ S ∣ ≤ 1 0 5 |\texttt{S}| \le 10^5 S105
  • Subtask3( 20 % 20\% 20%):无特殊限制。

名词解释

  • 子串:字符串中任意个连续的字符组成的子序列称为该串的子串。

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>

char s[10000005];
int cnt[27];
int mx;
int main(void) {
    scanf("%s",s);
    int slen=strlen(s);
    for(int i=0;i<slen;i++) cnt[s[i]-'a']++;
    for(int i=0;i<26;i++) if(cnt[i]>mx) mx=cnt[i];
    printf("%d",mx);
    return 0;
}

四、NOI

题目背景

小 L 是一个菜鸡。

啥也不会的小 L 上了 NOI 考场。

题目描述

由于小 L 不会算数,现在小 L 告诉了你他每题的分数和队线,请你告诉他是否进队。

NOI 分数的计算方式是:

  1. 笔试基础有 50 50 50 分,每通过一题加 1 1 1 分。
  2. 实际得分是每题的分数加上笔试的分数。
  3. 如果是 A 类,总分在此基础上再加 5 5 5 分。

输入格式

输入 9 9 9 个数 a , b , c , d , e , f , g , h , i a,b,c,d,e,f,g,h,i a,b,c,d,e,f,g,h,i,分别表示笔试通过题数, D1T1,D1T2,D1T3,D2T1,D2T2,D2T3 得分,是否 A 类(是 1 1 1,不是 0 0 0),集训队分数线。

输出格式

输出一行一个字符串。

如果进了集训队,则输出 AKIOI

如果没进,输出 AFO

样例 #1

样例输入 #1

50 50 72 56 100 40 0 1 446

样例输出 #1

AFO

样例 #2

样例输入 #2

50 95 100 64 100 72 30 0 446

样例输出 #2

AKIOI

提示

「样例解释」

样例第一个是退役菜鸡小 L 的 NOI2020 成绩。

第二个是某位队爷的 NOI2020 成绩。

这不是啥都没解释吗


「数据范围与说明」

本题采用捆绑测试。仅有通过某个 Subtask 中所有测试点才能获得该 Subtask 的分数。

  • Subtask 1(30 points): h = 0 h = 0 h=0 a = 50 a = 50 a=50 i = 700 i = 700 i=700
  • Subtask 2(30 points): h = 0 h = 0 h=0 a = 50 a = 50 a=50
  • Subtask 3(40 points):无特殊限制。

对于所有数据, 0 ≤ a ≤ 50 0\leq a \leq 50 0a50 0 ≤ b , c , d , e , f , g ≤ 100 0\leq b,c,d,e,f,g \leq 100 0b,c,d,e,f,g100 0 ≤ h ≤ 1 0 \leq h \leq 1 0h1 205 ≤ i ≤ 705 205\leq i \leq 705 205i705

此处不考虑第 50 50 50 名同分的情况,可以认为如果同分小 L 优先。

不保证测试数据为真实成绩。

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>

int main()
{ 
	long long a, b, c, d, e, f, g, h, i;
	scanf("%lld%lld%lld%lld%lld%lld%lld%lld%lld",&a,&b,&c,&d,&e,&f,&g,&h,&i);
	long long sum = a+b+c+d+e+f+g+50;
	if(h == 1)
	{
		sum = sum + 5;
	}
	if(sum >= i)
	{
		printf("AKIOI\n");
		
	}
	else 
		printf("AFO\n");
	return 0;
}
 

五、[COCI2019-2020#5] Emacs

题目描述

给定一个 n × m n\times m n×m 的只含有 .* 的矩阵。

矩阵中 * 形成一些不重叠的长方形。它们不在边缘或顶点接触。

求长方形有多少个?

输入格式

第一行:两个正整数 n n n m m m

以下 n n n 行:表示题目描述中的矩阵。矩阵只含有 .*

输出格式

一行一个非负整数,你的答案。

样例 #1

样例输入 #1

6 7
***....
***..**
.....**
.***.**
.***...
.***...

样例输出 #1

3

样例 #2

样例输入 #2

3 3
*.*
...
*.*

样例输出 #2

4

样例 #3

样例输入 #3

1 10
.*.**.***.

样例输出 #3

3

提示

数据范围

  • 对于 10 p t s 10 pts 10pts 的数据,矩阵中每个长方形只含一个 *
  • 对于另外 15 p t s 15 pts 15pts 的数据,保证 n = 1 n=1 n=1
  • 对于所有的数据, 1 ≤ n , m ≤ 100 1\leq n,m\leq 100 1n,m100

说明

题目译自 COCI2019-2020 CONTEST #5 T1 Emacs ,译者 90693

代码如下

#include<string.h>
#include<stdio.h>
#include<math.h>
#include <stdlib.h>

int n,m,ans;
char a[104][104];

int main()
{
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;++i)
		scanf("%s",a[i]);
	for(int i=0;i<n;++i)
		for(int j=0;j<m;++j)
			if(a[i][j]=='*'&&(!i||a[i-1][j]=='.')&&(!j||a[i][j-1]=='.'))++ans;
	printf("%d",ans);
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值