zoukankan      html  css  js  c++  java
  • 国王游戏sol

    国王游戏
    贪心策略较为简单,可以邻项考虑,式子化简后按照x*y排序即可
    要用到高精度乘除。。

    #include<bits/stdc++.h>
    #define fi first
    #define se second
    #define pb push_back
    #define mp make_pair
    #define SZ(x) ((int)x.size())
    #define ALL(x) x.begin(),x.end()
    #define U(i,u) for(register ll i=head[u];i;i=nxt[i])
    #define rep(i,a,b) for(register ll i=(a);i<=(b);++i)
    #define per(i,a,b) for(register ll i=(a);i>=(b);--i)
    using namespace std;
    typedef long double ld;
    typedef long long ll;
    typedef unsigned int ui;
    typedef pair<int,int> PII;
    typedef vector<int> VI;
    template<class T> inline void read(T &x){
    	x=0;char c=getchar();int f=1;
    	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
    	while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=f;
    }
    template<class T> inline void cmin(T &x, T y){x=x<y?x:y;}
    template<class T> inline void cmax(T &x, T y){x=x>y?x:y;}
    const int N=200001;
    int n;
    int tim[N],ans[N],mx[N],tmp[N];
    struct node{
    	int x,y;
    }d[N];
    bool cmp(node a,node b){
    	return a.x*a.y<b.x*b.y;
    }
    void mul(int a[],int b){
    	int len1=a[0],len2=len1;
    	memset(tmp,0,sizeof(tmp));
    	rep(i,1,len1){
    		tmp[i]+=a[i]*b;
    		tmp[i+1]+=tmp[i]/10;
    		tmp[i]%=10;
    	}
    	while(tmp[len2+1]>0){
    		++len2;
    		tmp[len2+1]+=tmp[len2]/10;
    		tmp[len2]%=10;
    	}
    	tim[0]=len2;rep(i,1,len2){tim[i]=tmp[i];}
    }
    void div(int a[],int b,int c[]){
    	memset(ans,0,sizeof(ans));
    	int len=a[0],d=0;per(i,len,1){
    		c[i]=(d*10+a[i])/b;
    		d=(d*10+a[i])%b;
    		if(c[0]==0&&c[i]!=0)c[0]=i;
    	}
    	ans[0]=c[0];rep(i,1,c[0])ans[i]=c[i];
    }
    bool compare(int a[],int b[]){
    	if(a[0]==b[0]){
    		per(i,a[0],1){
    			if(a[i]>b[i])return 1;
    			if(a[i]<b[i])return 0;
    		}
    	}
    	if(a[0]>b[0])return 1;
    	else if(a[0]<b[0])return 0;
    	else return 0;
    }
    void cp(){
    	memset(mx,0,sizeof(mx));
    	mx[0]=ans[0];rep(i,1,mx[0]){
    		mx[i]=ans[i];
    	}
    }
    int main(){
    	read(n);rep(i,1,n+1){
    		read(d[i].x);read(d[i].y);
    	}
    	sort(d+2,d+n+2,cmp);
    	tim[0]=1;tim[1]=1;
    	mul(tim,d[1].x);
    	rep(i,2,n+1){		
    		div(tim,d[i].y,ans);
    		if(compare(ans,mx)){
    			cp();
    		}
    		mul(tim,d[i].x);
    	}
    	per(i,mx[0],1){
    		printf("%d",mx[i]);
    	}
    	return 0;
    }
    
  • 相关阅读:
    制作文件的备份
    文件的读写
    文件的打开与关闭
    文件操作介绍
    数据类型转换
    位运算
    进制
    函数使用注意事项
    匿名函数
     递归函数
  • 原文地址:https://www.cnblogs.com/hangzz/p/13387227.html
Copyright © 2011-2022 走看看