记录洛谷刷题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 L≤N≤D 且 N N N 的各位数字之和为 X X X;
- M M M 为满足条件的最大整数, L ≤ M ≤ D L\le M\le D L≤M≤D 且 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 1≤L≤D≤104, 1 ≤ X ≤ 36 1\le X\le 36 1≤X≤36。
说明
题目译自 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 9 | 12 | |
2 | 10 10 10 | 500 500 500 | 15 | |
3 | 1 0 18 10^{18} 1018 | 18 18 18 | 8 | |
4 | 1 0 18 10^{18} 1018 | 500 500 500 | k ≥ 18 k\ge18 k≥18 | 25 |
5 | 1 0 18 10^{18} 1018 | 500 500 500 | 40 |
对于所有数据, 0 ≤ x < 1 0 18 0\le x<10^{18} 0≤x<1018, 0 ≤ k ≤ 500 0\leq k\leq 500 0≤k≤500。
代码如下:
#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<∣S∣≤107, 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 ∣S∣≤100。
- Subtask2( 40 % 40\% 40%): ∣ S ∣ ≤ 1 0 5 |\texttt{S}| \le 10^5 ∣S∣≤105。
- 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 分数的计算方式是:
- 笔试基础有 50 50 50 分,每通过一题加 1 1 1 分。
- 实际得分是每题的分数加上笔试的分数。
- 如果是 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 0≤a≤50, 0 ≤ b , c , d , e , f , g ≤ 100 0\leq b,c,d,e,f,g \leq 100 0≤b,c,d,e,f,g≤100, 0 ≤ h ≤ 1 0 \leq h \leq 1 0≤h≤1, 205 ≤ i ≤ 705 205\leq i \leq 705 205≤i≤705。
此处不考虑第 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 1≤n,m≤100。
说明
题目译自 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;
}