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\n",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\n",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\n",i+1,it+1-a.begin());

90                     break;

91                 }

92             }

93         }

94     }

95     return 0;

96 }
View Code

 

你可能感兴趣的:(login)