2015.9.11模拟赛 codevs 4160【会玩的】

news/2024/11/24 6:16:20/
题目描述  Description

hzwer真的很会玩啊…他有一个n*m的方格,每次可以给方格添加一整行或一整列,但是不能删除。现在他想要让总格子数超过k个,但是又想让总格子数尽可能小。请找出这时的n,m。如果有多解,输出任意一种方案。

 

输入描述  Input Description

一行3个数n,m,k。

输出描述  Output Description

第一行一个数ans,表示此时的方格数。

第二行两个数m’,n’,表示此时的行数列数。如果有多解,输出任意一种方案

样例输入  Sample Input

3 5 18

 

样例输出  Sample Output

18

3 6

 

数据范围及提示  Data Size & Hint

对于100%数据,1<=m,n<=10^9,1<=k<=10^12.

 

题意是给定n,m,k,要求找到a>=n,b>=m,使得a*b>=k且a*b最小。如果有多解,输出a,b字典序最小的方案。

n*m>=k时,可以直接退出

否则n*m<k

考虑固定一个数a,则另一个数最小是k/a.那么可以用(a,k/a)来更新答案。
如果枚举a,那么只要到sqrt(k)即可。因为我们从1到a枚举,如果有k/a<a,那么一定k/a已经被枚举过。这个状态就没有意义了

因此一个一个for到sqrt(k)即可

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<ctime>
 8 #define LL long long
 9 using namespace std;
10 LL n,m,k;
11 bool rev;
12 inline LL read()
13 {
14     LL x=0,f=1;char ch=getchar();
15     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
16     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
17     return x*f;
18 }
19 int main()
20 {
21     n=read();m=read();k=read();
22     if (n>m)swap(n,m),rev=1;
23     if (n*m>=k)
24     {
25         printf("%lld\n%lld %lld",n*m,n,m);
26         return 0;
27     }
28     while (1)
29     {
30         bool mrk=0;LL a=0;
31         for (int i=n;i<=sqrt(k);i++)
32           if (k%i==0&&k/i>=m)
33           {
34               mrk=1;
35               a=i;
36               break;
37           }
38         if (mrk)
39         {
40             if (!rev)printf("%lld\n%lld %lld",k,a,k/a);
41             else printf("%lld\n%lld %lld",k,k/a,a);
42             return 0;
43         }else k++;
44     }
45 }
codevs4160

 

转载于:https://www.cnblogs.com/zhber/p/4802275.html


http://www.ppmy.cn/news/325680.html

相关文章

洛谷P4160 生日快乐

这道题是标准的暴力深搜&#xff0c;思想如下&#xff1a; 因为每一块蛋糕的面积都要相同&#xff0c;因此切分成最小块的蛋糕的长度应该为x/n的整数倍&#xff0c;如图&#xff1a; 这样&#xff0c;一块蛋糕就被分成了两部分&#xff0c;分别是我们所需的最小单元的 i i i…

BZOJ1024洛谷P4160 [SCOI2009]生日快乐

搜索等分点&#xff0c;看在哪部分找就行了 代码 //By AcerMo #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const double M1e97; int n; double a,b; double minn(double x,double y) {if (x&…

洛谷 P4160 [SCOI2009]生日快乐

PS&#xff1a;如果读过题了可以跳过题目描述直接到题解部分 提交链接&#xff1a;洛谷 P4160 [SCOI2009]生日快乐 题目 题目描述 windy 的生日到了&#xff0c;为了庆祝生日&#xff0c;他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕。 现在包括 windy&#xff0c…

BZOJ.4160.[NEERC2009]Exclusive Access 2(状压DP Dilworth定理)

BZOJ DAG中&#xff0c;根据\(Dilworth\)定理&#xff0c;有 \(最长反链最小链覆盖\)&#xff0c;也有 \(最长链最小反链划分数-1\)&#xff08;这个是指最短的最长链&#xff1f;并不是很确定-&#xff09;&#xff0c;即把所有点划分成最少的集合&#xff0c;使得集合内的点两…

luogu P4160 [SCOI2009]生日快乐

传送门 考虑因为每个人的蛋糕体积要相等,如果切了一刀,那么要使得分当前蛋糕的人根据分成的两部分蛋糕的体积分成两部分人,所以假设当前有n人,切的这一刀要是在x或y的\(\frac{k}{n}(k\in N_,k\in [1,n])\)处,然后两边分别有\(k\)和\(n-k\)个人分,所以分治做下去救星了 更多内容…

2023-06-11 LeetCode每日一题(从链表中删去总和值为零的连续节点)

2023-03-29每日一题 一、题目编号 1171. 从链表中删去总和值为零的连续节点二、题目链接 点击跳转到题目位置 三、题目描述 给你一个链表的头节点 head&#xff0c;请你编写代码&#xff0c;反复删去链表中由 总和 值为 0 的连续节点组成的序列&#xff0c;直到不存在这样…

[BZOJ]4160: [Neerc2009]Exclusive Access 2 状压DP+Dilworth定理

Description 给出 N 个点M 条边的无向图&#xff0c;定向得到有向无环图&#xff0c;使得最长路最短。 N ≤ 15, M ≤ 100 Solution 大家都知道Dilworth定理的其中一个内容&#xff1a;最小路径覆盖最长反链。 实际上与之相似的是&#xff1a;最长路最小反链划分数。 这个东…

P4160 [SCOI2009]生日快乐

传送门 一看 $n$ 这么小&#xff0c;搜就完事了... 因为最后每块小蛋糕面积固定&#xff0c;所以每次切完面积都必须是小蛋糕面积的倍数 那么最多只有第一次有 $10$ 个位置&#xff0c;之后越来越少&#xff0c;复杂度很低 然后注意不要乱剪枝...&#xff0c;每次切不一定只切长…