E1. Asterism (Easy Version) 暴力+二分求方案

https://blog.csdn.net/Joker_He/article/details/107087092

题意: 假设你有x颗糖果,你面前有n个敌人,第i个敌人有a[i]颗糖果,你可以选择对战的顺序,如果你手里的糖果不比敌人少,那么你胜利并获得一颗糖果,现在我们定义f(x)为你手里有x颗糖果时,你能打败所有对手的方案数,对于给定质数p,如果f(x)与p互质,那么这个x就是符合要求的,现在给定n,p和a[i],问你有多少个x符合条件,并且输出这些x。

数据范围:
2<=p<=n<=2000,a[i]<=2000

思路: 显然,如果x比2000要大的话,如果这个x合法,那么所有大于x的都合法了,这显然就有无限个x合法了,所以可以把x的范围控制在2000以内,那么我们先对a[i]排序,在2000以内枚举x,用cnt表示已经战胜的敌人,我们每次就二分查找a数组中小于x+cnt的数量num,num-cnt就是目前没有交战的敌人数量,那么方案数是要乘num-cnt的,所以如果num-cnt是p的倍数,就可以直接break了,至于f(x)是多少,我们并不care,(如果一直乘,最后对p取模,c++的long long可能存不下而且时间复杂度也高)。最后只需要判断是否合法并存储答案就行了。
————————————————
版权声明:本文为CSDN博主「Joker_He」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Joker_He/article/details/107087092

 1 #include<bits/stdc++.h>
 2 #pragma GCC optimize("Ofast")
 3 #define endl '\n'
 4 #define null NULL
 5 #define ls p<<1
 6 #define rs p<<1|1
 7 #define fi first
 8 #define se second
 9 #define mp make_pair
10 #define pb push_back
11 #define ll long long
12 #define int long long
13 #define pii pair<int,int>
14 #define ull unsigned long long
15 #define all(x) x.begin(),x.end()
16 #define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
17 #define ct cerr<<"Time elapsed:"<<1.0*clock()/CLOCKS_PER_SEC<<"s.\n";
18 char *fs,*ft,buf[1<<20];
19 #define gc() (fs==ft&&(ft=(fs=buf)+fread(buf,1,1<<20,stdin),fs==ft))?0:*fs++;
20 inline int read(){int x=0,f=1;char ch=gc();
21 while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=gc();}
22 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=gc();}
23 return x*f;}
24 using namespace std;
25 const int N=2e5+5;
26 const int inf=0x3f3f3f3f;
27 const int mod=1e9+7;
28 const double eps=1e-7;
29 const double PI=acos(-1);
30 int a[N];
31 signed main()
32 {
33     int n,p;
34     cin>>n>>p;
35     for(int i=1;i<=n;i++)
36         cin>>a[i];
37     sort(a+1,a+n+1);
38     vector<int>v;
39     for(int i=1;i<=2000;i++){
40         int cnt=0,res=0,fg=1;
41         for(int j=1;j<=n;j++){
42             int pos=upper_bound(a+1,a+n+1,i+cnt)-a;
43             pos--;
44             if((pos-cnt)%p==0)
45             {
46                 fg=0;
47                 break;
48             }
49             cnt++;
50         }
51         if(fg)
52             v.pb(i);
53     }
54     cout<<v.size()<<endl;
55     for(auto i:v)
56         cout<<i<<' ';
57 }

 

posted @ 2020-07-24 21:46  古比  阅读(220)  评论(0编辑  收藏  举报