[noip2012]国王游戏<贪心+高精度>

时间:2022-05-19 19:15:47

题目链接:

https://vijos.org/p/1779

https://www.luogu.org/problem/show?pid=1080

http://codevs.cn/problem/1198/

终于过了。。。。。这道高精度总算是过了,为了这道题我还特意去学了高精度除以搞精度(虽然最后只需要高精度除以低精度)

这道题都是看新番国王游戏的时候突发奇想跑来做的QAQ。。。。

这道题的贪心思路是,按照左右手相乘来从小到大排序,乘积相同就按照右手从小到大。。。

至于为什么这么贪心,我个人的想法是,将右手数大的尽量排后面(除数比较大),然后也要让左手大的靠后(被除数小),

具体的证明可以看看这个博客:http://www.cnblogs.com/OIerLYF/p/7306156.html

然后排了序就是高精度除法,然后和当前的ans来比较,接着高精度乘法。。。

 #include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<queue>
#include<stack>
#define maxn 10005
using namespace std;
int n;
struct node{
int l,r,sum;
}e[maxn];
int comp(const void*a,const void*b){
if((*(struct node*)a).sum==(*(struct node*)b).sum)
return (*(struct node*)a).r>(*(struct node*)b).r?:-;
return (*(struct node*)a).sum>(*(struct node*)b).sum?:-;
} int ans[maxn],s[maxn],val[maxn]; void div(int s[],int q,int val[])
{
int rest=,tot=,p[maxn];
for(int i=;i<=s[];i++){
p[i]=s[s[]-i+];
}p[]=s[];
rest=p[];int i=;
while(rest<q&&i<=p[]){
rest=rest*+p[i];
i++;
}
if(rest<q){val[]=;val[]=;return ;}
else{
tot++;val[tot]=rest/q;
while(i<=p[]){
rest=rest%q*+p[i];
i++;
tot++;
val[tot]=rest/q;
}
}
val[]=tot;
} void change(){
for(int i=;i<=val[];i++)
ans[i]=val[i];
} void compare(int val[],int ans[]){
if(val[]>ans[]){
change();
}else{
if(val[]==ans[]){
for(int i=;i<=val[];i++){
if(val[i]>ans[i]){
change();
return;
}else return;
}
}
}
} void mul(int s[],int k){
for(int i=;i<=s[];i++){s[i]*=k;}
for(int i=;i<=s[];i++){
if(s[i]>=){
s[i+]+=s[i]/;
s[i]=s[i]%;
}
}
while(s[s[]+]){
s[]++;
s[s[]+]+=s[s[]]/;
s[s[]]%=;
}
} int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d",&e[i].l,&e[i].r);
e[i].sum=e[i].l*e[i].r;
}
qsort(e+,n,sizeof(e[]),comp);
int k=e[].l,tot=;
while(k){tot++;s[tot]=k%;k/=;}
s[]=tot;
for(int i=;i<=n;i++){
memset(val,,sizeof(val));
div(s,e[i].r,val);
compare(val,ans);
mul(s,e[i].l);
}
for(int i=;i<=ans[];i++)
printf("%d",ans[i]);
}

【总结】

回顾了一下历年的考题,发现高精度其实考的不是很多。。但是这还是挺重要的方法,可以去学学。。

这一份代码中的高精度除以低精度都是我从今年noip2017提高组初赛试题学到的。。另外我顺便还积累了高精度除以高精度,确实很有用。。

然后卡了我很久的错误点就是那个比较环节。。。。比较环节位数相同时,逐位比较,有一位小于等于ans就break,不然就替换。。我就是忘记了跳出,所以一直卡着剩下的40%数据过不了