您的位置:首页 > 其它

NOIP2012 国王游戏

2015-06-13 21:51 357 查看
题目:http://www.luogu.org/problem/show?pid=1080

分析:贪心算法,可以证明正确性。

一开始只拿了60分,写了错解的贪心,后来看题解才明白。

需要高精度,可以用压位优化.

证明:



代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int Tmax=1005;
struct node {
int l,r;
};
node data[Tmax];
int n,ans[Tmax],sum[Tmax],tmp[Tmax];
void output()
{
printf("%d",ans[ans[0]]);
ans[0]--;
for(;ans[0]>=1;ans[0]--)
printf("%4.4d",ans[ans[0]]);
return;
}
bool cmp2()
{
if(ans[0]<tmp[0]) return true;
if(ans[0]>tmp[0]) return false;
int i=ans[0];
while(i>=1){
if(ans[i]<tmp[i]) return true;
i--;
}
return false;
}
void div(int x)
{
int i,k=0;
for(i=sum[0];i>=1;i--)
{
tmp[i]=sum[i]+k*10000;
k=tmp[i]%x;
tmp[i]/=x;
}
tmp[0]=sum[0];
while(tmp[tmp[0]]==0) tmp[0]--;
if(cmp2()==true) memcpy(ans,tmp,sizeof(tmp));
return;
}
void mul(int x)
{
int k=0,i;
for(i=1;i<=sum[0]||k;i++)
{
sum[i]=sum[i]*x+k;
k=sum[i]/10000;
sum[i]%=10000;
}
sum[0]=i-1;
return;
}
void init()
{
int t=data[0].l*data[1].l;
while(t>0)
{
sum[++sum[0]]=t%10000;
t/=10000;
}
t=data[0].l/data[1].r;
while(t>0)
{
ans[++ans[0]]=t%10000;
t/=10000;
}
return;
}
bool cmp(const node &a,const node &b)
{
return (a.l*a.r<b.l*b.r);
}
int main()
{
int i;
scanf("%d",&n);
for(i=0;i<=n;i++){
scanf("%d %d",&data[i].l,&data[i].r);
}
sort(data+1,data+1+n,cmp);
init();//ans=data[0].l/data[1].r;//sum=data[0].l*data[1].l;
for(i=2;i<=n;i++){
div(data[i].r);//ans=max(ans,sum/data[i].r);
mul(data[i].l);//sum*=data[i].l;
}
output();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: