1. 程式人生 > 其它 >第三屆“傳智杯”全國大學生IT技能大賽(初賽B組)題解合集

第三屆“傳智杯”全國大學生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 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

#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 6089 之間,那麼他每比 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 1n1000
保證所有命令的長度不超過 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 1k3
對於 100 % 100\% 100% 的資料,滿足 1 ≤ n ≤ 10 1 \leq n \leq 10 1n10, 1 ≤ k ≤ 1000 1 \leq k\leq 1000 1k1000

#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 題罰時太高,水個區域三等獎,能混個學分就混,不能就算了,以後我是不會打 “傳智杯” 了。