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

排序方法的确定,只需任取两个人,通过比较与推导,可以得出ai*bi小的人排在前面;

高精度写的时候犯了些细节错误,详见注释。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAXN 200005
using namespace std;
typedef long long ll;//用long long!
ll n,ka,kb,ans[MAXN],tmp[MAXN],tmp2[MAXN],c[MAXN];
struct N{
ll a,b;
}p[];
bool cmp(N x,N y)
{
return x.a*x.b<y.a*y.b;
}
void chu(ll a[],ll b)
{
ll x=;
c[]=a[];
for(ll i=a[];i>;i--)//倒序存储,正序除
{
c[i]=(x*+a[i])/b;
x=(x*+a[i])%b;
}
while(c[c[]]==&&c[]>)c[]--;
}
void ch(ll a[],ll b)
{
ll x=;
for(ll i=;i<=a[];i++)//倒序乘
{
a[i]*=b;a[i]+=x;
x=a[i]/;
a[i]%=;
}
while(x)a[]++,a[a[]]=x%,x/=;
}
int com(ll a[],ll b[])
{
if(a[]>b[])return ;
if(a[]<b[])return -;
for(ll i=a[];i;i--)//倒序!
if(a[i]>b[i])return ;
return ;
}
void print(ll a[])
{
// if(a[a[0]]==0)//?
// {
// printf("1");
// return;
// }
printf("%lld",a[a[]]);
for(ll i=a[]-;i>;i--)
{
printf("%lld",a[i]/);
a[i]%=;
printf("%lld",a[i]/);
a[i]%=;
printf("%lld",a[i]/);
a[i]%=;
printf("%lld",a[i]);
}
}
int main()
{
scanf("%lld%lld%lld",&n,&ka,&kb);
for(ll i=;i<=n;i++)
scanf("%d%d",&p[i].a,&p[i].b);
sort(p+,p+n+,cmp);
tmp[]=;tmp[]=ka;//压位
for(ll i=;i<=n;i++)
{
memcpy(tmp2,tmp,sizeof tmp);
memset(c,,sizeof c);
chu(tmp2,p[i].b);
if(com(c,ans)>)memcpy(ans,c,sizeof c);//必须>0,否则-1也会被算!
ch(tmp,p[i].a);
}
print(ans);
return ;
}

这个运行起来有点慢,有些地方写得不够好,下面有一篇运行很快的代码,可以比较看看提速的方法。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int INF=;
typedef long long ll;
ll n,gb,ljc[],max,tmp[],ans[];
char tp[];
struct Node{
ll a,b,w;
}r[];
bool cmp(Node x,Node y)
{
return x.w<y.w;
}
void chu(ll b)
{
ll x=;
tmp[]=ljc[];
for(ll i=ljc[];i;i--)
{
ll s=ljc[i]+x*INF;
tmp[i]=s/b;
x=s%b;
}
while(!tmp[tmp[]]&&tmp[]>)tmp[]--;
}
bool comp(ll ans[],ll b[])
{
if(ans[]>b[])return ;
if(ans[]<b[])return ;
for(ll i=ans[];i;i--)
{
if(ans[i]>b[i])return ;
if(ans[i]<b[i])return ;
}
return ;
}
void mul(ll a)
{
ll x=;
for(ll i=;i<=ljc[];i++)
{
ll s=ljc[i]*a+x;
x=s/INF;
ljc[i]=s%INF;
}
if(x)ljc[]++,ljc[ljc[]]=x;//至多进一位
}
int main()
{
scanf("%lld%lld%lld",&n,&ljc[],&gb);
ljc[]=;
for(ll i=;i<=n;i++)
{
scanf("%lld%lld",&r[i].a,&r[i].b);
r[i].w=r[i].a*r[i].b;
}
sort(r+,r+n+,cmp);
for(ll i=;i<=n;i++)
{
memset(tmp,,sizeof tmp);
chu(r[i].b);
if(comp(ans,tmp))memcpy(ans,tmp,sizeof tmp);
mul(r[i].a);
}
printf("%lld",ans[ans[]]);
for(ll i=ans[]-;i;i--)
{
printf("%lld",ans[i]/);
printf("%lld",ans[i]/%);
printf("%lld",ans[i]/%);
printf("%lld",ans[i]%);
}
return ;
}

最新文章

  1. ServletConfig对象和它在开发中的应用场
  2. Android 随想录之 Android 系统架构
  3. BZOJ 1951 古代猪文
  4. .net发送邮件代码示例
  5. 小白日记9:kali渗透测试之主动信息收集(二)四层发现:TCP、UDP、nmap、hping、scapy
  6. CLI结果输出
  7. MFC之树控件
  8. Eidtplus常用快捷键
  9. MySQL和Oracle开发差异
  10. 【Machine Learning in Action --5】逻辑回归(LogisticRegression)从疝气病预测病马的死亡率
  11. 搬砖的也能学Python----if - elif 语句
  12. springboot添加邮件发送及压缩功能
  13. debugfs
  14. 转载博文: Py西游攻关之IO model
  15. unity室内外VR漫游
  16. python-函数入门(一)
  17. 我与Vuex的第一次邂逅
  18. postman管理收藏夹,批量执行接口
  19. adb shell pm list packages的用法
  20. jquery另外一种类似tab切换效果

热门文章

  1. javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist:
  2. 规范-Git打标签与版本控制
  3. JSP——Web应用
  4. JQ动态获取数据
  5. 仿易讯clientloading效果
  6. PostgreSQL 封装操作数据库方法
  7. java jdbc 同时操作查询删除操作
  8. python 基础 2.2 if流程控制(二)
  9. jquery在网页实时显示时间;
  10. 2017-01-20_dp测试