链接: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