1. 程式人生 > >csu-2018年11月月賽Round2-div2題解

csu-2018年11月月賽Round2-div2題解

for 回文數 sin des spa main include end 攻擊

csu-2018年11月月賽Round2-div2題解

A(2193):昆蟲繁殖

Description

科學家在熱帶森林中發現了一種特殊的昆蟲,這種昆蟲的繁殖能力很強。每對成蟲過x個月產y對卵,每對卵要過兩個月長成成蟲。假設每個成蟲不死,第一個月只有一對成蟲,且卵長成成蟲後的第一個月不產卵(過X個月產卵),問過Z個月以後,共有成蟲多少對?0=<X<=20,1<=Y<=20,X=<Z<=50

Input

單組數據 x,y,z的數值

Output

過Z個月以後,共有成蟲對數

Sample Input

1 2 8

Sample Output

37

題解:

從x+1到z+1循環,設a[i]為第i個月成蟲的數量,b[i]為第i個月卵的數量。所以a[i] = a[i - 1] + b[i - 2](卵兩個月長成成蟲),b[i] = y * a[i - x](過x月產y對卵),則a[z + 1]就是答案。

初始條件為從1到x,a[i] = 1, b[i] = 0;

註意x == 0時,i初始值為1,b[i - 2] 會數組越界,這時單獨判斷一下。

代碼:

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline ll getnum() {
    ll ans = 0; char c; ll flag = 1;
    while (!isdigit(c = getchar()) && c != '-');
    if (c == '-') flag = -1; else ans = c - '0';
    while (isdigit(c = getchar())) ans = ans * 10 + c - '0';
    return ans * flag;
}
ll a[100], b[100];
int main() {
    ll x = getnum(), y = getnum(), z = getnum();
    a[1] = 1;
    for (int i = 1; i <= x; i++) {
        a[i] = 1;
        b[i] = 0;
    }
    for (int i = x + 1; i <= z + 1; i++) {
        if (i == 1) {
            a[i] = 1;
        }
        else a[i] = a[i - 1] + b[i - 2];
        b[i] = y * a[i - x];
    }
    if (x == z) {
        cout << "1";
    }
    else cout << a[z + 1];
    return 0;
}

B(2194):小車問題

Description

甲、乙兩人同時從A地出發要盡快同時趕到B地。出發時A地有一輛小車,可是這輛小車除了駕駛員外只能帶一人。已知甲、乙兩人的步行速度一樣,且小於車的速度。問:怎樣利用小車才能使兩人盡快同時到達。

Input

僅一行,三個數據分別表示AB兩地的距離s,人的步行速度a,車的速度b。

Output

兩人同時到達B地需要的最短時間(保留三位小數)。

Sample Input

120    5    25

Sample Output

9.600

題解:

數學題,同時到達時間最短,則走路的和開車的同時到達。設一開始開車送第一個走的距離為x,剩下距離為s - x,則答案就為x / b + (s - x) / a,把x解出來即可

解出來之後為:
\[ \frac{(b^2 - a^2)*s}{b^2 - 3a^2 + 2ab} \]
有個公因式b-a,所以x就等於(b + a) * s / (b + 3 * a)

代碼:

#include<bits/stdc++.h>
#define maxn 1070
using namespace std;
inline int getnum() {
    int ans = 0; char c; int flag = 1;
    while (!isdigit(c = getchar()) && c != '-');
    if (c == '-') flag = -1; else ans = c - '0';
    while (isdigit(c = getchar())) ans = ans * 10 + c - '0';
    return ans * flag;
}
int main() {
    double s = getnum(), a = getnum(), b = getnum();
    double x = (b + a) * s / (b + 3 * a);
    printf("%.3lf\n", x / b + (s - x) / a);
    return 0;
}

C(2196):Lights

Memory Limit: 2 Mb

Description

xrdog有個燈泡,編號從1到N。燈泡在一開始的時候都是亮著的,xrdog會對這些燈泡進行次操作,每一次操作都會選擇一盞燈,並把除了這盞燈以外的燈的開關都按一下(即除了這盞燈以外的所有亮著的燈變成暗的,暗的燈變成亮的)

有趣的是,xrdog只會進行奇數次操作(即),並且最終有且僅有一盞燈是亮著的。

小磚對xrdog的這一系列操作十分的好奇,她很想知道最後亮著的這一盞燈是哪一盞。所以你能幫助一下她嘛?

Input

第一行兩個整數 N(1<=N<=1018)N(1<=N<=1018) 和 M(1<=M<=106)M(1<=M<=106)

接下來一行 MM 個整數表示次操作一次是選擇的哪一盞燈

Output

打印一個整數,表示最後亮著的燈的編號。

Sample Input

46 3
1 13 1

Sample Output

13

題解:

因為最後保證只有一盞燈,進行奇數次操作,所以對於某一盞燈的操作次數必須要為偶數次,否則這個燈最後就會處於打開狀態,觀察到空間只有2mb,不能存下來找那些是奇數次,所以對於每次操作直接對當前狀態求異或即可,因為若進行偶數次操作異或結果為0,達到了找匹配的效果。

代碼:

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline ll getnum() {
    ll ans = 0; char c; int flag = 1;
    while (!isdigit(c = getchar()) && c != '-');
    if (c == '-') flag = -1; else ans = c - '0';
    while (isdigit(c = getchar())) ans = ans * 10 + c - '0';
    return ans * flag;
}
int main() {
    ll n = getnum(), m = getnum();
    ll ans = 0;
    for (int i = 1; i <= m; i++) {
        ll x = getnum();
        ans ^= x;
    }
    cout << ans;
    return 0;
}

D(2204):漫無止境的八月

Description

又雙叒叕開始漫無止境的八月了,阿虛突然問起長門在這些循環中團長哪幾次紮起了馬尾,他有多少次抓住了蟬等等問題,長門一共回復n個自然數,每個數均不超過1500000000(1.5*10^9)。已知不相同的數不超過10000個,現在需要統計這些自然數各自出現的次數,並按照自然數從小到大的順序輸出統計結果。

Input

第1行是整數n,表示回復的自然數的個數。n<=1e6
第2~n+1行每行一個自然數。

Output

包含m行(m為n個自然數中不相同數的個數),按照自然數從小到大的順序輸出。每行輸出兩個整數,分別是自然數和該數出現的次數,其間用一個空格隔開。

Sample Input

8
2
4
2
4
5
100
2
100

Sample Output

2 3
4 2
5 1
100 2

水題,直接貼代碼:

#include<bits/stdc++.h>
#define maxn 1000050
using namespace std;
int a[maxn];
inline int getnum() {
    int ans = 0; char c; int flag = 1;
    while (!isdigit(c = getchar()) && c != '-');
    if (c == '-') flag = -1; else ans = c - '0';
    while (isdigit(c = getchar())) ans = ans * 10 + c - '0';
    return ans * flag;
}
int lis[maxn];
int main() {
    int n = getnum();
    for (int i = 1; i <= n; i++) {
        a[i] = getnum();
    }
    sort(a + 1, a + n + 1);
    int cnt = 1;
    if (n == 1) {
        cout << a[1] << " " << "1" << endl;
    }
    for (int i = 2; i <= n; i++) {
        if (a[i] == a[i - 1]) {
            cnt++;
            if (i == n) {
                cout << a[i] << " " << cnt;
            }
        }
        else {
            cout << a[i - 1] << " " << cnt << endl;
            if (i == n) {
                cout << a[i] << " " << "1";
            }
            cnt = 1;
        }
    }
    return 0;
}

E(2205):Magia

Description

吼姆啦醬來救被變成魔女的紗耶香攻擊的小圓辣!魔境背景中的指揮家指揮著這場表演的音樂,吼姆啦醬發現一個規律,如果過一串音符是回文的,那麽這串音符會實物化來攻擊她,現在給出一段音符,判斷它是否是回文的。一個左右對稱的自然數稱為回文數,即這個數從左往右讀與從右往左讀是一樣的,如121,686,13731,8668等都是回文數。

Input

輸入一個int範圍內的自然數N,判斷它是否是回文數。如果是就輸出這個回文數,若不是則輸出-1。

Output

只有一行,N是回文數,就輸出N,不是就輸出-1。

Sample Input

686

Sample Output

686

更水,直接貼代碼:

#include<bits/stdc++.h>
using namespace std;
char s[10000];
int main() {
    scanf("%s", s + 1);
    int len = strlen(s + 1);
    int x;
    if (len % 2 == 1) {
        x = (len - 1) / 2;
    }
    else x = len / 2;
    bool flag = true;
    for (int i = 1; i <= x; i++) {
        if (s[i] != s[len - i + 1]) {
            flag = false;
            break;
        }
    }
    if (flag) printf("%s",s + 1);
    else cout << "-1";
    return 0;
}

csu-2018年11月月賽Round2-div2題解