zoukankan      html  css  js  c++  java
  • zoj3768Continuous Login

    链接

    这题通过暴力可以看出最多不超过3 具体为什么。。等着看大牛的题解。

    可以预处理出来两个数之和 用bool存下 然后枚举一个数 二分剩余数的位置就可以了 勉强可过

     1 #include <iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<stdlib.h>
     6 #include<vector>
     7 #include<cmath>
     8 #include<queue>
     9 #include<set>
    10 using namespace std;
    11 #define N 123456789
    12 #define M 16000
    13 #define LL long long
    14 #define INF 0xfffffff
    15 const double eps = 1e-8;
    16 const double pi = acos(-1.0);
    17 const double inf = ~0u>>2;
    18 bool f[N];
    19 int g;
    20 vector<int>a;
    21 vector<int>::iterator it;
    22 void init()
    23 {
    24     int i,j;
    25     for(i = 1 ;; i++)
    26     {
    27         int k = (i)*(i+1)/2;
    28         if(k<=N)
    29         {
    30             a.push_back(k);
    31         }
    32         else break;
    33     }
    34     g = i;
    35     for(i = 0; i < g ;i++)
    36         for(j = i;  j < g ; j++)
    37         {
    38             int s = a[i]+a[j];
    39             if(s>N) break;
    40             f[s] = 1;
    41         }
    42 }
    43 int main()
    44 {
    45     int i,n,m;
    46     init();
    47     cin>>m;
    48     while(m--)
    49     {
    50         cin>>n;
    51         it = lower_bound(a.begin(),a.end(),n);
    52         if((*it)==n)
    53         {
    54             printf("%d
    ",it+1-a.begin());
    55             continue;
    56         }
    57         if(f[n])
    58         {
    59             for(i = 0 ;i < g ; i++)
    60             {
    61                 int k = n-a[i];
    62                 if(k<=0) break;
    63                 it = lower_bound(a.begin(),a.end(),k);
    64                 if((*it)==k)
    65                 {
    66                     printf("%d %d
    ",i+1,it+1-a.begin());
    67                     break;
    68                 }
    69             }
    70         }
    71         else
    72         {
    73             int k;
    74             for(i = 0 ; i < g ;i++)
    75             {
    76                 k = n-a[i];
    77                 if(f[k])
    78                 {
    79                     printf("%d ",i+1);
    80                     break;
    81                 }
    82             }
    83             for(i = 0 ;i < g ;i++)
    84             {
    85                 int kk = k-a[i];
    86                 it = lower_bound(a.begin(),a.end(),kk);
    87                 if((*it)==kk)
    88                 {
    89                     printf("%d %d
    ",i+1,it+1-a.begin());
    90                     break;
    91                 }
    92             }
    93         }
    94     }
    95     return 0;
    96 }
    View Code
  • 相关阅读:
    第五:Nutanix的Prism管理手册
    第四:Nutanix的开关机步骤
    Exchange2016DR(异地容灾)环境:重要
    博客的开始
    sql查询日期型内容+oracle
    expdp导出oracle数据库中指定表空间下数据
    oracle 锁表的解决sql语句(pl/sql 删除表中数据锁表)
    centos 关闭防火墙+开启ssh服务
    显示桌面 我的电脑
    查看电脑连接过的wifi—通过命令行
  • 原文地址:https://www.cnblogs.com/shangyu/p/3649131.html
Copyright © 2011-2022 走看看