本人近期做的题目以签到题为主
[传智杯 #3 决赛] 课程(难度:入门)
题目背景
disangan233 喜欢数数,于是他想让你帮他回答一个问题。
题目描述
传智专修学院提供 A , B A,B A,B 两个课程,分别有 n , m n,m n,m 个学生报名。报名 A A A 的学生的编号为 a n a_n an,报名 B B B 的学生的编号为 b m b_m bm,求有多少个学生同时报名了两个课程。
对于所有数据, n , m , a i , b i ≤ 20 n,m,a_i,b_i\leq 20 n,m,ai,bi≤20,保证每个课程报名的学生编号不会重复。
输入格式
输入共 3 3 3 行。
第 1 1 1 行输入 2 2 2 个正整数 n , m n,m n,m。
第 2 2 2 行输入 n n n 个正整数 a 1 … a n a_1\ldots a_n a1…an,表示报名课程 A A A 的学生编号。
第 3 3 3 行输入 m m m 个正整数 b 1 … b m b_1\ldots b_m b1…bm,表示报名课程 B B B 的学生编号。
学生编号不保证从小到大排序。
输出格式
输出共 1 1 1 行 1 1 1 个整数,表示答案。
样例输入 #1
5 5
1 2 3 4 5
1 3 4 5 6
样例输出 #1
4
提示
样例解释
我们发现, 1 , 3 , 4 , 5 1,3,4,5 1,3,4,5 这 4 4 4 名学生同时报名了两门课程,所以答案是 4 4 4。
参考代码
#include <iostream>
using namespace std;
int main()
{
int a[20];
int b[20];
int n, m;
int cnt = 0;
cin >> n >> m;
for(int i=0; i<n; i++)
{
cin >> a[i];
}
for(int i=0; i<m; i++)
{
cin >> b[i];
}
for(int i=0; i<n; i++)
{
for(int j=0; j<m; j++)
{
if(a[i] == b[j])
cnt++;
}
}
cout << cnt;
}
[传智杯 #3 决赛] 序列
题目背景
disangan333 喜欢 disangan233,于是他也想让你帮他数数。
题目描述
传智专修学院有 n n n 名同学,每个同学都有一个数字 a n a_n an。同时还知道一个常数 k k k 。
如果有两名同学,第 i i i 名同学和第 j j j 名同学,满足 i < j i<j i<j 且 a i × a j ≤ k a_i\times a_j\leq k ai×aj≤k,那么这两名同学就被称为“和谐的一对”。请问这些同学中,有多少对“和谐的一对”呢?
对于所有数据, n ≤ 1 0 3 n \leq 10^3 n≤103, a i ≤ 1 0 5 a_i\leq 10^5 ai≤105, k ≤ 1 0 9 k\leq 10^9 k≤109。
输入格式
输入共 2 2 2 行。
第 1 1 1 行输入两个正整数 n , k n,k n,k。
第 2 2 2 行输入 n n n 个正整数 a 1 … a n a_1\ldots a_n a1…an。
输出格式
输出共 1 1 1 行 1 1 1 个整数,表示答案。
样例输入 #1
5 5
1 2 3 4 5
样例输出 #1
4
提示
样例解释
样例中, ( 1 , 2 ) , ( 1 , 3 ) , ( 1 , 4 ) , ( 1 , 5 ) (1,2),(1,3),(1,4),(1,5) (1,2),(1,3),(1,4),(1,5) 这 4 4 4 对都是“和谐的一对”。
题目分析:
注意 ai 和 k 都超过了int的数据范围,需要用long long类型(本人做题就是忽略了这一点)
参考代码
#include <iostream>
using namespace std;
int main()
{
long long a[1005]; //这个long long把我难到了
long long n, k; //这个long long把我难到了
int cnt = 0;
cin >> n >> k;
for(int i=0; i<n; i++)
{
cin >> a[i];
}
for(int i=0; i<n; i++)
{
for(int j=i+1; j<n; j++)
{
if(a[i] * a[j] <= k)
cnt++;
}
}
cout << cnt;
}
[传智杯 #4 决赛] 小智的疑惑
题目描述
传智专修学院给了小智一个仅包含小写字母的字符串
s
s
s,他想知道,里面出现了多少次子串 chuanzhi
呢。
我们称一个字符串
t
t
t 是
s
s
s 的子串,当且仅当将
s
s
s 的开头若干个(可以为 0 个)连续字符和结尾若干个(可以为 0 个)连续字符删去后,剩下的字符串和
t
t
t 相同。例如,我们称 ab
是 abc
的子串,但 ac
不是 abc
的子串。
输入格式
输入只有一行一个字符串,表示字符串 s s s。
输出格式
输出一行一个整数表示答案。
样例输入 #1
welcometochuanzhicupchuanzhi
样例输出 #1
2
提示
数据规模与约定
对于全部的测试点,保证 1 ≤ ∣ s ∣ ≤ 4 × 1 0 5 1 \leq |s| \leq 4 \times 10^5 1≤∣s∣≤4×105, ∣ s ∣ |s| ∣s∣ 表示 s s s 的长度,且 s s s 中只有小写字母。
参考代码
简单的BF子串查找算法,注意string类型需要加cstring头文件
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
char s[400005], a[10] = { "chuanzhi" };
cin >> s;
int count = 0, j = 0;
for (int i = 0; i < strlen(s); i++)
{
if (s[i] == a[j])
{
j++;
}
else
{
i = i - j;
j = 0;
}
if (j == strlen(a))
{
count++;
j = 0;
}
}
cout << count << endl;
return 0;
}
[传智杯 #4 初赛] 报告赋分
题目描述
花栗鼠科技大学的计算机组成原理实验最终的结课考核方式是提交一份报告。然而作为任课老师,萝老师不希望大家过于内卷,所以指定了如下规定:
每份报告有一个卷面基础分 a a a。
在此基础上:
-
若是报告字数低于 16 16 16 页,则扣 10 10 10 分,如果分数低于 0 0 0 分了,则记作 0 0 0 分。
-
若是报告字数超过 20 20 20 页,每超过 1 1 1 页扣 1 1 1 分 ,直到分数扣到 0 0 0 分为止。
现在你知道了一份报告的卷面基础分 a a a 和它的页数 p p p ,请你计算这份报告的最终得分。我们保证 1 ≤ a ≤ 100 , 1 ≤ p ≤ 50 1 \leq a \leq 100,1 \leq p \leq 50 1≤a≤100,1≤p≤50.
输入格式
本题有多组数据。
第一行一个整数 T ( 1 ≤ T ≤ 1000 ) T(1 \leq T \leq 1000) T(1≤T≤1000) ,表示数据组数。
接下来 T T T 行,每行两个整数 a , p a,p a,p,意义如题所示。
输出格式
共 T T T 行,每行一个整数,表示该次询问的数据最终的得分。
样例输入 #1
2
70 17
80 10
样例输出 #1
70
70
参考代码
#include <iostream>
using namespace std;
int main()
{
int score, p;
int T;
cin >> T;
while(T--)
{
cin >> score >> p;
if(p > 20)
{
score = score - (p - 20);
}
if(p < 16)
{
score = score - 10;
}
if(score <= 0)
score = 0;
cout << score << endl;
}
}
[传智杯 #3 初赛] 课程报名
题目描述
传智播客推出了一款课程,并进行了一次促销活动。具体来说就是,课程的初始定价为 v v v 元;每报名 m m m 个学员,课程的定价就要提升 a a a 元。由于课程能够容纳的学生有限,因此报名到 n n n 人的时候就停止报名。
现在老师想知道,当课程停止报名时,一共可以获得多少学费呢?
输入格式
一行四个使用空格隔开的整数,分别为 n , v , m , a n,v,m,a n,v,m,a。
输出格式
一行一个整数,表示答案。
样例输入 #1
5 1 1 1
样例输出 #1
15
提示
样例解释
每卖出 1 1 1 个课程,价格就会提高 1 1 1 元,所以总共获得 1 + 2 + 3 + 4 + 5 = 15 1+2+3+4+5=15 1+2+3+4+5=15 元。
数据规模与约定
对于 50 % 50\% 50% 的数据,满足 1 ≤ n , m , v , a ≤ 10 1 \leq n,m,v,a\leq 10 1≤n,m,v,a≤10;
对于额外 20 % 20\% 20% 的数据,满足 a = 0 a=0 a=0;
对于 100 % 100\% 100% 的数据,满足 0 ≤ n , m , v , a ≤ 1000 0 \leq n,m,v,a \leq 1000 0≤n,m,v,a≤1000。
然而,由于本次比赛是 ACM 赛制,因此您必须通过 100 % 100\% 100% 的数据才能够获得本题的得分,后题同。
参考代码
参照了一下题解
#include <iostream>
using namespace std;
int main()
{
int n, v, m, a;
cin >> n >> v >> m >> a;
int sum = 0;
while(n)
{
for(int i=0; i<m && n != 0; i++, n--)
{
sum += v;
}
v = v + a;
}
cout << sum;
}
[传智杯 #4 初赛] 组原成绩
题目描述
花栗鼠科技大学(Hualishu University of Science and Technology, HUST)的计算机组成原理快要出分了。你现在需要计算你的组原成绩如何构成。
具体来说,组原成绩分为三部分,分别是平时出勤 t t t ,作业 h h h 和考试 e e e 。总成绩 w w w 由如下公式计算:
w = t × 20 % + h × 30 % + e × 50 % w=t \times 20\% +h \times 30\%+e \times 50\% w=t×20%+h×30%+e×50%
其中我们保证 0 ≤ h , e , t ≤ 100 0 \leq h,e,t \leq 100 0≤h,e,t≤100
现在你知道了你的组原考试的 t , h , e t,h,e t,h,e ,你希望计算你的总成绩。
由于教务系统的特殊性,最终成绩只能是整数,采取 直接去掉小数部分 的办法。
输入格式
一行三个整数,表示 t , h , e t,h,e t,h,e
输出格式
一行一个整数,为 w w w
样例输入 #1
50 100 100
样例输出 #1
90
参考代码
这题很容易
#include <iostream>
using namespace std;
int main()
{
int t, h, e;
cin >> t >> h >> e;
int w = t * 0.2 + h * 0.3 + e * 0.5;
cout << w;
}
[传智杯 #4 初赛] 竞争得分
题目描述
为了鼓励大家写出更好的作业,花栗鼠科技大学(Hualishu University of Science and Technology, HUST)的组原实验采用了竞争得分的方式。
具体来说,假设有
n
n
n 个人提交了作业,并且其中原始得分最低的人记作
a
m
i
n
a_{min}
amin ,原始得分最高的人记作
a
m
a
x
a_{max}
amax,第
i
i
i 个人的原始得分为
a
i
a_i
ai,那么第
i
i
i 个人的得分就是:
100
×
a
i
−
a
m
i
n
a
m
a
x
−
a
m
i
n
100 \times \frac{a_i-a_{min}}{a_{max}-a_{min}}
100×amax−aminai−amin
由于成绩系统的问题,最终录入的成绩只能是整数,采用直接去掉小数部分的方法。
输入格式
第一行一个整数 n n n 表示人数。( 1 ≤ n ≤ 1000 1 \leq n \leq 1000 1≤n≤1000)
第二行共 n n n 个整数,为序列 a a a ,其中 a i a_i ai 表示第 i i i 个人的原始作业得分。( 1 ≤ a i ≤ 1000 1 \leq a_i \leq 1000 1≤ai≤1000)
输出格式
一行,共 n n n 个整数,表示经过更新后每个人的得分。
样例输入 #1
3
1 2 3
样例输出 #1
0 50 100
参考代码
参考了题解,优化了代码
#include <iostream>
using namespace std;
int a[1005], maxx = 0, minn = 9999;
int main()
{
int n;
cin >> n;
for(int i=0;i<n;i++)
{
cin>>a[i];
if(a[i]>maxx) maxx=a[i];
if(a[i]<minn) minn=a[i];
}
for(int i=0; i<n; i++)
{
cout << 100 * (int)(a[i] - minn)/(maxx - minn) << " ";
}
}