csu-2018年11月月賽Round2-div2題解
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題解