第三屆“傳智杯”全國大學生IT技能大賽(初賽B組)題解合集
技術標籤:第二部分 --- 演算法競賽類傳智杯模擬動態規劃數學
文章目錄
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
#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”) 是符合條件的。所以答案是 66。
資料規模與約定
對於
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 題罰時太高,水個區域三等獎,能混個學分就混,不能就算了,以後我是不會打 “傳智杯” 了。