ICPC——2021台湾站(A B C D E J)
目錄
- A - Olympic Ranking
- B - Aliquot Sum
- C - A Sorting Problem
- D - Drunk Passenger
- E - Eatcoin
- J - JavaScript
A - Olympic Ranking
題意:n支隊伍,各有一定數(shù)量的金牌,銀牌,銅牌。按照金牌 > 銀牌 > 銅牌的優(yōu)先級,找出最強的隊伍。
題解:題意簡單,難點在于輸入那個字符串。
<1> 使用 getline和 string配合,然后輸出的時候從第 1位輸出而不是第 0位,會 wa12。
<2> 我是手寫了一個輸入字符串的函數(shù)。
<3> 我隊友用的 map + tuple + string,也把代碼附上,可以做個參考。(%%%
代碼:<2>
#include<bits/stdc++.h> using namespace std;#define endl "\n" #define ll long long #define inf 0x3f3f3f3f #define infll 1e15+7 #define IOS ios::sync_with_stdio(0); cin.tie(0) #define debug(a) cout<<"*****\tdebug: "<<a<<"\t*****"<<endl; const double eps = 1e-7; const double pi = acos(-1.0); const int mod = 1e9+7; const int N = 5 + 1e3;void getstr(char s[], int Lim) {int i = 0;char ch = getchar();while(ch == ' ') ch = getchar();while(ch != '\n' && ch != EOF && i < Lim){s[i++] = ch;ch = getchar();}s[i] = 0; }int a[N], b[N], c[N]; char s[310][100000];int main() { #ifndef ONLINE_JUDGEfreopen("in.in", "r", stdin);freopen("out.out", "w", stdout); #endif// IOS; // ---------------------------------------------------------------int n; cin>>n;for(int i = 1; i <= n; i++){cin>>a[i]>>b[i]>>c[i];getstr(s[i], 100000);} int ans = 1;for(int i = 2; i <= n; i++)if((a[i] > a[ans]) || (a[i] == a[ans] && b[i] > b[ans]) || (a[i] == a[ans] && b[i] == b[ans] && c[i] > c[ans])) ans = i;printf("%s", s[ans]);return 0; }代碼:<3>
B - Aliquot Sum
題意:求一個數(shù)的因子之和(除了自己本身),然后和自身比大小,對應(yīng)輸出三種字符串。
題解:預(yù)處理一下即可。
代碼:
#include<bits/stdc++.h> using namespace std;#define endl "\n" #define ll long long #define inf 0x3f3f3f3f #define infll 1e15+7 #define IOS ios::sync_with_stdio(0); cin.tie(0) #define debug(a) cout<<"*****\tdebug: "<<a<<"\t*****"<<endl; const double eps = 1e-7; const double pi = acos(-1.0); const int mod = 1e9+7; const int N = 5 + 1e6;ll ans[N];int main() { #ifndef ONLINE_JUDGEfreopen("in.in", "r", stdin);freopen("out.out", "w", stdout); #endif// IOS; // ---------------------------------------------------------------for(int i = 1; i < 1000010; i++)for(int j = 2*i; j < 1000010; j += i)ans[j] += i;// for(int i = 1; i <= 20; i++) cout<<ans[i]<<endl;int T; cin>>T;while(T--){int x; cin>>x;if(ans[x] > x) cout<<"abundant"<<endl;else if(ans[x] == x) cout<<"perfect"<<endl;else cout<<"deficient"<<endl;}return 0; }C - A Sorting Problem
題意:給定一個數(shù)組,求逆序?qū)?shù)。
題解:板子題,樹狀數(shù)組跑一遍即可。
代碼:
#include<bits/stdc++.h> using namespace std;#define endl "\n" #define ll long long #define inf 0x3f3f3f3f #define infll 1e15+7 #define IOS ios::sync_with_stdio(0); cin.tie(0) #define debug(a) cout<<"*****\tdebug: "<<a<<"\t*****"<<endl; const double eps = 1e-7; const double pi = acos(-1.0); const int mod = 1e9+7; const int N = 5 + 1e6;int n; int tree[N], f[N]; struct node {int x, idx; }a[N];bool cmp(node a, node b) {return a.x < b.x; }int lowbit(int i) {return i & -i; }void update(int pos, int val) {for(int i = pos; i <= n; i += lowbit(i))tree[i] += val; }int ask(int pos) {int res = 0;for(int i = pos; i > 0; i -= lowbit(i))res += tree[i];return res; }int main() { #ifndef ONLINE_JUDGEfreopen("in.in", "r", stdin);freopen("out.out", "w", stdout); #endifIOS; // ---------------------------------------------------------------cin>>n;for(int i = 1; i <= n; i++){cin>>a[i].x;a[i].idx = i;}sort(a+1, a+n+1, cmp);f[a[1].idx] = 1;for(int i = 2; i <= n; i++){if(a[i].x != a[i-1].x) f[a[i].idx] = i;else f[a[i].idx] = f[a[i-1].idx];}ll ans = 0;for(int i = 1; i <= n; i++){update(f[i], 1);ans += i - ask(f[i]);}cout<<ans<<endl;return 0; }D - Drunk Passenger
題意:n個人按照先后順序上飛機坐座位,第一個人喝醉了,所以他會等可能地坐到除了自己位置之外的位置上。剩下的乘客,如果自己的位置被占了,就會等可能的坐到其他位置上,否則坐自己的位置。求最后一個人做對位置的概率。
題解:【醉漢、1、2、3 …n-2、最后一個人】 分兩種大情況:
<1> 醉漢先坐你的位置(1/(n?1)1/(n-1)1/(n?1))
那么最后一個人坐錯位置的概率為 1?(1/(n?1))1*(1/(n-1))1?(1/(n?1)) = 1/(n?1)1/(n-1)1/(n?1),則坐對位置的概率也為1/(n?1)1/(n-1)1/(n?1)。
<2> 醉漢坐其他人的位置 ( (n?2)/(n?1)(n-2)/(n-1)(n?2)/(n?1) )
假如醉漢坐到了第 x個人的位置,那么從第 2個到第 x-1個人都會坐到自己的位置上。然后剩下的位置第 x個人都可以坐。
或者說情況就變成了:一共 m個人,m個位置(m = n-x+1),每個人都等概率坐任意位置(但還保持那種坐自己位置的特性)。那么最后一個人坐到最后一個位置上的概率就是 1/2(這是個經(jīng)典的醉漢問題,或者說瘋子問題,這里掛一個知乎的鏈接,就是關(guān)于這個問題的若干個解釋,不再給出證明知乎醉漢上飛機問題鏈接)
這種情況下,最后一個人坐對位置的概率就是(1/2)?((n?2)/(n?1))(1/2) * ((n-2)/(n-1))(1/2)?((n?2)/(n?1))
那么兩種情況相加一下,就是 1/(n?1)1/(n-1)1/(n?1) + (1/2)?((n?2)/(n?1))(1/2) * ((n-2)/(n-1))(1/2)?((n?2)/(n?1)) = n/(2?(n?1))n/(2*(n-1))n/(2?(n?1))
代碼:
#include<bits/stdc++.h> using namespace std;#define endl "\n" #define ll long long #define inf 0x3f3f3f3f #define infll 1e15+7 #define IOS ios::sync_with_stdio(0); cin.tie(0) #define debug(a) cout<<"*****\tdebug: "<<a<<"\t*****"<<endl; const double eps = 1e-7; const double pi = acos(-1.0); const int mod = 1e9+7; const int N = 5 + 1e6;int main() { #ifndef ONLINE_JUDGEfreopen("in.in", "r", stdin);freopen("out.out", "w", stdout); #endifIOS; // ---------------------------------------------------------------int n; cin>>n;double ans = 1.0*n/(2*(n-1));cout<<ans;return 0; }E - Eatcoin
題意:簡單地說,在第 d天,花費 p塊錢,生產(chǎn) q?d5q*d^5q?d5塊錢。 生產(chǎn)到 109910^{99}1099 塊錢算富豪。每天必須先花費 p塊錢才能生產(chǎn)。求開始時最少需要有多少錢,以及在開始時有需要的最少錢的情況下,最少需要多少天才能變成富豪。
題解:首先要推出 15+25+35+...+n51^5 + 2^5 + 3^5 + ...+n^515+25+35+...+n5的公式為:(n2?(n+1)2?(2n2+2n?1))/12(n^2*(n+1)^2*(2n^2 + 2n-1)) / 12(n2?(n+1)2?(2n2+2n?1))/12
用那個組合數(shù)的公式應(yīng)該也可以(公式證明鏈接)
<1> 求開始最少需要多少錢
剛開始花的錢的多,之后生產(chǎn)的錢多。假如到第 x天,生產(chǎn)的錢的總和大于等于花費的錢的總和。所以答案為,前x-1天花費總數(shù) - 前x-1天生產(chǎn)總數(shù) + 第 x天的花費
<2> 求最少需要多少天
列出求手上錢的總數(shù)的式子,然后二分天數(shù)即可。
代碼:(python版本, c++版本的大數(shù)寫的一直有問題,還在debug)
def cal(n, p, q, x):return q*(n*n)*(n+1)*(n+1)*(2*n*n+2*n-1)//12 - p*n + xp, q = map(int, input().split()) last = p - q i = 2 while(1):now = i*p-q*(i*i)*(i+1)*(i+1)*(2*i*i+2*i-1)//12i += 1if now >= last:last = nowelse:print(last+p) #下一次需要先消耗breakl = 1 r = 10**100 ans = 0 x = last+p # 不要x也能過,答案太大,x沒影響? while l <= r:mid = (l+r)//2if cal(mid, p, q, x) < 10**99:l = mid+1else:r = mid-1ans = mid print(ans)J - JavaScript
題意:模擬 javascript的減法運算。給定兩個字符串a(chǎn) b,如果字符串中存在非數(shù)字的元素,輸出 NaN。否則將兩個字符串轉(zhuǎn)為數(shù)字,進行相減運算。
題解:簡單模擬即可。(0對應(yīng)的 ASCLL值為 48)
代碼:
#include<bits/stdc++.h> using namespace std;#define endl "\n" #define ll long long #define inf 0x3f3f3f3f #define infll 1e15+7 #define IOS ios::sync_with_stdio(0); cin.tie(0) #define debug(a) cout<<"*****\tdebug: "<<a<<"\t*****"<<endl; const double eps = 1e-7; const double pi = acos(-1.0); const int mod = 1e9+7; const int N = 5 + 1e3;int main() { #ifndef ONLINE_JUDGEfreopen("in.in", "r", stdin);freopen("out.out", "w", stdout); #endif// IOS; // ---------------------------------------------------------------string a, b; cin>>a>>b;bool falg = 0;for(int i = 0; i < a.size(); i++) if(!isdigit(a[i]))falg = 1;for(int i = 0; i < b.size(); i++) if(!isdigit(b[i]))falg = 1;if(falg) cout<<"NaN";else{int ans1 = 0, ans2 = 0;for(int i = 0; i < a.size(); i++) ans1 = ans1*10 + a[i] - 48;for(int i = 0; i < b.size(); i++) ans2 = ans2*10 + b[i] - 48;cout<<ans1-ans2; }return 0; }總結(jié)
以上是生活随笔為你收集整理的ICPC——2021台湾站(A B C D E J)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab极性电容叫什么,电解电容与无
- 下一篇: 奥特曼系列ol如何进老服务器,《奥特曼系