FZU-1881-Problem 1881 三角形问题,打表二分查找~~
来源:互联网 发布:知乎怎么私信匿名用户 编辑:程序博客网 时间:2024/06/06 02:40
B - 三角形问题
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64uDescription
给你一个由无穷个节点组成的三角形(如下图),你的任务很简单——任意给你两个正整数x和y,判断它们是否相邻(重合不是相邻)。
Input
第一行T,表示T组测试数据,接下来仅有两个32位正整数x 和y。
Output
对于每组测试数据,首先输出”Case k:”,其中k表示第几组。然后如果x和y相邻,则输出“Yes”,否则输出“No”。
Sample Input
31 11 21 11
Sample Output
Case 1:
No
Case 2:
Yes
Case 3:No
用 了一种很麻烦的方法做出来的,看规律又看不出,但发现在同一行中相邻则相差为一,如果不在同一行,设两个元素为a,b(a<b),则必有大小之分,细心点发现a所在行数加上a就是a左下的元素,a加上所在行数再加一就是a右下的元素,如4在第3行,4+3就是7,4+3+1就是8,故4与7、8相邻,所以,我们就可以求出a,b所在行数,然后执行以上判断,但如何高效地找到其所在行呢,我们可以将int以内的元素打表,呵呵,不要被吓到了,这里说的打表只是用二维数组第一维存放行数,第二维存放左边界值与右边界值,然后用二分查找行数即可;
思路基本就是这样,详细请看代码:
#include<cstdio>#include<cstring>#include<cstdlib>#include<iostream>#include<algorithm>#include<cmath>using namespace std;const int N=60000+50;int s[N][2];int main(){ int i,t,a,b; s[1][1]=s[1][2]=1; for(i=2; i<=N; i++) { s[i][1]=s[i-1][1]+i-1; s[i][2]=s[i-1][2]+i; }//二维数组将表打出(i代表行数) // for(i=1;i<=N;i++) // printf("%d %d %d\n",i,s[i][1],s[i][2]); scanf("%d",&t); int t1=t; while(t--) { scanf("%d%d",&a,&b); int f=0; int l=1,r=N,mid1=(l+r)/2,mid2; if(a==b) f=1; else { if(a>b) swap(a,b); while(a<s[mid1][1]||a>s[mid1][2])//二分查找a所在行; { if(a>=s[mid1][1]&&a<=s[mid1][2]) break; else if(a<s[mid1][1]) r=mid1-1; else if(a>s[mid1][2]) l=mid1+1; mid1=(l+r)/2; } l=1,r=N,mid2=(l+r)/2; while(b<s[mid2][1]||b>s[mid2][2])<span style="font-family: Arial, Helvetica, sans-serif;">//二分查找a所在行;</span> { if(b>=s[mid2][1]&&b<=s[mid2][2]) break; else if(b<s[mid2][1]) r=mid2-1; else if(b>s[mid2][2]) l=mid2+1; mid2=(l+r)/2; } if(mid1==mid2&&a+1==b)//同一行判断相差是否为1; f=0; else if(a+mid1==b||a+mid1+1==b) f=0; else f=1; } if(f) printf("Case %d:No\n",t1-t); else printf("Case %d:Yes\n",t1-t); }}
其实是有简单数学思路的,但当时没有想到;
不过这个虽然看起来好麻烦,但是还是不难理解吧
0 0
- FZU-1881-Problem 1881 三角形问题,打表二分查找~~
- Problem 1881 三角形问题 挺简单的
- FZU Problem 2107 Hua Rong Dao (打表 dfs)
- FZU 2037Maximum Value Problem (打表预处理/找规律)
- HDU5676(DFS打表+二分查找)
- #个人赛第七场解题总结# (FZU 1881三角形问题 找规律 &&FZU 1884 排火车 模拟)
- FZU 1888三角形问题II
- Problem fzu 2027 单词问题
- FZU Problem 2030 括号问题
- fzu 2058 问题转化 + 二分
- UVA138(数论问题二分打表)
- POJ 1019 Number Sequence (二分查找+暴力打表)
- hdu I Count Two Three(二分查找&&打表)
- 高效判断素数(打表+二分查找)
- 打表心得《查找等问题》
- 二分查找 Problem 1003 Pie
- Foj 1881 三角形问题
- 1881 三角形问题
- WARN (org.apache.commons.httpclient.HttpMethodBase:1511) - Cookie rejected 警告
- Elasticsearch2.3.1中文分词ik插件安装
- Netty系列之Netty高性能之道
- iOS UIFont 字体名字
- eclipse 安装 TestNG插件的方法
- FZU-1881-Problem 1881 三角形问题,打表二分查找~~
- 标准linu休眠和唤醒机制分析(四)
- 数据科学的完整学习路径—Python版
- 五大常用算法之一:分治算法
- POJ 2184 Cow Exhibition(变形01背包)
- java线程池
- 设计模式(2)之工厂方法模式
- spring mvc返回String到页面乱码
- 正则表达式用法总结