[洛谷1080] 国王游戏{高精度+贪心}

题目

https://www.luogu.org/problemnew/show/P1080


解题思路

我们以 a i ∗ b i a_i*b_i aibi为关键字从小到大排序即可(至于为什么?除非让我告诉你,否则自己慢慢推,可以假设哟
同时,统计答案时一定不要忘了写高精度!

不得不说,我一直卡在高精度这个地方。 真的很烦,真心不知道那些不对拍(或者一次性就AC)的人是怎么样呢?总是会有一些莫名其妙的错误!!!

注意题目中的向下求整和范围


代码

#include
#include
#include
#define rr register 
#define M 20010
#define N 1010
using namespace std;
int n,a[M+10]={1,1},s[M+10],b[M+10]; 
struct node{int x,y; long long xy;}t[N];
inline bool cmp(node x,node y){return x.xy<y.xy;}
void mul(int x) {
    memset(b,0,sizeof(b));
    for(int i=1;i<=a[0];i++) {
        a[i]=a[i]*x;
        b[i+1]+=a[i]/10;
        a[i]%=10;
    }
    for(int i=1;i<=a[0]+4;i++) {
        a[i]+=b[i];
        if(a[i]>=10) {
            a[i+1]+=a[i]/10;
            a[i]%=10;
        }
        if(a[i]!=0) a[0]=max(a[0],i);
    }
}
void div(int x) {
    memset(b,0,sizeof(b));
    int q=0;
    for(int i=a[0];i>=1;i--) {
        q=(q*10)+a[i];
        b[i]=q/x;
        if(!b[0]&&b[i]!=0) b[0]=i;
        q%=x; 
    }
}
inline bool pare(){
    if(s[0]==b[0]) {
        for(int i=b[0];i>=1;i--) 
            if(b[i]>s[i]) return 1; else if(b[i]<s[i]) return 0;	
	}
    return (b[0]>s[0])?1:0;
}
void cc(){
    memset(s,0,sizeof(s));
    for(int i=b[0];i>=0;i--) s[i]=b[i];
    return;
}
int main(){
	scanf("%d",&n); 
	for(rr int i=0;i<=n;++i) scanf("%d%d",&t[i].x,&t[i].y),t[i].xy=t[i].x*t[i].y;
	sort(t+1,t+n+1,cmp); 
	for(rr int i=1;i<=n;++i) {
		mul(t[i-1].x); div(t[i].y); if (pare()) cc(); 
	}
	for(rr int i=s[0];i>=1;i--) printf("%lld",s[i]); 
} 

你可能感兴趣的:(高精度算法,贪心算法)