第三届“传智杯”全国大学生计算机大赛

T160507 A - 课程报名

题目描述

传智播客推出了一款课程,并进行了一次促销活动。具体来说就是,课程的初始定价为 v 元;每报名 m 个学员,课程的定价就要提升 a 元。由于课程能够容纳的学生有限,因此报名到 n 人的时候就停止报名。

现在老师想知道,当课程停止报名时,一共可以获得多少学费呢?
输入格式

一行四个使用空格隔开的整数,分别为 n,v,m,a。
输出格式

一行一个整数,表示答案。
输入输出样例
输入 #1

5 1 1 1

输出 #1

15

说明/提示
样例解释

每卖出 1 个课程,价格就会提高 1元,所以总共获得 1+2+3+4+5=15 元。
数据规模与约定

对于 50% 的数据,满足 1≤n,m,v,a≤10;

对于额外 20% 的数据,满足 a=0;

对于 100% 的数据,满足 0≤n,m,v,a≤10000。

然而,由于本次比赛是 ACM 赛制,因此您必须通过 100% 的数据才能够获得本题的得分,后题同。
代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
using namespace std;
#define ll long long
int main()
{
	int v,m,a,n,k=0,ans=0;
	cin>>n>>v>>m>>a;
	for(int i=1;i<=n;i++)
	{
		ans+=v;
		k++;
		if(k==m)v+=a,k=0;
	}
	cout<<ans<<endl;
	return  0;
 } 

160508 B - 期末考试成绩

题目描述

传智专修学院的 Java 程序设计课程的评价体系是这样的:

首先,所有学生会有一个卷面得分,这个得分一定是一个 [0,100]之间的整数。

如果卷面得分在 90 分以上,那么他的 GPA(加权平均成绩) 就是满分 4.0。

如果卷面得分在 60∼89之间,那么他每比 90 分少 111 分,那么他的分数就会在 4.0 的基础上减少 0.1。

如果卷面得分不到 60 分,那么善良的老师会给他照顾。具体来说,如果他的分数为 x ,那么老师会把他的分数调整为 根号x*10(向下取整) ,再计算他的 GPA。

如果经过调整该学生的得分依旧没满 6 ,那么他就挂科了,GPA 就是 0 分。

现在给你一个人的期末卷面得分,请你输出他的最终 GPA
输入格式

一行一个整数 x,表示该人的期末得分。
输出格式

一个小数点后只有一位的浮点数,表示该同学获得的GPA。

请注意,如果有 .0 请保留。
输入输出样例
输入 #1

99

输出 #1

4.0

输入 #2

88

输出 #2

3.8

输入 #3

12

输出 #3

0.0

说明/提示

对于 20% 的数据,满足 90≤x≤100;
对于额外 30% 的数据,满足 60≤x≤100;
对于 100% 的数据,满足 0≤x≤1000 。
代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
using namespace std;
#define ll long long
int main()
{
	int x;
	double ans=0;
	cin>>x;
	if(x>=90)ans=4.0;
	else if(x>=60&&x<=89)
	{
		int k=90-x;
		ans=4.0-0.1*k;
	}
	else
	{
		int k=sqrt(x)*10;
		if(k>=90)ans=4.0;
		else if(k>=60&&k<=89)
		{
			int z=90-k;
			ans=4.0-0.1*z;
		}
		else ans=0;
	}
	printf("%.1f",ans);

	return  0;
 } 

T160509 C - 志愿者

题目描述

传智专修学院总共召集了 n 位志愿者来负责打扫活动,现在需要你负责帮忙统计每位志愿者的工作情况,用来制作光荣榜,给他们发小花花。

第 iii 位志愿者有一个工作时长 ti ,以及他负责的工作的难度系数 ki,一名志愿者的贡献度可以用 ki×ti 确定。

现在要为这些志愿者的贡献度从大到小排个序,请你完成这个任务。相同贡献度的志愿者以工作时长较长的排在前面。如果贡献和时长一样,那么编号小的志愿者排在前面。
输入格式

一行一个整数 n ,表示志愿者的数量。

接下来 nnn 行,每行两个使用空格隔开的整数 ti,ki ,表示第 i 名志愿者的时间和难度系数。
输出格式

一行,共 n 个整数,第 i 个数表示排名为 i 的志愿者的序号,从 1 开始编号。

请注意本题时限为 5s,输入输出规模较大,请注意常数因素对耗时的影响,我们不会给使用 Java 和 Python 的选手增加额外的运行时间。
输入输出样例
输入 #1

3
1 2
2 3
3 4

输出 #1

3 2 1

说明/提示

对于 40% 的数据,满足 1≤n≤100;
对于额外 20% 的数据,满足 ki=1;
对于 100% 的数据,满足 1≤n≤5×105,1≤ki,ti≤1000。

然而,由于本次比赛是 ACM 赛制,因此您必须通过 100% 的数据才能够获得本题的得分,后题同。
代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
using namespace std;
#define ll long long
struct p{
	int t,k,b,g;
}a[500005];
bool cmp(p a,p b)//排序用
{
	if(a.g>b.g)return 1;
	else if(a.g<b.g)return 0;
	else
	{
		if(a.t>b.t)return 1;
		else if(a.t<b.t)return 0;
		else
		{
			if(a.b>b.b)return 0;
			else return 1;
		}
	}
}
int main()
{
	int n;
	cin>>n;
 
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].t>>a[i].k;
		a[i].g=a[i].t*a[i].k;
		a[i].b=i;
	}
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++)
	{
		cout<<a[i].b<<" ";
	}
	return  0;
 } 

T160510 D - 终端

题目描述

有一天您厌烦了电脑上又丑又没用的终端,打算自己实现一个 Terminal。

具体来说,它需要支持如下命令:

touch filename:如果名为 filename 的文件不存在,就创建一个这样的文件,如果已经存在同名文件的话则不进行任何操作。

rm name:删除名为 name 的文件。如果不存在这样的文件,就不进行任何操作。

ls:按创建时间为顺序,显示当前已经存在的未被删除的所有文件。

rename xxx yyy:将名为xxx的文件名字改为 yyy 。如果不存在这样的文件,或者已经存在文件名为 yyy 的文件,则不做任何操作。

这里所有涉及的文件名都仅由大写或者小写的英文字母构成,且文件名区分大小写。
输入格式

第一行一个整数 n ,表示总共要执行的操作数。

接下来 n 行,每行一个字符串,表示一条命令。
输出格式

对于每个 ls 命令,请输出若干行,每行一个字符串,表示一个文件,如果当前并没有任何文件,则什么都不输出。

请注意本题时限为 3s,输入输出规模较大,请注意常数因素对耗时的影响,我们不会给使用 Java 和 Python 的选手增加额外的运行时间。
输入输出样例
输入 #1

6
touch yyh
touch yyhtql
rename yyh yyhnb
touch qwq
rename qwq qaq
ls

输出 #1

yyhnb
yyhtql
qaq

说明/提示

对于 20% 的数据,只存在 1,3 操作

对于另外 20% 的数据,只存在 1,2,3 操作

对于另外 20% 的数据,只存在 1,3,4 操作

对于 100% 的数据,满足 1≤n≤1000

保证所有命令的长度不超过 2000 个字符。
代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
using namespace std;
#define ll long long
const int maxn = 1001;
char file[maxn][2000];
char cmd[4][10] = {"touch", "rm", "ls", "rename"};
int num = 0;
int search(char* filename) {
	for(int i = 0; i < num; i++) {
		if(strcmp(file[i], filename) == 0) return i;
	}
	return -1;
}
void del(char* name) {
	char temp[2000];
	int i, j;
	for(i = 0; i < num; i++) {
		if(strcmp(file[i], name) == 0) break;
	}
	if(i != num) {
		for(j = i; j < num - 1; j++) {
			strcpy(file[j], file[j + 1]);
		}
		num--;
	}
}
void show() {
	int j;
	for(j = 0; j < num; j++) {
		printf("%s\n", file[j]);
	}
}
int main() {
	int cnt, i, j;
	scanf("%d", &cnt);
	for(i = 0; i < cnt; i++) {
		char tmp[100];
		scanf("%s", tmp);
		if(strcmp(tmp, cmd[0]) == 0) {
			char filename[2000];
			scanf("%s", filename);
			if(search(filename) == -1) {
				strcpy(file[num++], filename);
			}
		}else if(strcmp(tmp, cmd[1]) == 0) {
			char name[2000];
			scanf("%s", name);
			del(name);
		}else if(strcmp(tmp, cmd[2]) == 0) {
			show();
		}else if(strcmp(tmp, cmd[3]) == 0) {
			char name1[2000], name2[2000];
			scanf("%s%s", name1, name2);
			int ord = search(name1);
			strcpy(file[ord], name2);
		}
	}
	return 0;
}

T160513 E - 运气

题目背景

YYH Land(Yoauld,Youthful & Happy Land) 是位于炽蓝仙野的一片神奇的国度,那里的人们过着无拘无束的的快乐生活。
题目描述

哈兰·斯威提是 YYH Land 远近闻名的注铅骰子爱好者。有一天他碰到了这么一个问题:

你有一枚 666 个面的骰子,分别写了 1,2,3,4,5,6,每一面朝上的概率是均等的。

现在哈兰想知道,如果他投掷 n 次,并且将结果按顺序写在纸上成为一个数。(比如说如果哈兰扔了 3 次,分别是 3,2,5 ,那么他最后得到的数就是 325)他现在想知道这个数是 k 的倍数的可能情况有多少种,其中 k 是一个特定的数。

由于这个方案数可能会很大,所以请你输出结果对 109+7 取模的结果。
输入格式

一行两个整数 n,k ,意义如题所示。
输出格式

一行一个整数,表示答案。
输入输出样例
输入 #1

2 11

输出 #1

6

说明/提示

样例解释

在投掷两次骰子总共 36 种可能中,只有 (“11”,“22”,“33”,“44”,“55”,“66”)是符合条件的。所以答案是 6。

数据规模与约定

对于 40% 的数据,满足 n 分别为 1,2,3,4;
对于另外 30% 的数据,满足 1≤k≤3 ;
对于 100% 的数据,满足 1≤n≤10,1≤k≤1000;
代码:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<map>
using namespace std;
#define ll long long
int n,k;
const ll mod =1e9+7;
ll ans=0;
void dfs(int cnt,ll num)//cnt是骰子数量,num是当前的值
{
	if(cnt==n)//如果是当前骰子数
	{
		if(num%k==0)ans++;//如果是k的倍数就++
		return ;
	}
	for(int i=1;i<=6;i++)//六个点数
	{
		dfs(cnt+1,num*10+i);//骰子每次+1都能得到全排
	}
}
int main() 
{
	cin>>n>>k;
	dfs(0,0);
	cout<<ans%mod<<endl;
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狗蛋儿l

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值