A32 贪心算法 P1080 [NOIP2012 提高组] 国王游戏

视频链接:82 贪心算法 [NOIP2012 提高组] 国王游戏_哔哩哔哩_bilibili

 

 

时间复杂度:排序 1000log1000,枚举 1000*4000

Luogu P1080 [NOIP2012 提高组] 国王游戏

复制代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

struct node{
  int a,b;
  bool operator<(node &t){
    return a*b<t.a*t.b;
  }
}p[1005]; //p[]存储每人的手中数
int m[4005],a[4005],t[4005];
int lm,la,lt;
//m[]存储乘积,a[]存储答案,t[]辅助存储

void mul(int m[],int b,int t[]){ //m*b=t
  for(int i=1;i<=lt;i++) t[i]=0;
  for(int i=1;i<=lm;i++) t[i]+=m[i]*b;
  lm+=4; //因为b<10000
  for(int i=1;i<lm;i++){
    t[i+1]+=t[i]/10;  //存进位
    t[i]%=10;         //存余数
  }
  while(t[lm]==0&&lm>1) lm--; //去0
  for(int i=1;i<=lm;i++) m[i]=t[i];
}
void div(int m[],int b,int t[]){ //m/b=t
  for(int i=1;i<=lt;i++) t[i]=0;
  int r=0;
  for(int i=lm;i>=1;i--){
    r=r*10+m[i];  //被除数
    t[i]=r/b;     //存商
    r%=b;         //余数
  }
  lt=lm;
  while(t[lt]==0&&lt>1) lt--; //去0
}
bool cmp(int a[],int t[]){
  if(la!=lt) return la<lt;
  for(int i=lt; i; i--)
    if(a[i]!=t[i]) return a[i]<t[i];
  return false; //相等时返回false
}
void upd(int a[],int t[]){
  if(cmp(a,t)){ //若a<t,更新答案
    for(int i=lt;i;i--) a[i]=t[i];
    la=lt;
  }
}
int main(){
  int n; scanf("%d",&n);
  for(int i=0;i<=n;i++)
    scanf("%d%d",&p[i].a,&p[i].b);
  sort(p+1,p+n+1);
  
  m[++lm]=p[0].a;
  for(int i=1; i<=n; i++){
    div(m,p[i].b,t);
    upd(a,t);
    mul(m,p[i].a,t);
  }
  for(int i=la;i;i--) cout<<a[i];
  return 0;
}
复制代码

 

复制代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

struct node{
  int a,b;
  bool operator<(node &t){
    return a*b<t.a*t.b;
  }
}p[1005]; //p[]存储每人的手中数
int m[4005],a[4005],t[4005];
int lm,la,lt;
//m[]存储乘积,a[]存储答案,t[]辅助存储

void mul(int m[],int b){ //m*b=m
  for(int i=1;i<=lm;i++) m[i]*=b;
  lm+=4; //因为b<10000
  for(int i=1;i<lm;i++){
    m[i+1]+=m[i]/10;  //存进位
    m[i]%=10;         //存余数
  }
  while(m[lm]==0&&lm>1) lm--; //去0
}
void div(int t[],int b){ //t/b=t
  lt=lm;
  for(int i=1;i<=lt;i++) t[i]=m[i];
  int r=0;
  for(int i=lt;i>=1;i--){
    r=r*10+t[i];  //被除数
    t[i]=r/b;     //存商
    r%=b;         //余数
  }
  while(t[lt]==0&&lt>1) lt--; //去0
}
bool cmp(int a[],int t[]){
  if(la!=lt) return la<lt;
  for(int i=lt;i;i--)
    if(a[i]!=t[i]) return a[i]<t[i];
  return false; //相等时返回false
}
void upd(int a[],int t[]){
  if(cmp(a,t)){ //若a<t,更新答案
    for(int i=lt;i;i--) a[i]=t[i];
    la=lt;
  }
}
int main(){
  int n; scanf("%d",&n);
  for(int i=0;i<=n;i++)
    scanf("%d%d",&p[i].a,&p[i].b);
  sort(p+1,p+n+1);
  
  m[++lm]=p[0].a;
  for(int i=1; i<=n; i++){
    div(t,p[i].b);
    upd(a,t);
    mul(m,p[i].a);
  }
  for(int i=la;i;i--) cout<<a[i];
  return 0;
}
复制代码

 

posted @   董晓  阅读(435)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示