# PCSI R2-PD 魔法之域 [題目here] 若$M_x\times S_y>M_y\times S_x$,則代表東家獲勝 將不等式的兩邊$\times \frac{1}{S_xS_y}$(也就是把$S_y$移到不等式右邊,$S_x$移到不等式左邊) $$M_x\times S_y \times \frac{1}{S_xS_y} > M_y\times S_x \times \frac{1}{S_xS_y}$$ $$\frac{M_x}{S_x} > \frac{M_y}{S_y}$$ 不等式的兩邊都只剩一個底數了 我們只需要對$\frac{M_x}{S_x}$進行排序,就可以知道當$x$為東方時,可以打贏多少人 但如果你是用`float`儲存這個數值,你可能會被浮點數誤差卡掉 所以我們要一起紀錄分母和分子,使用原始數據才不會被卡掉 以下是以`struct`為範例撰寫,我們在`struct`內建立兩個變數,代表分母和分子 ```c++ struct dta{ int up;//分子 int dn;//分母 } ``` 另外,我們要寫一個函數,將分數化為最簡分數,方便我們後續計算 ```c++ dta fix(dta a){ int n=__gcd(a.up,a.dn);//取最大公因數 //分母分子除以n a.up/=n; a.dn/=n; return a; } ``` 再來,我們要寫一個比大小的函數 我們將函數名設為`operator<`,兩數比大小時,就可以用`a<b`來進行 ```c++ bool operator<(dta a,dta b){ //通分 INT xx=__gcd(a.dn,b.dn); INT ax=b.dn/xx; INT bx=a.dn/xx; //分子通分 INT aa=a.up*ax; INT bb=b.up*bx; //回傳比大小結果 return aa<bb; //因為我們只是要比大小,分母通不通分無所謂 } ``` :::spoiler 不認真的分數通分過程 $$\frac{a_1}{a_2} ? \frac{b_1}{b_2}$$ $$\frac{a_1}{a_3\times n} ? \frac{b_1}{b_3\times n}(a_3\times n=a_2,b_3\times n=b_2,n為正整數)$$ $$\frac{b_3\times a_1}{b_3\times a_3\times n} ? \frac{a_3\times b_1}{a_3\times b_3\times n}$$ $${b_3\times a_1} ? {a_3\times b_1}$$ ~~或者自己找數學老師~~ ::: 接者就是對數列進行`sort`,並計算答案 這邊有個小細節:我們可能會遇到$\frac{M_x}{S_x} = \frac{M_y}{S_y}$ 假設能力值小於$a$的有x個人,能力值為$a$的有y個人 則我們可以計算這$y$個人打贏另外$x$個人的組合為$x\times y$ ## 完整程式碼 ```c++= #include<bits/stdc++.h> using namespace std; #define INT long long int #define endl "\n" struct dta{ INT up; INT dn; }; bool operator<(dta a,dta b){ INT xx=__gcd(a.dn,b.dn); INT ax=b.dn/xx; INT bx=a.dn/xx; INT aa=a.up*ax; INT bb=b.up*bx; return aa<bb; } int main(){ cin.tie(0);cout.tie(0);ios::sync_with_stdio(0); INT n; cin>>n; dta lst[n]; for(INT i=0;i<n;i++){ cin>>lst[i].up; } for(INT i=0;i<n;i++){ cin>>lst[i].dn; //fix INT m=__gcd(lst[i].up,lst[i].dn); lst[i].up/=m; lst[i].dn/=m; } sort(lst,lst+n); INT ans=0; INT xx=0;//計算有幾個人同分 for(INT i=n-1;i>=0;i--){ xx++; if(lst[i].up!=lst[i-1].up || lst[i].dn!=lst[i-1].dn){//兩數不相同 ans+=i*xx; xx=0; } } cout<<ans<<endl; return 0; } ``` [題目here]: https://github.com/KagariET01/OJ_ans/blob/main/PCIC/2023/r2/R2_All.pdf
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up