【推导】【找规律】【二分】hdu6154 CaoHaha's staff

题意:网格图。给你一个格点多边形的面积,问你最少用多少条边(可以是单位线段或单位对角线),围出这么大的图形。

如果我们得到了用n条边围出的图形的最大面积f(n),那么二分一下就是答案。

n为偶数时,显然要尽量用斜边去拼矩形,于是f(i)=i*i/4-1 (i mod 4 == 2),f(i)=i*i/4-1(i mod 4 == 0)。

当n为奇数时,尽量用i-1情况下的最长边向外扩张一个单位,于是f(i)=f(i-1)+[(i+1)/4]*2-1(i mod 2 == 1),方括号表示下取整。

n过小时要特判一下。

#include<cstdio>
using namespace std;
typedef long long ll;
ll calc(ll i){
	if(i==1ll){
		return 0;
	}
	if(i==3ll){
		return 1ll;
	}
	if(i==5ll){
		return 5ll;
	}
	if(i%4ll==1ll){
		ll X=(i-1ll)*(i-1ll)/4ll;
		return X+(i+1ll)/4ll*2ll-1ll;
	}
	else if(i%4ll==2ll){
		return i*i/4ll-1ll;
	}
	else if(i%4ll==3ll){
		ll X=(i-1ll)*(i-1ll)/4ll-1ll;
		return X+(i+1ll)/4ll*2ll-1ll;
	}
	else if(i%4ll==0ll){
		return i*i/4ll;
	}
}
int T;
int main(){
	//freopen("g.in","r",stdin);
	scanf("%d",&T);
	ll x;
	for(;T;--T){
		scanf("%lld",&x);
		x*=2ll;
		ll l=1,r=2000000000ll;
		while(l<r){
			ll mid=(l+r)/2ll;
			if(calc(mid)>=x){
				r=mid;
			}
			else{
				l=mid+1;
			}
		}
		printf("%lld\n",l);
	}
	return 0;
}

【推导】【找规律】【二分】hdu6154 CaoHaha's staff

时间: 2024-12-27 10:35:51

【推导】【找规律】【二分】hdu6154 CaoHaha's staff的相关文章

POWEROJ 1168-A F(x)(找规律&amp;二分查找)

题目链接:1168-A 题意 Time Limit: 1000 MS Memory Limit: 65536 KB Description 小明有一个不降序列(f(1),f(2),f(3),--),f(k)代表在这个序列中大小是k的有f(k)个.我们规定f(n)的前12项如下图. n 1 2 3 4 5 6 7 8 9 10 11 12 f(n) 1 2 2 3 3 4 4 4 5 5 5 6 现在给你一个n,你知道f(n)是多少吗? Input 多组测试数据 每组一个n(1<=n<=2000

【8.31校内测试】【找规律二分】【DP】【背包+spfa】

打表出奇迹!表打出来发现了神奇的规律: 1 1 2 2 3 4 4 4 5 6 6 7 8 8 8 8 9 10 10 11 12 12 12 13 14 14 15 16 16 16 16 16... 嗯嗯嗯?没有规律?我们把每个数出现的次数列出来: 2 2 1 3 1 2 1 4 1 2 1 3 1 2 1 5 然后惊觉表中的数字是连续的,每个都至少有一个,而分解因数中有只要2的幂,有一个就会加一,比如8是2.4.8的倍数,在1的基础上会多三个.(1和2除外) 所以对于一个位置$x$,我们可

hdu6154 找规律

hdu6154   CaoHaha's staff 题意:问在方格上最少用多少笔可以画出面积不小于S的图,笔画只能横竖斜. tags:笔画肯定尽量斜的最优.规律是:如果当前画出了一个矩形,那接下来的两笔肯定是在较长边上加.所以打出表即可. #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) f

HDU 6154 CaoHaha&#39;s staff 思维 找规律

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6154 题目描述: 围成一个面积不小于S的多边形, 最少需要多少根儿线段, 线段可以为单元格边或者对角线 解题思路: 最大的面积肯定是由根号2为边长的正方形围成了, 那么我们把所有正方形都遍历一遍, 找出S介于N, N+1的那个上界N+1设为max, 因为MAX所围成的多边形面积和MAX-1, MAX-2, MAX-3围成的多边形面积, 找出满足条件的最小的一个即可 代码: #include <io

[HDOJ6154] CaoHaha&#39;s staff(规律, 打表, 二分)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6154 有些题一辈子只会做一次,比如这个题.. 题意:炒鸡难懂,学弟读明白的.懒得描述,反正这题以后不会再做. f(i)表示i个线段能围成的最大面积,画画图就会发现一个规律. 然后查询的时候二分最小的大于等于s的即可. 1 /* 2 ━━━━━┒ギリギリ♂ eye! 3 ┓┏┓┏┓┃キリキリ♂ mind! 4 ┛┗┛┗┛┃\○/ 5 ┓┏┓┏┓┃ / 6 ┛┗┛┗┛┃ノ) 7 ┓┏┓┏┓┃ 8 ┛┗┛

2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6154 CaoHaha&#39;s staff(几何找规律)

Problem Description "You shall not pass!"After shouted out that,the Force Staff appered in CaoHaha's hand.As we all know,the Force Staff is a staff with infinity power.If you can use it skillful,it may help you to do whatever you want.But now,hi

ZOJ 3768Continuous Login(找规律然后二分)

Continuous Login Time Limit: 2 Seconds      Memory Limit: 131072 KB      Special Judge Pierre is recently obsessed with an online game. To encourage users to log in, this game will give users a continuous login reward. The mechanism of continuous log

UVA 1363 Joseph&#39;s Problem 找规律+推导 给定n,k;求k%[1,n]的和。

/** 题目:Joseph's Problem 链接:https://vjudge.net/problem/UVA-1363 题意:给定n,k;求k%[1,n]的和. 思路: 没想出来,看了lrj的想法才明白. 我一开始往素数筛那种类似做法想. 想k%[1,n]的结果会有很多重复的,来想办法优化. 但没走通. 果然要往深处想. 通过观察数据发现有等差数列.直接观察很难确定具体规律:此处应该想到用式子往这个方向推导试一试. lrj想法: 设:p = k/i; 则:k%i = k-i*p; 容易想到

hdu 6154 CaoHaha&#39;s staff 二分

题意: 一笔可以画一条长为1的边或者一条根号二的对角线 问围成一个面积是x的图形最少需要几条边 思路: 用公式直接二分 1 #include<bits/stdc++.h> 2 #define cl(a,b) memset(a,b,sizeof(a)) 3 #define debug(a) cerr<<#a<<"=="<<a<<endl 4 using namespace std; 5 typedef long long ll;