问题 C: 折纸

时间限制: 1 Sec  内存限制: 128 MB
[提交] [状态]

题目描述

现有一个W*H的矩形纸张,求至少要折多少次才能使矩形纸张变成w*h的矩形纸张。注意,每次的折痕都要平行于纸张的某一条边。

输入

第一行,包括两个整数W,H。
第二行,包括两个整数w,h。

输出

输出一个整数,表示至少需要折的次数。若无解,则输出-1。

样例输入
Copy

【样例1】
2 7
2 2
【样例2】
5 5
1 6
【样例3】
10 6
4 8

样例输出 Copy

【样例1】
2
【样例2】
-1
【样例3】
2

提示

对于20%的数据,W=w且H,h<=3。
对于100%的数据,1<=W,H,w,h<=109

 
 
 
 
从这题开始,请注意:前方高能!
    比赛的时候,我在纸上画了几下,发现当边长是W时,把它对折一下为W/2,如果期望达到的w在W和W/2的范围之内,那么就是可以的,否则,就要折成W/2。
    但是看到了最后一个样例,他们的边长需要反过来才能够折,于是自认为很“机智”地就用swap把大小调整好,大对大,小对小。事实证明是个大错误。
错误点get
    1、 不能直接变成W/2,因为当是7的时候,7/2=3,但是并不能折到3,应该最小是4。所以应该是(W+1)/2,同样的,用偶数实验也是可行的。
    2、 至于大对大,小对小的思路显然是想少了。赛后同学给我举了个例子,5 7折成4 5。如果是用我的方法,那么5折成4要折一次,7折成5也要折一次,一共就是两次。
但如果是5对5,那么根本不用折,7对4,这一次就可以了。最优解应该是一次。
我看似很有道理的理论就over了。
    正解其实和这个差不了多少,就是分别算一下两种对应的情况,取一个min为最优解即可。
    时间复杂度 O(log(10^9))
 
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<map>
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6;
inline ll read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
ll n,m,x,y;
void inint(){
cin>>n>>m>>x>>y;
}
int main(){
inint();
ll sum=;
ll nn=n,mm=m;
if((x>n&&x>m)||(y>n&&y>m)||(n<x&&n<y)||(m<y&&m<x)) {
cout<<-<<endl;
return ;
}
if(n>=x&&m>=y) {
while(n>x) {
sum++;
n-=n/;
}
while(m>y) {
sum++;
m-=m/;
}
} else sum=maxn;
swap(x,y);
ll s=;
if(nn>=x&&mm>=y) {
while(nn>x) {
s++;
nn-=nn/;
}
while(mm>y) {
s++;
mm-=mm/;
}
}else s=maxn;
cout<<min(sum,s)<<endl;
}

折纸(folding)的更多相关文章

  1. 嵊州D5T2 折纸 folding

    折纸 folding [问题描述] 在非常紧张的 NOIP 考试中,有人喜欢啃指甲,有人喜欢转铅笔,有人喜欢撕 纸条,……而小 x 喜欢迷折纸. 现有一个 W * H 的矩形纸张,监考老师想知道,小 ...

  2. CSS3写折纸

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  3. 折纸问题java实现

    /** * 折纸问题 这段代码写的太low了 本人水平有限 哎... 全是字符串了 * @param n * @return * @date 2016-10-7 * @author shaobn */ ...

  4. 【BZOJ】1074: [SCOI2007]折纸origami

    http://www.lydsy.com/JudgeOnline/problem.php?id=1074 题意:一开始有一个左上角是(0,100),右下角是(100,0)的纸片,现在可以沿有向直线折n ...

  5. 1074: [SCOI2007]折纸origami - BZOJ

    Description 桌上有一张边界平行于坐标轴的正方形纸片,左下角的坐标为(0,0),右上角的坐标为(100,100).接下来执行n条折纸命令.每条命令用两个不同点P1(x1,y1)和P2(x2, ...

  6. CSS3实现文字折纸效果

    CSS3实现文字折纸效果 效果图: 代码如下,复制即可使用: <!DOCTYPE html> <html> <head> <title></tit ...

  7. 1074: [SCOI2007]折纸origami

    Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 372  Solved: 229[Submit][Status][Discuss] Descriptio ...

  8. UVA 177 PaperFolding 折纸痕 (分形,递归)

    著名的折纸问题:给你一张很大的纸,对折以后再对折,再对折……每次对折都是从右往左折,因此在折了很多次以后,原先的大纸会变成一个窄窄的纸条.现在把这个纸条沿着折纸的痕迹打开,每次都只打开“一半”,即把每 ...

  9. ZR#955 折纸

    ZR#955 折纸 解法: 可以发现折纸之后被折到上面的部分实际上是没有用的,因为他和下面对应位置一定是一样的,而影响答案的只有每个位置的颜色和最底层的坐标范围.因此,我们只需要考虑最底层即可,即我们 ...

随机推荐

  1. 利用 Hexo + Github 搭建自己的博客

    扯在前面 在很久很久以前,一直就想搭建属于自己的一个博客,但由于各种原因,最终都不了了之,恰好最近突然有了兴趣,于是就自己参照网上的教程,搭建了属于自己的博客. 至于为什么要搭建自己的博客了?哈哈,大 ...

  2. 6.Dockerfile 指令

    概述 我们已经介绍了 FROM,RUN,还提及了 COPY, ADD,其实 Dockerfile 功能很强大,它提供了十多个指令.下面我们继续讲解其他的指令. COPY 格式: COPY <源路 ...

  3. PHP实现微信公众号授权获取用户信息

    class WxAuthModel extends BaseModel { var $appId = APPID; var $appSecret = APPSECRET; /*微信x小程序,获取微信o ...

  4. linux - mysql 异常:Ignoring query to other database

    问题描述 Ignoring query to other database(忽略其他数据库查询) 问题原因 登录方式错误,登录命令用的是 “mysql -root -p”,应该用命令 “mysql - ...

  5. update(十)

    Vue 的 _update 是实例的一个私有方法,它被调用的时机有 2 个,一个是首次渲染,一个是数据更新的时候:由于我们这一章节只分析首次渲染部分,数据更新部分会在之后分析响应式原理的时候涉及._u ...

  6. <软件工程基础>

    我是JX_Z,学习信息安全方向 //(怎么在这头不头尾不尾的地方弄个自我介绍这么尴尬呢) 之前也写过一些随笔记录自己的学习过程 软件工程基础课程中遇到的问题和学习心得都会记录在这篇文章中不断更新. 谢 ...

  7. testclass面试题

    http://www.testclass.net/interview/selenium/   seleniuim面试题 http://www.testclass.net/interview/inter ...

  8. java web HttpServletRequest

    一.HttpServletRequest介绍 HttpServletRequest 对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,通过这个对象提供的方法,可以获得客户端请求的所有信息. ...

  9. Hibernate的基本工作原理

    Hibernate开发过程中会用到5个核心接口: 1.Configuration2.SessionFactory3.Session4.Transaction5.QueryHibernate就是通过这些 ...

  10. 并查集-F - How Many Tables

    F - How Many Tables 并查集的模板都能直接套,太简单不注释了,就存个代码 #include<bits/stdc++.h> using namespace std; ; i ...