社区讨论
萌新求助!! 只有80分 调了一下午也调不对
P1080[NOIP 2012 提高组] 国王游戏参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lob62uix
- 此快照首次捕获于
- 2023/10/29 15:46 2 年前
- 此快照最后确认于
- 2023/11/03 22:03 2 年前
CPP
#include <iostream>
#include <cstring>
using namespace std;
typedef long long ll;
struct node{int x,y;};
node a[1005],b[1005];
void msort(int l,int r){
if(l==r) return;
int mid=(l+r)/2,i=l,j=mid+1,k=l;
msort(l,mid),msort(mid+1,r);
while(i<=mid and j<=r){
if(ll(a[i].x*a[i].y)>=ll(a[j].x*a[j].y)) b[k++]=a[j++];
else b[k++]=a[i++];
}
while(i<=mid) b[k++]=a[i++];
while(j<=r) b[k++]=a[j++];
for(int p=l;p<=r;p++) a[p]=b[p];
}
int num[2005],res[2005],ans[2005];
void mul(int x){
for(int i=1;i<=2000;i++) num[i]*=x;
for(int i=2000;i>=1;i--){
num[i-1]+=num[i]/10;
num[i]%=10;
}
}
void div(int x){
memset(res,0,sizeof(res));
int i=1,left=0;
while(!num[i])i++;
while(i<=2000){
int temp=left;
while(temp<x) temp=temp*10+num[i++];
res[i-1]=temp/x;
left=temp%x;
}
}
bool great(){
for(int i=1;i<=2000;i++)
if(res[i]>ans[i]) return true;
else if(res[i]<ans[i]) return false;
return true;
}
void print(){
int z=1;
while(!ans[z] and z<=2000) z++;
if(z>2000) cout<<0;
else for(int i=z;i<=2000;i++) cout<<ans[i];
cout<<endl;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n+1;i++) cin>>a[i].x>>a[i].y;
msort(2,n+1);
num[2000]=1;
for(int i=2;i<=n+1;i++){
mul(a[i-1].x);
div(a[i].y);
if(great()) for(int i=1;i<=2000;i++) ans[i]=res[i];
}
print();
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...