Codeforces Round #266 (Div.2) B Wonder Room --枚举

题意:给出一个两边长为a,b的矩形,要求增加a和增加b使a*b>=6*n且a*b最小。

解法:设新的a,b为a1,b1,且设a<b,那么a<=a1<=ceil(sqrt(6*n)),那么我们可以枚举a1,然后算出b1,如果b1<b,那么b1 = b,然后算出面积,取所有面积的最小值不就可以了,然后再枚举一次b1,处理与之相同即可。

复杂度O(sqrt(n))

代码:

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define lll __int64
using namespace std;

int main()
{
    lll n,a,b;
    lll mini,a1,b1;
    while(scanf("%I64d%I64d%I64d",&n,&a,&b)!=EOF)
    {
        mini = (1LL<<62);
        lll sum = (lll)6*n;
        for(lll i=a;i<=a+50000LL;i++)
        {
            lll tb = sum/i + (sum%i!=0);
            tb = max(b,tb);
            lll tarea = i*tb;
            if(tarea < mini)
            {
                mini = tarea;
                a1 = i;
                b1 = tb;
            }
        }
        for(lll i=b;i<=b+50000LL;i++)
        {
            lll ta = sum/i + (sum%i!=0);
            ta = max(a,ta);
            lll tarea = i*ta;
            if(tarea < mini)
            {
                mini = tarea;
                a1 = ta;
                b1 = i;
            }
        }
        cout<<mini<<endl<<a1<<" "<<b1<<endl;
    }
    return 0;
}

时间: 2024-11-25 06:28:15

Codeforces Round #266 (Div.2) B Wonder Room --枚举的相关文章

Codeforces Round #266 (Div. 2)B(暴力枚举)

很简单的暴力枚举,却卡了我那么长时间,可见我的基本功不够扎实. 两个数相乘等于一个数6*n,那么我枚举其中一个乘数就行了,而且枚举到sqrt(6*n)就行了,这个是暴力法解题中很常用的性质. 这道题找出a和b中最小的那个,然后开始枚举,一直枚举到sqrt(6*n)的向上取整.这样所有可能是答案的情况都有啦.再干别的都是重复的或者肯定不是最小面积的. #include<iostream> #include<cstdio> #include<cstdlib> #includ

Codeforces Round #266 (Div. 2)

Codeforces Round #266 (Div. 2) 题目链接 A:就简单的判断一下那种更大即可 B:枚举x到sqrt(n),然后可以直接算出y,然后判断一下即可 C:先判断和是否是3的倍数,然后预处理出前缀和出现位置和后缀和对应sum / 3个数,然后从头往后扫一遍把当前一个和后面进行组合即可 D:先预处理出差分,使得数组表示线段的添加方式,然后每次有一个-1,就能和前面多少个1进行匹配,方案数就乘上多少,如果是0,就能和前面+1个匹配 E:利用并查集,把每次询问拆分成2个部分,起点到

Codeforces Round #266 (Div. 2) A

题目: A. Cheap Travel time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Ann has recently started commuting by subway. We know that a one ride subway ticket costs a rubles. Besides, Ann found ou

Codeforces Round #266 (Div. 2)C. Number of Ways

传送门 Description You've got array a[1], a[2], ..., a[n], consisting of n integers. Count the number of ways to split all the elements of the array into three contiguous parts so that the sum of elements in each part is the same. More formally, you nee

Codeforces Round #266 (Div. 2)-C,D

C - Number of Ways 直接暴力从前往后寻找.假设找到1/3sum的位置,那么标记++.找到2/3的位置,总数加上标记数. #include<stdio.h> #include<iostream> #include<stdlib.h> #include<string.h> #include<algorithm> #include<vector> #include<math.h> #include<que

Codeforces Round #266 (Div. 2) A. Cheap Travel

Ann has recently started commuting by subway. We know that a one ride subway ticket costs a rubles. Besides, Ann found out that she can buy a special ticket for m rides (she can buy it several times). It costs b rubles. Ann did the math; she will nee

Codeforces Round #266 (Div. 2) B. Wonder Room

The start of the new academic year brought about the problem of accommodation students into dormitories. One of such dormitories has a a?×?b square meter wonder room. The caretaker wants to accommodate exactly n students there. But the law says that

Codeforces Round #266 (Div. 2) D. Increase Sequence

Peter has a sequence of integers a1,?a2,?...,?an. Peter wants all numbers in the sequence to equalh. He can perform the operation of "adding one on the segment[l,?r]": add one to all elements of the sequence with indices froml to r (inclusive).

Codeforces Round #352 (Div. 2) C. Recycling Bottles(枚举)

思路:分析完这道题后会发现  当两个人捡到第一个瓶子后, 之后走的路的最小值都是不会变的了. 所以只要找出两个走到各自的第一个瓶子是最小值的情况的时候(其中还有一个人不走,一个人走的情况).   如果当有两个人或有一个人到其第一个瓶子的权值大于瓶子到回收点时,选取权值小的那个. 而且计算最小值的时候 只需取出两个权值数组中最小的两个数 即可 不用全部遍历来选取. #include<iostream> #include<cstdio> #include<cmath> #i