1. 程式人生 > >杭電趣味賽第四場

杭電趣味賽第四場

第一題 簽到題

題目:
這是一個劍與魔法的遊戲世界,世界中的玩家們有著屬於他們的等級系統。但和那些平常的遊戲等級系統有所不同的是,在這個世界中,相鄰兩個等級之間所需要的經驗是相同的,不會隨著等級的升高而變化。這個世界中每年都會有一天叫做眾生平等日,在這一天創世神將設定一個等級k,讓所有玩家的等級變為k,讓所有人都在這一天體驗平等的感覺。改變等級有兩種方式,第一種方式是將一個玩家的經驗轉移到另一個玩家身上,即使得玩家改變相同的級數;第二種方式是抽出自己的經驗給玩家或者直接讓玩家的經驗消失,眾所周知,創世神有無窮多的經驗。今年的眾生平等日就快要到了,創世神想知道如果他想讓n個玩家都變為k級,最少需要從他自己身上抽出多少級的經驗值。
input:
第一行有兩個整數n和k,其中n代表遊戲中的玩家人數,k代表創世神想讓玩家變為的等級數。
第二行有n個整數,分別代表n個玩家的等級,這些整數均為非負整數且不大於10000。
output:
輸出一個整數,即創世神最少需要從自己身上抽出的等級數。
0<n≤1000
0≤k≤200000≤k≤20000
sample:
input:
3 3
1 2 3
output:
3

#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
    int n,k,i,a;
    long long sum=0,ans=0;//sum為所有低階玩家達到k級所需的總等級數,ans是高階玩家可以分出來的總等級數
    scanf("%d%d",&n,&k);
    for(i=0; i<n; i++)
    {
        scanf("%d",&a);
        if(a - k > 0)
            ans += a - k;
        else
            sum += k - a;
    }
    if(sum - ans > 0)//如果高階玩家可以分出來的總級數都不夠給低階玩家,這時候創世神才需要抽等級出來
        printf("%lld",sum - ans);
    else
        printf("0");//否則,創世神是不用抽自己的等級出來的啦
}

簽到必wa定律,第一次是沒有認真讀題…沒有減去其他玩家分出來的級數,然後馬上加了一個ans,算出高階玩家可以抽出來的總級數,第二次是沒有考慮到有可能高階玩家分出來的級數夠填給低階玩家呀,這樣創世神就不用抽自己的等級出來了,那麼輸出應該為0。

第二題 腦筋急轉彎

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

#include <cstdio>
using namespace std;
int main()
{
    int n,l,v0,h,v,i;
    double mintime,maxtime,t;
    scanf("%d%d%d",&n,&l,&v0);
    for(i=0; i<n; i++)
    {
        scanf("%d%d",&h,&v);
        t = (1.0 * l - h) / (v0 + v);
        if(i == 0 || t < mintime)
            mintime = t;
        if(i == 0 || t > maxtime)
            maxtime = t;
    }
    printf("%.2lf %.2lf",mintime,maxtime);
}

一開始一點思路都沒有,覺得應該要把氣球按零時刻所處高度和速度排序,然後算一下低位置的氣球能不能追上高位置的氣球,然後就覺得爆炸了。。。這沒法做啊。後來傅老大說,你想啊,就算當後面的氣球追上了前面的氣球,那麼後面的那個氣球會按照前面的氣球的速度繼續飛,其實不就相當於之前在前面的氣球一直在飛麼,只不過後面的那段路程別人來替它飛了,所以最大時間和最小時間是不會變的呀,只要求出每一個氣球忽略碰撞時到達頂端所需的時間,然後找出最大時間,最小時間就好了呀。好傢伙後來還是wa了,到底是為什麼呢,一個小時前終於知道,原來我忘記加上v0了啊!!!我敲!!

第三題 組合數學 and 二進位制

在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

#include <cstdio>
using namespace std;
int main()
{
    int n,k,sum;
    scanf("%d%d",&n,&k);
    sum = (k-1) * n;
    while(sum--)
    {
        printf("1");
    }
}

美麗度為k ^ 0 ,k ^ 1,k ^ 2……k ^ k-1的衣服共有n*(k-1)件,那麼就是從這n*(k-1)件衣服中任選1件,選2件……選n*(k-1)件,又因為有公式在這裡插入圖片描述
又因為奧本海姆不會不穿衣服,所以組合總數為2 ^ n*(k-1) - 1,那真是太妙了,因為2 ^ n*(k-1) - 1的二進位制形式就是n*(k-1)啊!!那麼這時候把組合總數乘以n就是所以搭配方案之和就等於n*(k-1),那麼輸出這麼多個1就完事了啊。