标签:
分析:因为数字之间只有加减变换,所以-k和k是一样的,都可以当成整数来考虑,只要找到最小的n满足sum=n*(n+1)/2>=k;且sum和k同奇同偶即可,做法是用二分查找,然后在就近查找
因为1,2,3,4,5,6……的sum变化是奇奇偶偶奇奇偶偶奇奇偶偶……
程序:
1 import java.math.BigInteger; 2 import java.util.Scanner; 3 public class Main { 4 static long l,r,mid; 5 public static long Binary(long k){ 6 l=0;r=100000; 7 long ans=0; 8 while(l<=r){ 9 mid=(l+r)/2; 10 long sum=mid*(mid+1)/2; 11 if(sum>=k){ 12 ans=mid; 13 r=mid-1; 14 } 15 else{ 16 l=mid+1; 17 } 18 } 19 return ans; 20 } 21 public static long fun(long k){ 22 if(k==0) 23 return 3; 24 long ans=Binary(k); 25 long sum=ans*(ans+1)/2; 26 if(k%2!=0){ 27 for(long i=ans;i>=0;i--){ 28 long s=i*(i+1)/2; 29 if(s<k)break; 30 if(s%2!=0) 31 return i; 32 } 33 for(long i=ans;;i++){ 34 long s=i*(i+1)/2; 35 if(s%2!=0) 36 return i; 37 } 38 } 39 else{ 40 for(long i=ans;i>=0;i--){ 41 long s=i*(i+1)/2; 42 if(s<k)break; 43 if(s%2==0) 44 return i; 45 } 46 for(long i=ans;;i++){ 47 long s=i*(i+1)/2; 48 if(s%2==0) 49 return i; 50 } 51 } 52 } 53 public static void main(String args[]){ 54 Scanner cin=new Scanner(System.in); 55 int n; 56 n=cin.nextInt(); 57 for(int i=0;i<n;i++){ 58 long k; 59 k=cin.nextInt(); 60 if(k<0) 61 k=-k; 62 long ans=fun(k); 63 if(i!=0) 64 System.out.println(); 65 System.out.println(ans); 66 } 67 } 68 }
UVa10025-The ? 1 ? 2 ? ... ? n = k problem
标签:
原文地址:http://www.cnblogs.com/mypsq/p/4725112.html