I Count Two Three(打表+排序+二分查找)

I Count Two Three

二分查找用lower_bound

这道题用cin,cout会超时。。。

AC代码;

 1 /* */
 2 # include <iostream>
 3 # include <cstring>
 4 # include <string>
 5 # include <cstdio>
 6 # include <cmath>
 7 # include <algorithm>
 8 using namespace std;
 9
10 const int TWO = 2;
11 const int THREE = 3;
12 const int FIVE = 5;
13 const int SEVEN = 7;
14
15 const long long MAXN = 1e9+100;
16 const int N=1e6;
17 long long a[N];
18 int m;
19
20 void maketable()
21 {
22     m=0;
23     for(long long i=1; i<MAXN; i*=TWO )
24     {
25         for(long long j=1; j*i<MAXN; j*=THREE )
26         {
27             for(long long k=1; i*j*k<MAXN; k*=FIVE )
28             {
29                 for(long long l=1; i*j*k*l<MAXN; l*=SEVEN )
30                 {
31                     a[m++] = i*j*k*l;
32                 }
33             }
34         }
35     }
36 }
37
38 int main()
39 {
40     ios::sync_with_stdio(false);
41     maketable();
42     sort(a,a+m);
43     int t;
44     long long n;
45     scanf("%d", &t);
46     //cin>>t;
47     while( t-- )
48     {
49         scanf("%lld",&n);
50        printf("%lld\n", *lower_bound(a, a+m, n));
51 //        cin>>n;
52 //        cout<<*lower_bound(a,a+m,n)<<endl;
53     }
54     return 0;
55 }

原文地址:https://www.cnblogs.com/wsy107316/p/11462628.html

时间: 2024-10-10 20:25:30

I Count Two Three(打表+排序+二分查找)的相关文章

跳表与二分查找

跳表对数据结构中的数据常见的操作有:查找.插入.删除.有序数组的二分查找操作速度很快,但是插入.删除操作很耗时,并且对内存要求很苛刻.那么有什么数据结构能够做到查找.插入.删除操作速度都很快而且对内存要求不高呢?——答案是:跳表. 跳表是什么?即:把有序链表改造位支持“二分查找”算法,这种链表叫做跳表. 跳表的二分查找算法其实是一种“类似二分查找算法”. 跳表是一个各方面性能都比较优秀的“动态数据结构”.可以进行快速的插入.删除.查找操作.代码实现也不复杂.甚至能替代“红黑树”.时间复杂度:O(

poj 3636 Nested Dolls 动态更新表的二分查找

题意: 给n个玩具,每个有属性w,h.如果w1<w2且h1<h2那么玩具1可放在玩具2里,问最后最少能有几个玩具. 分析: w升序,w相同时h降序排序后是可以贪心的,这里使用了动态维护表的二分算法,表里动态维护了每堆玩具中h的最大值(所以w相同时h要降序).这题我一开始一看是个拓扑图还想着用什么图算法..没想到直接可以贪心,不可以有思维定式啊~~ 代码: //poj 3636 //sep9 #include <iostream> #include <algorithm>

8.8 冒泡排序 选择排序 二分查找 递归使用

冒泡排序: #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 100000 #define M 100000 void show_arr(int * a,int n) { int i; for(i = 0; i < n; i++) { printf("%d ",a[i]); } printf("\n"); } void init_arr(in

uva 10763 Foreign Exchange(排序+二分查找)

这道题是我第一次算出来应该用什么复杂度写的题,或许是这一章刚介绍过,500000的数据必须用nlogn,所以我就 想到了二分,它的复杂度是logn,再对n个数据进行遍历,正好是nlogn,前两次TLE了,然后我就对我的做法没信心 了...看到一篇博客上说就应该这种方法,然后我就坚定的改自己的算法去了,哈哈,专注度没有达到五颗星,最多 三颗... 思路: 我用的是结构体保存的,先对每一对序列排序,然后对第二个元素在第一个元素中二分搜索,用到了 lower_bound,upper_bound,注释里

LintCode-排序列表转换为二分查找树

给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树 您在真实的面试中是否遇到过这个题? Yes 样例 标签 Expand 相关题目 Expand 分析:就是一个简单的递归,只是需要有些链表的操作而已 代码: /** * Definition of ListNode * class ListNode { * public: * int val; * ListNode *next; * ListNode(int val) { * this->val = val; * this->

51nod 1010 只包含因子2 3 5的数(打表+排序+二分)

1010 只包含因子2 3 5的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 取消关注 K的因子中只包含2 3 5.满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15. 所有这样的K组成了一个序列S,现在给出一个数n,求S中 >= 给定数的最小的数. 例如:n = 13,S中 >= 13的最小的数是15,所以输出15. Input 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 1000

[FAFU 1266]STL排序+二分查找

http://acm.fafu.edu.cn/problem.php?id=1266 思路很容易理解: #include<cstdio> #include<algorithm> using namespace std; int num[1000000]; int main() { int n,m,a; while(~scanf("%d",&n)) { for(int i=0;i<n;++i) { scanf("%d",&

优化的直接插入排序(二分查找插入排序,希尔排序)

直接插入排序 (一)概念及实现 直接插入排序的原理:先将原序列分为有序区和无序区,然后再经过比较和后移操作将无序区元素插入到有序区中. 具体如下(实现为升序): 设数组为a[0…n]. 1.        将原序列分成有序区和无序区.a[0…i-1]为有序区,a[i…n] 为无序区.(i从1开始) 2.        从无序区中取出第一个元素,即a[i],在有序区序列中从后向前扫描. 3.        如果有序元素大于a[i],将有序元素后移到下一位置. 4.        重复步骤3,直到找

Java基础【冒泡、选择排序、二分查找】

冒泡排序的思路就是前一个和后一个进行比较,如果大的就交换位置   大的数字后浮 如   12      8    5     31 第一轮   8   5   12   31 第二轮   5   8    12   31 ........ 代码如下 package com.zuoyan.sort; /** * 冒泡排序 * @author Administrator * */ public class BubbloSortDemo { public static void main(String