BestCoder Round #3(A)

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4907

解题思路:

  二分或简单模拟。

代码:二分

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <sstream>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <string>
 8 #include <bitset>
 9 #include <vector>
10 #include <queue>
11 #include <stack>
12 #include <cmath>
13 #include <list>
14 //#include <map>
15 #include <set>
16 using namespace std;
17 /***************************************/
18 #define ll long long
19 #define int64 __int64
20 #define PI 3.1415927
21 /***************************************/
22 const int INF = 0x7f7f7f7f;
23 const double eps = 1e-8;
24 const double PIE=acos(-1.0);
25 const int d1x[]= {0,-1,0,1};
26 const int d1y[]= {-1,0,1,0};
27 const int d2x[]= {0,-1,0,1};
28 const int d2y[]= {1,0,-1,0};
29 const int fx[]= {-1,-1,-1,0,0,1,1,1};
30 const int fy[]= {-1,0,1,-1,1,-1,0,1};
31 const int dirx[]= {-1,1,-2,2,-2,2,-1,1};
32 const int diry[]= {-2,-2,-1,-1,1,1,2,2};
33 /*vector <int>map[N];map[a].push_back(b);int len=map[v].size();*/
34 /***************************************/
35 void openfile()
36 {
37     freopen("data.in","rb",stdin);
38     freopen("data.out","wb",stdout);
39 }
40 priority_queue<int> qi1;
41 priority_queue<int, vector<int>, greater<int> >qi2;
42 /**********************华丽丽的分割线,以上为模板部分*****************/
43 const int M=100005;
44 int a[2*M],b[2*M];
45 int find(int v,int n)
46 {
47     int sta=0,end=n,mid;
48     while(sta+1!=end)
49     {
50         mid=sta+(end-sta)/2;
51         if (b[mid]<v)
52             sta=mid;
53         else
54             end=mid;
55     }
56     if(v>=b[end])
57         return v;
58     else if (v<=b[sta])
59         return b[sta];
60     else
61         return b[end];
62 
63 }
64 int main()
65 {
66     int cas;
67     scanf("%d",&cas);
68     while(cas--)
69     {
70         int n,q;
71         scanf("%d",&n);
72         scanf("%d",&q);
73         int x;
74         memset(a,0,sizeof(a));
75         memset(b,0,sizeof(b));
76         for(int i=0;i<n;i++)
77         {
78              scanf("%d",&x);
79              a[x]=1;
80         }
81         int d=-1;
82         for(int i=1;i<2*M;i++)
83         {
84             if (a[i]==0)
85             {
86                  b[++d]=i;
87             }
88         }
89         while(q--)
90         {
91             scanf("%d",&x);
92             printf("%d
",find(x,d));
93         }
94     }
95     return 0;
96 }
View Code

代码:模拟

    

 1 #include <algorithm>
 2 #include <iostream>
 3 #include <sstream>
 4 #include <cstdlib>
 5 #include <cstring>
 6 #include <cstdio>
 7 #include <string>
 8 #include <bitset>
 9 #include <vector>
10 #include <queue>
11 #include <stack>
12 #include <cmath>
13 #include <list>
14 //#include <map>
15 #include <set>
16 using namespace std;
17 /***************************************/
18 #define ll long long
19 #define int64 __int64
20 #define PI 3.1415927
21 /***************************************/
22 const int INF = 0x7f7f7f7f;
23 const double eps = 1e-8;
24 const double PIE=acos(-1.0);
25 const int d1x[]= {0,-1,0,1};
26 const int d1y[]= {-1,0,1,0};
27 const int d2x[]= {0,-1,0,1};
28 const int d2y[]= {1,0,-1,0};
29 const int fx[]= {-1,-1,-1,0,0,1,1,1};
30 const int fy[]= {-1,0,1,-1,1,-1,0,1};
31 const int dirx[]= {-1,1,-2,2,-2,2,-1,1};
32 const int diry[]= {-2,-2,-1,-1,1,1,2,2};
33 /*vector <int>map[N];map[a].push_back(b);int len=map[v].size();*/
34 /***************************************/
35 void openfile()
36 {
37     freopen("data.in","rb",stdin);
38     freopen("data.out","wb",stdout);
39 }
40 priority_queue<int> qi1;
41 priority_queue<int, vector<int>, greater<int> >qi2;
42 /**********************华丽丽的分割线,以上为模板部分*****************/
43 const int M=100005;
44 int a[2*M],b[2*M];
45 int main()
46 {
47     int cas;
48     scanf("%d",&cas);
49     while(cas--)
50     {
51         int n,q;
52         scanf("%d",&n);
53         scanf("%d",&q);
54         int x;
55         memset(a,0,sizeof(a));
56         memset(b,0,sizeof(b));
57         for(int i=0;i<n;i++)
58         {
59              scanf("%d",&x);
60              a[x]=1;
61         }
62         int k=1;
63         for(int i=2*M;i>0;i--)
64         {
65             if (a[i]==1)
66             {
67                 b[i]=b[i+1];
68                 continue;
69             }
70             b[i]=i;
71         }
72         while(q--)
73         {
74             scanf("%d",&x);
75             printf("%d
",b[x]);
76         }
77     }
78     return 0;
79 }
View Code
原文地址:https://www.cnblogs.com/ZhaoPengkinghold/p/3889382.html