解题笔记,国王的游戏(高精度)

链接:https://ac.nowcoder.com/acm/problem/16640
来源:牛客网

题目描述
元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。
你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。
输入描述:

第 1 行包括一个整数 w,为每组纪念品价格之和的上限。
第 2 行为一个整数n,表示购来的纪念品的总件数。
第 3 ~ n+2 行每行包含一个正整数 pi ( 5 ≤ pi ≤ w ) ,表示所对应纪念品的价格。

输出描述:

包含一个整数,即最少的分组数目。

示例1
输入
复制

100
9
90
20
20
30
50
60
70
80
90

输出
复制

6

备注:

50%的数据满足:1 ≤ n ≤ 15
100%的数据满足:1 ≤ n ≤ 30000, 80 ≤ w ≤ 200
第一次,通过率60%

#include<bits/stdc++.h>
using namespace std;
struct minister{
	long long l,r;
}mi[10005];
int kl,kr;
int ans;
bool cmp(minister a,minister b){
	return a.l*a.r < b.l*b.r;
}
struct hint{
	char a;
	int lenth;
};
void mul(int l,string s){
	int i,j,a[100],b[100];
	string ga=l+'';
	int len1 = s.length();
	int len2 = ga.length();
	for(i = 1; i < len1; i++){
		a[i] = s[len1 - i] - '0';
	}
	for(i = 0; i < len2; i++){
		b[i] = ga[len2 - i] - '0';
	}
	for(i = 1; i <= len1; i++){
		for(j = 1; j <=len2; j++){
			c[i + j - 1] += a[j]*b[i];
		}
	}
	int lenc = lena + lenb - 1;
	int c[100];
	for(i = 1; i <= lenc; i++){
		c[i + 1] += c[i]/10;
		c[i]%=10;
	}
}

int main(){
	int n,i,j,now;
	scanf("%d",&n);
	scanf("%d %d",&kl,&kr);
	
	for(i = 0; i < n; i++){
		scanf("%d %d",&mi[i].l,&mi[i].r);
	}
	sort(mi, mi+n, cmp);
	string sum=kl;
	for(i = 0; i < n; i++){
		for(j = 0; j < i; j++){
			
			mul(mi[j].l,sum);
		}
		now = sum/mi[i].r;
		ans = max(ans,now);
	}
	printf("%d",ans);
	return 0;
}

第二次,加上了高精度乘法

#include<bits/stdc++.h>
using namespace std;
struct minister{
	char l[10];
	char r[10];
}mi[10005];
char kl[10],kr[10];
bool cmp(minister a,minister b){
	int i,nal=0,nar=0,nbl=0,nbr=0,t=1;
	for(i = strlen(a.l); i >= 0; i--){
		nal = nal + a.l[i]*t;
		t*=10;
	}
	t=1;
	for(i = strlen(a.r); i >= 0; i--){
		nar = nar + a.r[i]*t;
		t*=10;
	}
	t=1;
	for(i = strlen(b.l); i >= 0; i--){
		nbl = nbl + b.l[i]*t;
		t*=10;
	}
	t=1;
	for(i = strlen(b.r); i >= 0; i--){
		nbr = nbr + b.r[i]*t;
		t*=10;
	}
	return nal*nar < nbl*nbr;
}

void hmul(char a[],char b[]){
	int na[100],nb[100],nc[100]={0};
	int i,j;
	int len1 = strlen(a);
	int len2 = strlen(b);
	for(i = 1; i <= len1;i++){
		na[i] = a[len1 - i] - '0';
	}
	for(i = 1; i <= len2;i++){
		nb[i] = b[len2 - i] - '0';
	}
	for(i = 1; i <= len2; i++){
		for(j = 1; j <= len1; j++){
			nc[i+j-1] += na[j]*nb[i];
		}
	}
	int len3 = len1 + len2 - 1;
	for(i = 1; i <= len3; i++){
		nc[i + 1] += nc[i]/10;//累加进位 
		nc[i] = nc[i]%10;     //存余数 
	}
	len3++;
	
	while(nc[len3]==0 && len3>1){
		len3--;
	}
	for(i = len3-1; i >= 0; i--){
		a[i] = nc[i+1] + '0';
	}
	return;
}
//void hdiv(char bcs[],int cs,char ans[]){
	
//}
int main(){
	int n,i,j;
	scanf("%d",&n);
	scanf("%s %s",&kl,&kr);
	for(i = 0; i < n; i++){
		scanf("%s %s",&mi[i].l,&mi[i].r);
	}
	sort(mi,mi+n,cmp);
	char s[100];
	for(i = 0; i < n; i++){
		strcpy(s,kl);
		for(j = 0; j < i; j++){//乘前面所有的大臣的左手 
			hmul(s,mi[j].l);
		}
		printf("\ns : %s\n",s);
//		hdiv(s,mi[i].r,ans);
	}
	
	
	
	
/*	for(i = 0; i < n; i++){
		printf("%s %s\n",mi[i].l,mi[i].r);
	}*/
	
	return 0;
}

大佬的解题步骤:https://ac.nowcoder.com/acm/problem/blogs/16561

未解决的问题,高精度除法,高精度数的比较。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值