【PAT甲级】1085 Perfect Sequence (25 分)

题意:

输入两个正整数N和P(N<=1e5,P<=1e9),接着输入N个正整数。输出一组数的最大个数使得其中最大的数不超过最小的数P倍。

trick:

测试点5会爆int,因为P太大了。。。

AAAAAccepted code:

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 typedef struct node{
 5     long long val;
 6     bool flag;
 7 };
 8 bool cmp(node a,node b){
 9     if(a.val!=b.val)
10         return a.val<b.val;
11     return a.flag>b.flag;
12 }
13 node a[200007];
14 map<int,int>pos;
15 int main(){
16     ios::sync_with_stdio(false);
17     cin.tie(NULL);
18     cout.tie(NULL);
19     int n,p;
20     cin>>n>>p;
21     for(int i=1;i<=n;++i)
22         cin>>a[i].val;
23     for(int i=1;i<=n;++i){
24         a[i+n].val=a[i].val*p+1;
25         a[i+n].flag=1;
26     }
27     sort(a+1,a+1+n+n,cmp);
28     int cnt=0;
29     int ans=0;
30     for(int i=1;i<=n+n;++i){
31         if(a[i].flag==0){
32             ++cnt;
33             if(!pos[a[i].val])
34                 pos[a[i].val]=cnt;
35         }
36         else{
37             int x=(a[i].val-1)/p;
38             int tamp=cnt-pos[x]+1;
39             ans=max(ans,tamp);
40         }
41     }
42     cout<<ans;
43     return 0;
44 }

 

 

 

posted @ 2019-11-17 20:38  sewage  阅读(241)  评论(0编辑  收藏  举报