UVa10025-The ? 1 ? 2 ? ... ? n = k problem
2015-08-12 17:56
260 查看
分析:因为数字之间只有加减变换,所以-k和k是一样的,都可以当成整数来考虑,只要找到最小的n满足sum=n*(n+1)/2>=k;且sum和k同奇同偶即可,做法是用二分查找,然后在就近查找
因为1,2,3,4,5,6……的sum变化是奇奇偶偶奇奇偶偶奇奇偶偶……
程序:
import java.math.BigInteger; import java.util.Scanner; public class Main { static long l,r,mid; public static long Binary(long k){ l=0;r=100000; long ans=0; while(l<=r){ mid=(l+r)/2; long sum=mid*(mid+1)/2; if(sum>=k){ ans=mid; r=mid-1; } else{ l=mid+1; } } return ans; } public static long fun(long k){ if(k==0) return 3; long ans=Binary(k); long sum=ans*(ans+1)/2; if(k%2!=0){ for(long i=ans;i>=0;i--){ long s=i*(i+1)/2; if(s<k)break; if(s%2!=0) return i; } for(long i=ans;;i++){ long s=i*(i+1)/2; if(s%2!=0) return i; } } else{ for(long i=ans;i>=0;i--){ long s=i*(i+1)/2; if(s<k)break; if(s%2==0) return i; } for(long i=ans;;i++){ long s=i*(i+1)/2; if(s%2==0) return i; } } } public static void main(String args[]){ Scanner cin=new Scanner(System.in); int n; n=cin.nextInt(); for(int i=0;i<n;i++){ long k; k=cin.nextInt(); if(k<0) k=-k; long ans=fun(k); if(i!=0) System.out.println(); System.out.println(ans); } } }
相关文章推荐
- Ubuntu 安装和配置minicom
- Android 动画效果 及 自定义动画
- POJ2773 Happy 2006【容斥原理】
- ASP.NET Web API 记录请求响应数据到日志的一个方法
- xilinx ise 的planahead的使用1
- MSSQL表分区的创建, 横向 纵向 多维度,多指标 分表
- 东风风神汽车4S店管理系统
- 【SEO工作】对济南增高医院优化站的计划、实施方法
- JavaScript在IE6,IE7下报错'expected identifier, string or number'
- 原生js显示分页效果
- php 字符串长度函数
- oracle官网下载老版本jdk + 如何命令行下wget下载jdk
- select,poll,epoll比较
- 探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤
- C#薪酬管理子系统
- php data函数参数大全
- 关于浅拷贝,深拷贝
- C - 语言
- sed笔记
- POJ3169 Layout (差分约束系统)