• UVa10025-The ? 1 ? 2 ? ... ? n = k problem


    分析:因为数字之间只有加减变换,所以-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 }
  • 相关阅读:
    求两条链表有无交点和第一个交点
    重载自增运算符(前置自增++p和后置自增p++)
    二叉排序树和平衡二叉树
    红黑树
    java学习攻略
    Intellij IDEA / IntelliJ
    ngrinder test
    eclipsejeekeplerSR2win32x86_64 jsonedit plugin
    向叶子文文的.net之路学习(大量的转载)
    微软发布机制(转)从浅入深
  • 原文地址:https://www.cnblogs.com/mypsq/p/4725112.html
Copyright © 2020-2023  润新知