洛谷传智杯往年真题模拟(签到题)

本人近期做的题目以签到题为主

[传智杯 #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,bi20,保证每个课程报名的学生编号不会重复。

输入格式

输入共 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 a1an,表示报名课程 A A A 的学生编号。

3 3 3 行输入 m m m 个正整数 b 1 … b m b_1\ldots b_m b1bm,表示报名课程 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×ajk,那么这两名同学就被称为“和谐的一对”。请问这些同学中,有多少对“和谐的一对”呢?

对于所有数据, n ≤ 1 0 3 n \leq 10^3 n103 a i ≤ 1 0 5 a_i\leq 10^5 ai105 k ≤ 1 0 9 k\leq 10^9 k109

输入格式

输入共 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 a1an

输出格式

输出共 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 相同。例如,我们称 ababc 的子串,但 ac 不是 abc 的子串。

输入格式

输入只有一行一个字符串,表示字符串 s s s

输出格式

输出一行一个整数表示答案。

样例输入 #1

welcometochuanzhicupchuanzhi

样例输出 #1

2

提示

数据规模与约定

对于全部的测试点,保证 1 ≤ ∣ s ∣ ≤ 4 × 1 0 5 1 \leq |s| \leq 4 \times 10^5 1s4×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 1a100,1p50.

输入格式

本题有多组数据。

第一行一个整数 T ( 1 ≤ T ≤ 1000 ) T(1 \leq T \leq 1000) T(1T1000) ,表示数据组数。

接下来 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 1n,m,v,a10

对于额外 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 0n,m,v,a1000

然而,由于本次比赛是 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 0h,e,t100

现在你知道了你的组原考试的 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×amaxaminaiamin

由于成绩系统的问题,最终录入的成绩只能是整数,采用直接去掉小数部分的方法

输入格式

第一行一个整数 n n n 表示人数。( 1 ≤ n ≤ 1000 1 \leq n \leq 1000 1n1000

第二行共 n n n 个整数,为序列 a a a ,其中 a i a_i ai 表示第 i i i 个人的原始作业得分。( 1 ≤ a i ≤ 1000 1 \leq a_i \leq 1000 1ai1000

输出格式

一行,共 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) << " ";
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值