列表

详情


KS11. latex爱好者

描述

latex自然是广大研究人员最喜欢使用的科研论文排版工具之一。
月神想在 iPhone 上查阅写好的 paper ,但是无奈 iPhone 上没有月神喜欢使用的阅读软件,于是月神也希望像 tex 老爷爷 Donald Knuth 那样自己动手do it yourself一个。
在 DIY 这个阅读软件的过程中,月神碰到一个问题,已知 iPhone 屏幕的高为 H ,宽为 W, 若字体大小为 S (假设为方形),则一行可放 W / S (取整数部分)个文字,一屏最多可放 H / S (取整数部分)行文字。
已知一篇 paper 有 N 个段落,每个段落的文字数目由 a1, a2, a3,...., an 表示,月神希望排版的页数不多于 P 页(一屏显示一页),那么月神最多可使用多大的字体呢?

数据范围: ,

输入描述

每个测试用例的输入包含两行。

第一行输入N,P,H,W

第二行输入N个数a1,a2,a3,...,an表示每个段落的文字个数。

输出描述

对于每个测试用例,输出最大允许的字符大小S

示例1

输入:

1 10 4 3 
10

输出:

3

示例2

输入:

2 10 4 3
10 10

输出:

2

原站题解

C 解法, 执行用时: 2ms, 内存消耗: 360KB, 提交时间: 2020-05-10

#include <stdio.h>
#include <math.h>
int main(){
    int n,p,s;
    double h,w;
    scanf("%d %d %lf %lf",&n,&p,&h,&w);
    int i,j,nh,nw,max;
    double a[n],num1=0;
    for(i=0;i<n;i++)
    {
        scanf("%lf",&a[i]);
    }
    for(i=1;i<100;i++)
    {
        s=i;
        nw=floor(w/s);      
        nh=floor(h/s);
        num1=0;
        for(j=0;j<n;j++)
        {
            num1=num1+ceil(a[j]/nw);
        }
        num1=(double)num1;
        if(ceil(num1/nh)>p)
        { max=i-1;
            break;
        }
    }
    printf("%d",max);
}

C 解法, 执行用时: 2ms, 内存消耗: 364KB, 提交时间: 2020-04-29

#include <stdio.h>
#include <math.h>
int main(){
    int n,p,s;
    double h,w;
    scanf("%d %d %lf %lf",&n,&p,&h,&w);
    int i,j,nh,nw,max;
    double a[n],num1=0;
    for(i=0;i<n;i++)
    {
        scanf("%lf",&a[i]);
    }
    for(i=1;i<100;i++)
    {
        s=i;
        nw=floor(w/s);        
        nh=floor(h/s); 
        num1=0;
        for(j=0;j<n;j++)
        {
            num1=num1+ceil(a[j]/nw);
        }
        num1=(double)num1;
        if(ceil(num1/nh)>p)
        { max=i-1;
            break;
        } 
    }
    printf("%d",max);
}

C++14 解法, 执行用时: 2ms, 内存消耗: 368KB, 提交时间: 2020-05-18

#include <stdio.h>
#include <math.h>
int main(){
    int n,p,s;
    double h,w;
    scanf("%d %d %lf %lf",&n,&p,&h,&w);
    int i,j,nh,nw,max;
    double a[n],num1=0;
    for(i=0;i<n;i++)
    {
        scanf("%lf",&a[i]);
    }
    for(i=1;i<100;i++)
    {
        s=i;
        nw=floor(w/s);        
        nh=floor(h/s); 
        num1=0;
        for(j=0;j<n;j++)
        {
            num1=num1+ceil(a[j]/nw);
        }
        num1=(double)num1;
        if(ceil(num1/nh)>p)
        { max=i-1;
            break;
        } 
    }
    printf("%d",max);
}

C 解法, 执行用时: 2ms, 内存消耗: 368KB, 提交时间: 2019-08-01

#include<stdio.h>
#include<math.h>

int main()
{
	int i,j,n,p,h,w,s_test,max_square,sum_words,h_max_all,h_max_sum,w_max;
	float s_start;
	int *parr;
	scanf("%d%d%d%d",&n,&p,&w,&h);
	parr=(int *)malloc(n*sizeof(int));
	sum_words=0;
	for(i=0;i<n;i++){
		scanf("%d",&parr[i]);
		sum_words+=parr[i];
	}
	max_square=h*w*p;
	s_start=pow((float)max_square/(float)sum_words,0.5);
	s_test=(int)s_start;
	// printf("out of while() s_start:%f,s_test:%d\n",s_start,s_test);
	while(1){
		w_max=w/s_test;
		h_max_all=h/s_test*p;
		h_max_sum=0;
		for(i=0;i<n;i++){
			if(parr[i]%w_max){
				h_max_sum+=parr[i]/w_max+1;
				// printf("%d\t",parr[i]/w_max+1);
			}
			else
			{
				h_max_sum+=parr[i]/w_max;
				// printf("%d\t",parr[i]/w_max);
			}
			
		}
		// printf("\ns_test:%d,w_max:%d,h_max_all:%d,h_max_sum:%d\n",s_test,w_max,h_max_all,h_max_sum);
		if(h_max_sum<=h_max_all)
			break;
		s_test--;
	}
	free(parr);
	parr=NULL;
	printf("%d\n",s_test);
	return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 372KB, 提交时间: 2019-10-03

#include <stdio.h>
#include <math.h>
int main(){
    int n,p,s;
    double h,w;
    scanf("%d %d %lf %lf",&n,&p,&h,&w);
    int i,j,nh,nw,max;
    double a[n],num1=0;
    for(i=0;i<n;i++)
    {
        scanf("%lf",&a[i]);
    }
    for(i=1;i<100;i++)
    {
        s=i;
        nw=floor(w/s);          
        nh=floor(h/s);   
        num1=0;
        for(j=0;j<n;j++)
        {
            num1=num1+ceil(a[j]/nw);
        }
        num1=(double)num1;
        if(ceil(num1/nh)>p) 
        { max=i-1;
            break;
        }   
    }
    printf("%d",max);
}

上一题