A - 课程报名
题目描述
传智播客推出了一款课程,并进行了一次促销活动。具体来说就是,课程的初始定价为
v
v
v 元;每报名
m
m
m 个学员,课程的定价就要提升
a
a
a 元。由于课程能够容纳的学生有限,因此报名到
n
n
n 人的时候就停止报名。现在老师想知道,当课程停止报名时,一共可以获得多少学费呢?
输入格式
一行四个使用空格隔开的整数,分别为
n
n
n
v
v
v
m
m
m
a
a
a
输出格式
一行一个整数,表示答案。
输入样例
5 1 1 1
输出样例
15
说明/提示
样例解释:每卖出 1 个课程,价格就会提高 1 元,所以总共获得 1+2+3+4+5=151+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
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,v,m,a;
cin>>n>>v>>m>>a;
int t = 0;
int num = 0;
if(n > m)
{
while(n>m)
{
t = m*v;
num = num+t;
n = n-m;
v = v+a;
}
if(n>0) num=num+n*v;
else num = v*n;
}
cout<<num<<endl;
return 0;
}
B - 期末考试成绩
题目描述
传智专修学院的
J
a
v
a
Java
Java 程序设计课程的评价体系是这样的:首先,所有学生会有一个卷面得分,这个得分一定是一个
[
0
,
100
]
[0,100]
[0,100] 之间的整数。
如果卷面得分在 90 分以上,那么他的
G
P
A
GPA
GPA(加权平均成绩) 就是满分 4.0。
如果卷面得分在
60
∼
89
60 \sim 89
60∼89 之间,那么他每比 90 分少 1 分,那么他的分数就会在 4.0 的基础上减少 0.1。
如果卷面得分不到 60 分,那么善良的老师会给他照顾。具体来说,如果他的分数为 x ,那么老师会把他的分数调整为
x
×
\sqrt{x}\times
x× 10
x
x
x(向下取整) ,再计算他的
G
P
A
GPA
GPA。
如果经过调整该学生的得分依旧没满 60,那么他就挂科了,
G
P
A
GPA
GPA 就是 0 分。
现在给你一个人的期末卷面得分,请你输出他的最终
G
P
A
GPA
GPA
输入格式
一行一个整数
x
x
x,表示该人的期末得分。
输出格式
一个小数点后只有一位的浮点数,表示该同学获得的
G
P
A
GPA
GPA。
请注意,如果有 .0 请保留。
输入样例
12
输出样例
0.0
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
int main()
{
double x;
cin>>x;
if(x < 36) puts("0.0");
else if( x >= 90) puts("4.0");
else if(x >= 60 && x <= 89)
{
int t = 90 - x;
double te = (double) t * 0.1;
printf("%.1f\n",4.0 - te);
}
else
{
double t = sqrt(x)*10;
int tem = (int)t;
int y = 90 - tem;
double te = (double) y * 0.1;
printf("%.1f\n",4.0 - te);
}
return 0;
}
C - 志愿者
题目描述
传智专修学院总共召集了
n
n
n 位志愿者来负责打扫活动,现在需要你负责帮忙统计每位志愿者的工作情况,用来制作光荣榜,给他们发小花花。第
i
i
i 位志愿者有一个工作时长
t
i
t_i
ti ,以及他负责的工作的难度系数
k
i
k_i
ki,一名志愿者的贡献度可以用
k
i
×
t
i
k_i \times t_i
ki×ti 确定。
现在要为这些志愿者的贡献度从大到小排个序,请你完成这个任务。相同贡献度的志愿者以工作时长较长的排在前面。如果贡献和时长一样,那么编号小的志愿者排在前面。
输入格式
一行一个整数
n
n
n,表示志愿者的数量。
接下来
n
n
n 行,每行两个使用空格隔开的整数
t
i
,
k
i
t_i,k_i
ti,ki ,表示第
i
i
i 名志愿者的时间和难度系数。
输出格式
一行,共
n
n
n 个整数,第
i
i
i 个数表示排名为
i
i
i 的志愿者的序号,从 1 开始编号。请注意本题时限为 5s,输入输出规模较大,请注意常数因素对耗时的影响,我们不会给使用
J
a
v
a
Java
Java 和
P
y
t
h
o
n
Python
Python 的选手增加额外的运行时间。
输入样例
3
1 2
2 3
3 4
输出样例
3 2 1
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5e5 + 7;
struct node{
int id,t,k;
bool operator < (const node &c){
if(t * k != c.t*c.k) return (t*k) > (c.t*c.k);
else if(t != c.t) return t > c.t;
else return id < c.id;
}
};
node a[maxn];
int main()
{
int n;
scanf("%d",&n);
for(int i = 1; i <= n; i++)
{
int t,k;
scanf("%d%d",&t,&k);
a[i] = {i, t, k};
}
sort(a+1, a+1+n);
// for(int i = 1; i <= n; i++) printf("%d %d %d\n",a[i].id,a[i].t,a[i].k);
for(int i = 1; i <= n; i++) printf("%d ",a[i].id);
return 0;
}
D - 终端
题目描述
有一天您厌烦了电脑上又丑又没用的终端,打算自己实现一个
T
e
r
m
i
n
a
l
Terminal
Terminal。
具体来说,它需要支持如下命令:
1.
t
o
u
c
h
f
i
l
e
n
a
m
e
touch filename
touchfilename:如果名为
f
i
l
e
n
a
m
e
filename
filename 的文件不存在,就创建一个这样的文件,如果已经存在同名文件的话则不进行任何操作。
2.
r
m
n
a
m
e
rm name
rmname:删除名为
n
a
m
e
name
name 的文件。如果不存在这样的文件,就不进行任何操作。
3.
l
s
ls
ls:按创建时间为顺序,显示当前已经存在的未被删除的所有文件。
4.
r
e
n
a
m
e
x
x
x
y
y
y
rename xxx yyy
renamexxxyyy:将名为
x
x
x
xxx
xxx 的文件名字改为
y
y
y
yyy
yyy。如果不存在这样的文件,或者已经存在文件名为
y
y
y
yyy
yyy 的文件,则不做任何操作。
这里所有涉及的文件名都仅由大写或者小写的英文字母构成,且文件名区分大小写。
输入格式
第一行一个整数
n
n
n ,表示总共要执行的操作数。
接下来
n
n
n 行,每行一个字符串,表示一条命令。
输出格式
对于每个
l
s
ls
ls 命令,请输出若干行,每行一个字符串,表示一个文件,如果当前并没有任何文件,则什么都不输出。
请注意本题时限为 3s,输入输出规模较大,请注意常数因素对耗时的影响,我们不会给使用
J
a
v
a
Java
Java 和
P
y
t
h
o
n
Python
Python 的选手增加额外的运行时间。
输入样例
6
touch yyh
touch yyhtql
rename yyh yyhnb
touch qwq
rename qwq qaq
ls
输出样例
yyhnb
yyhtql
qaq
说明/提示
对于
20
%
20\%
20% 的数据,只存在 1,3 操作
对于另外
20
%
20\%
20% 的数据,只存在 1,2,3 操作
对于另外
20
%
20\%
20% 的数据,只存在 1,3,4 操作
对于
100
%
100\%
100% 的数据,满足
1
≤
n
≤
1000
1 \leq n \leq 1000
1≤n≤1000
保证所有命令的长度不超过 2000 个字符。
#include <bits/stdc++.h>
using namespace std;
#define me(a, b) memset(a, b, sizeof(a))
#define IOS() ios::sync_with_stdio(false), cin.tie(0)
#define endl '\n'
typedef long long ll;
typedef pair<ll, ll> pll;
typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const int maxn = 2e5 + 5;
const ll mod = 1e9 + 7;
map<string, int> m;
int main()
{
int n;
cin >> n;
for(int i = 0; i < n; ++i) {
string s;
cin >> s;
if(s == "touch") {
string t;
cin >> t;
if(!m.count(t))
m[t] = i;
}
else if(s == "rename") {
string x, y;
cin >> x >> y;
if(m.count(x) && !m.count(y)) {
m[y] = m[x];
m.erase(x);
}
}
else if(s == "rm"){
string t;
cin >> t;
m.erase(t);
}
else {
vector<pair<int, string> > v;
for(auto &it : m) {
v.push_back(make_pair(it.second, it.first));
}
sort(v.begin(), v.end());
for(auto it : v)
cout << it.second << endl;
}
}
return 0;
}
E - 运气
题目描述
哈兰·斯威提是
Y
Y
H
L
a
n
d
YYH Land
YYHLand 远近闻名的注铅骰子爱好者。有一天他碰到了这么一个问题:
你有一枚 6 个面的骰子,分别写了 1,2,3,4,5,6,每一面朝上的概率是均等的。
现在哈兰想知道,如果他投掷
n
n
n 次,并且将结果按顺序写在纸上成为一个数。(比如说如果哈兰扔了 3 次,分别是 3,2,5 ,那么他最后得到的数就是 325)他现在想知道这个数是
k
k
k 的倍数的可能情况有多少种,其中
k
k
k 是一个特定的数。
由于这个方案数可能会很大,所以请你输出结果对
1
0
9
+
7
10^9+7
109+7 取模的结果。
输入格式
一行两个整数
n
,
k
n,k
n,k ,意义如题所示。
输出格式
一行一个整数,表示答案。
输入样例
2 11
输出样例
6
说明/提示
样例解释: 在投掷两次骰子总共 36 种可能中,只有(“11”,“22”,“33”,“44”,“55”,“66”) 是符合条件的。所以答案是 6。
数据规模与约定
对于
40
%
40\%
40% 的数据,满足
n
n
n 分别为 1,2,3,4;
对于另外
30
%
30\%
30% 的数据,满足
1
≤
k
≤
3
1 \leq k \leq 3
1≤k≤3;
对于
100
%
100\%
100% 的数据,满足
1
≤
n
≤
10
1 \leq n \leq 10
1≤n≤10,
1
≤
k
≤
1000
1 \leq k\leq 1000
1≤k≤1000;
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn =2007;
const ll mod = 1e9+7;
ll dp[15][1005];
int n,m;
int main()
{
cin>>n>>m;
dp[0][0]=1;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
for(int k=1;k<=6;k++)
dp[i+1][(j*10+k)%m]=(dp[i+1][(j*10+k)%m]+dp[i][j])%mod;
printf("%lld\n",dp[n][0]);
return 0;
}
总结
今天智障杯
A
A
A 一直考虑
m
m
m = 0,
w
a
wa
wa 了 7次,最后一个动态规划理论正确的,确实水,如果不是
A
A
A 题卡了,应该
A
K
AK
AK,过了 3 题,
a
a
a 题罚时太高,水个区域三等奖,能混个学分就混,不能就算了,以后我是不会打 “传智杯” 了。