フェイス質問
タイトル説明
一致していると(H \)\ナショナルデー、王は招待(\ n)は\賞でゲームをプレイする大臣。まず、彼はそれぞれの上部の左右の手にそれぞれの大臣は自身がそれぞれ右手の整数を書くために、残された整数王を書いてみましょう。その後、みましょう\(N \)行の大臣は、王は前のランクに立ちました。並ん後、すべての閣僚は、金貨王の報酬の数を受け取る、各大臣のためのコインの数が得られた:彼の右手に数で割った数の閣僚全ての前で左手の行の製品、得られた整数結果は、切り捨て。
王は彼が最も報酬大臣を取得するために、彼はチームの順番を並べ替える助けをお願いしたいと思いますので、できるだけ報酬を受け、大臣は特に大きな賞を取得する必要はありません。王の位置は常に前のランクになっていることに注意してください。
入力形式
最初の行は整数含ま\(N- \)を、大臣の数を表します。
二行目は、2つの整数含ま\(A \)と\(Bを\) 、それぞれ左右の王での整数を表し、間のスペースで区切られました。
次\(N- \)行、2つの整数を含む各行\(A \)と\(B \)との間のスペースで区切られ、各々がそれぞれ左右の整数大臣を表します。
出力フォーマット
金貨大臣のほとんどの数で再配置されたツアーを獲得した後、チームを表す整数が得られます。
サンプル入力と出力
入力#1
3
1 1
2 3
7 4
4 6
出力#1
2
説明/ヒント
例説明[O]
チャンセラー押し1,2,3は、このようなチームが得られた硬貨の最大数は2で報わ配置しました。
首相押し1,3,2は、このようなチームが得たコインの最大数は2で報わ配置されました。
首相押し2,1,3は、このようなチームが得たコインの最大数は2で報わ配置されました。
プレス2,3,1は、このようなチーム、9への報酬大臣を得たコインの最大数を配置し、
首相押し3,1,2は、このようなチームが得たコインの最大数は2で報わ配置されました。
この配置チームによる3,2,1大臣は、金貨のほとんどの数が9を得た報い。
したがって、最もやりがいのある大臣は少なくとも二つの金貨、回答出力2を取得します。
[データ範囲]
ため\(20%\ \)データがある(1 \ N-LE \ル10 \)\、\(0 <A、B <8 \。) 。
用(40 \%\)\データが存在する\(1 \ N-LE \ル20 \である)、\(0 <A、B <8 \。) 。
以下のための\(60 \%\)のデータが存在する\(1 \ N-LE \ル100 \。) 。
以下のために(60 \%\)\データ、回答が超えないように\(10 ^ 9 \) 。
以下のために(100 \%\)\データがある\(1 \ N-LE \ル千\) 、\(0 <A、B <10000 \) 。
NOIP 2012は2番目の質問の最初の日のセットを改善するために、
分析
この質問は非常に大臣、王、左手......モンゴル円、死の束を混乱に見えるかもしれません。
しかし、ほとんど私はTucaoしたいが、まだ自分の目標を達成することができますゼロを書き込まない左手で王であります
まあ、我々は最初の閣僚の束を見ていないはずです、王と大臣は、二つの彼の後ろを見て、それを分析します。
列のテーブル:
アイデンティティ | 左手 | 右側の |
---|---|---|
王 | \(A_0 \) | \(B_0 \) |
大臣1 | \(A_1 \) | \(B_1 \) |
大臣2 | \(A_2 \) | \(B_2 \) |
多くの金を得ることができ、大臣1を分析?
ことは明らかである\(\ FRAC {} \ {B_1 A_0}) 、
大臣2どのくらいの金はそれを得ることができますか?
(\ \ {B_2} \ {FRAC * A_1 A_0}) 、
今回、我々の2人の大臣で金貨の最大数と称する(ans_1 \)\、その後明らかに存在する
\ [ans_1 = MAX(\ FRAC {A_0} { B_1} \ FRAC {A_0 * A_1} {B_2})\]
さて、私たちは首相や閣僚1 2を交換します。
アイデンティティ | 左手 | 右側の |
---|---|---|
王 | \(A_0 \) | \(B_0 \) |
大臣2 | \(A_2 \) | \(B_2 \) |
大臣1 | \(A_1 \) | \(B_1 \) |
このときも、大臣は、取得してもよい1 \(\ {B_1} \ {FRAC * A_2 A_0}) 、
大臣は、取得してもよい2 \(\ FRAC A_0} {} {B_2 \) 。
この時間は、私たちが書く金貨の両大臣最も数(ans_2 \)は\、その後、明らかにそこにある
\ [ans_2 = MAX(\ FRAC {A_0 * A_2} {B_1}、\ FRAC {A_0} {B_2})\] 。
ルックと比較して
\ [ans_1 = MAX(\ FRAC B_1} {} {A_0、\ FRAC * A_0 A_1} {} {B_2)\]
\ [ans_2 = MAX(\ * FRAC A_2 A_0 {} {} B_1 \ FRAC {A_0} {B_2 })\]
タイトルは、すべての閣僚は、左と右の数字は整数であると言われています。
だから、非常に明らかに、\(\ FRAC {A_0} {B_1} \ル\ FRAC {A_0 * A_2} {B_1} \)と\(\ FRAC {A_0} { B_2} \ル\ FRAC {A_0 * A_1} {B_2 } \) 。
しかし、単に非常識式の塊に、このような長くて退屈なと。どのようにそれを行うには?単語、集合!
食事狂っ設定、\(\ FRAC A_0 {} {} B_1 \)に設定されている\(P_1 \)、\ (A_1 A_0 \ * FRAC} {} {B_2は\)に設定されている\(P_2 \)、\ (\ FRAC {A_0 * A_2} {B_1 } \) に設定されている\(P_3 \)、\ (\ FRAC A_0 {} {} B_2は、\)に設定されている\(P_4 \) 。
そして、そこに\(P_1 \ルP_3 \)、\ (P_4 \ルP_2 \) 。
この式は、瞬時に多くのことをリフレッシュ。
私たちが望む場合(ans_1 \)\と言うことです最適なソリューションは、です\(ans_1 \ルans_2 \)、あなたはどのように必要なのでしょうか?
ツタンカーメンちぇは、,,簡単にハンドルに見えない
こと問題ではない、私たちすることができます\(P_1、P_2、P_3、 P_4 \) 一緒に、煮ますその最大値を求めます。
ハ、あなたが見る\(P_1 \ルP_3 \)、\ (P_4 \ルP_2 \) 、
最大値は非使用することができるようになりますので、(\ P_1を)\、\ (P_4 \)メソッド我々は排除されていること。
左\(ans_1 \)です\(P_2 \)とから\(ans_2 \)です\(P_3 \) 。
しかし、我々は確実と言われてきました\(ans_1 \ルans_2 \)私たちは聞かせなければならないので、(P_2 \ルP_3 \)\この結果を確実にするために。
まあ、我々は持っ原則貪欲を:\ (P_2 \ルP_3 \) 。
この時点で、\(P \)のミッションが終了した、別れを行い、我々は徐々に本来のスタイルに交換します。
\ [P_2 \ルP_3 \]
\ [\ FRAC {A_0 * A_1} {B_2} \ル\ FRAC {A_0 * A_2} {B_1} \]
我々乗算しながらここで両側\(\ FRAC {B_1 * B_2 } A_0} {\) 。
\ [A_1 * B_1 \ルA_2
* B_2 \] ここでは、すべてが明確であり、我々はこの関係、貪欲ソートそれに従う必要がありますok
。
しかし、またノートへのポイントは、あなたが簡単に、データ範囲からのものカードのこの種を見ることができるということですull
!cpp
プレイヤーは、我々が唯一の使用、泣き出した高精度なそれを!
また、注目すべきポイントは、つまり、最後の大臣は本当に人気が、最後の大臣の出力を指示していない、あなたはその正しさを証明する方法がありません。この方法では、90分かかることがあります。
もう一つ注意すべきを集結、王が最初の場所で常にある、それは貪欲ソートに含めることはできません。このため、私は80分かかりました良好な結果。
重要な点は、私たちがバーコードの上にあり、前記行わ。
コード
/*
* @Author: crab-in-the-northeast
* @Date: 2020-02-05 00:19:09
* @Last Modified by: crab-in-the-northeast
* @Last Modified time: 2020-02-05 00:56:58
*/
#include <bits/stdc++.h>
using namespace std;
int n,m;
const int maxn=1005;
const int maxh=20005;
struct gamer{
long l,r;
bool operator<(const gamer a) const{
return l*r<a.l*a.r;
}
}gamers[maxn];
string mul(string a,string b){
int alen=a.size();
int blen=b.size();
int res[maxh]={0};
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
for(int i=0;i<alen;i++)
for(int j=0;j<blen;j++)
res[i+j]+=(a[i]-'0')*(b[j]-'0');
for(int i=0;i<alen+blen;i++)
if(res[i]>=10){
res[i+1]+=res[i]/10;
res[i]%=10;
}
string ret="";
bool frontzero=true;
for(int i=alen+blen-1;i>=0;i--){
if(!res[i]&&frontzero) continue;
frontzero=false;
ret+=res[i]+'0';
}
return ret;
}
string div(string a,int b){
int res[maxh]={0},resa[maxh]={0};
int len=a.size();
for(int i=0;i<len;i++)
res[i+1]=a[i]-'0';
int tmp=0;
for(int i=1;i<=len;i++){
resa[i]=(tmp*10+res[i])/b;
tmp=(tmp*10+res[i])%b;
}
int start=1;
string ret="";
while(!resa[start]&&start<len) start++;
for(int i=start;i<=len;i++)
ret+=resa[i]+'0';
return ret;
}
string max(string a,string b){
if(a.size()!=b.size()) return a.size()>b.size()?a:b;
return a>b?a:b;
}
string i_to_s(int x){
string ret="";
do{
ret+=x%10+'0';
}while(x/=10);
reverse(ret.begin(),ret.end());
return ret;
}
int main(){
scanf("%d",&n);
for(int i=0;i<=n;i++)
scanf("%ld%ld",&gamers[i].l,&gamers[i].r);
sort(gamers+1,gamers+n+1);
string ans="0";
string tmp=i_to_s(gamers[0].l);
for(int i=1;i<=n;i++){
ans=max(ans,div(tmp,gamers[i].r));
tmp=mul(tmp,i_to_s(gamers[i].l));
}
cout<<ans<<endl;
return 0;
}
評価結果
王は位置変更できないので、80点は、気付かなかった
100 ACのを
over.