似乎写了高精,又好像没写
查看原帖
似乎写了高精,又好像没写
388602
CA_FZZSL楼主2023/10/11 14:37
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<math.h>
#include<cstring>
using namespace std;

long long n,l[1005],r[10005],digit_all,digit_ans=0;
long long ad[1000005],ans[1000005],tans[1000005];

int maxx1(long long k){
	double a,b;
	a=1/r[k];
	b=l[k]/r[k+1];
	return floor(max(a,b));
}

int maxx2(long long k){
	double a,b;
	a=1/r[k+1];
	b=l[k+1]/r[k];
	return floor(max(a,b));
}

void found(){
	for(int s=1;s<=digit_all;s++)
		cout<<ad[s];
	cout<<endl;
	return;
}

void a_found(){
	for(int s=1;s<=digit_all;s++)
		cout<<ans[s];
	cout<<endl;
	return;
}

void ta_found(){
	for(int s=1;s<=digit_ans;s++)
		cout<<tans[s];
	return;
}

void equal(long long rx){
	
	long long digit=0,rz=rx;
	
	while(rz>0){
		digit++;
		rz/=10;
	}
	digit_all=digit;
	
	for(int i=1;i<=digit;i++){
		ad[i]=rx%10;
		rx/=10;
	}
	
	return;
}

void times(long long rx){
	
	for(int i=1;i<=digit_all;i++){
		ad[i]*=rx;
	}
	
	for(int i=1;ad[i+1]>=10;i++){
		ad[i+1]+=ad[i]/10;
		ad[i]%=10;
		if(i>digit_all)digit_all++;
	}
	
	return;
	
}

void division(long long rx){
	
	long long d_digit=0;
	bool d_flag=0;
	
	for(int i=digit_all;i>=1;i--){
		//cout<<"adi:"<<ad[i]<<endl;
		//cout<<"rx:"<<rx<<endl;
		ans[i]=ad[i]/rx;
		//cout<<"ansi:"<<ans[i]<<endl;
		if(ans[i]>0||d_flag){
			d_digit++;
			d_flag=1;
		}
		
		ad[i]%=rx;
		ad[i-1]=ad[i]*10;
	}
	
	digit_all=d_digit;
	
	return;
}

void replace(){
	
	digit_ans=digit_all;
	memset(tans,0,sizeof(tans));
	
	for(int i=1;i<=digit_ans;i++)
		tans[i]=ans[i];
		
	return;
}

void compare(){
	
	if(digit_all==0||digit_ans>digit_all)
		return;
	
	if(digit_ans==0||digit_all>digit_ans){
		replace();
		return;
	}
	
	for(int i=digit_ans;i>=1;i--){
		if(ans[i]>tans[i]){
			replace();
			return;
		}
	}
	
	return;
}


int main(){
	
	scanf("%d",&n);
	for(int i=1;i<=n+1;i++){
		scanf("%d%d",&l[i],&r[i]);
	}
	
	
	for(int j=2;j<n+1;j++){
		for(int i=j;i<n+1;i++){
			if(maxx2(i)<maxx1(i)){
				swap(r[i],r[i+1]);
				swap(l[i],l[i+1]);
			}
		}
	}
	
	/*
	for(int i=1;i<=n+1;i++){
		printf("The %d left is: %d\n",i,l[i]);
		printf("The %d right is: %d\n",i,r[i]);
	}
	cout<<endl;
	*/
	
	for(int i=2;i<=n+1;i++){
		memset(ad,0,sizeof(ad));
		//cout<<"The man:"<<i<<endl;
		equal(l[i-1]);
		//cout<<"The first:";
		//found();
		//cout<<"The man first:"<<p<<endl;
		for(int j=i-2;j>=1;j--){
			/*//cout<<"The double left:"<<l[j]<<endl;
			cout<<"f1:";
			found();
			cout<<"l[j]="<<l[j]<<endl;*/
			times(l[j]);
			/*cout<<"f2:";
			found();
			cout<<endl<<endl;
			//printf("left:%d\n",p);*/
		} 
		
		division(r[i]);
		//a_found();
		//printf("left ans:%d\n",p);
		compare();
		//ans=max(p,ans);!!
	}
	
	//printf("%d",ans);!!
	
	if(digit_ans==0){
		cout<<0;
		return 0;
	}
	
	ta_found();
	
	return 0;
} 

交了之后和交之前没区别……还是50分……

2023/10/11 14:37
加载中...