长点儿信心吧……算法
【解析】 既然只存在左右(东西)两个朝向,那么领导右侧的人应朝左,相反左侧的人朝右。则要找到一我的做为领导使上述人的数量最多。 咱们能够用 tot[0]、tot[1] 分别储存最初朝东、西的人的个数。而后从第一我的开始枚举,统计当前人左侧的分别朝向东、西的人的个数,从而算出当前人左侧朝右、右侧朝左的人的个数,记为F。领导人便是算出F最大的人。 注意统计时要排开当前人的数量(领导人不算在内,不须要改变朝向)。spa
【源代码】code
/*Lucky_Glass*/ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAXN int(3*1e5) int len,tot[2],res[2],ans; char s[MAXN+5]; int main() { scanf("%d%s",&len,s); for(int i=0;i<len;i++) tot[s[i]=='E']++; ans=1e9; for(int i=0;i<len;i++) { int F=0; F+=res[0]; F+=tot[1]-res[1]-int(s[i]=='E'); res[s[i]=='E']++; ans=min(ans,F); } printf("%d\n",ans); return 0; }
没办法,做者就是脑袋不开窍啊 QwQget
对于异或有一个技巧——若是 A^B==A+B ,则 A&B==0 即A、B的二进制的各个数位都不相同。如今问题就变成寻找一个区间 [l,r] 使得 Ai&Aj=0 (i≠j 且 l≤i,j≤r)。string
定义区间左右端点l、r,并初始化l=1,r=0。保证 r < n(即 r+1≤n 且 l≤r )。定义当前区间的全部数异或所获得的值为F,初始化为0。 若 A[r+1]&F==0 即当前区间向右扩充1后,仍然知足所给条件,则更新F、r,向右扩充,并同时更新ans,增长的答案个数为扩充后区间的长度。用while循环执行此操做。 第一次while循环结束后,则要么枚举完了,要么 F&A[r+1]!=0 ,此时不管如何向右扩充都没法知足题目所给条件,因此只能删除左侧,直到再次知足 F&A[r+1]==0 (当区间为空时,也知足 F&A[r+1]==0 )。 注意:ans用 long long 储存。it
/*Lucky_Glass*/ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN=2*1e5; int n,A[MAXN+5]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&A[i]); int l=1,r=0,F=0; long long ans=0; while(r<n) { while(r<n && !(F&A[r+1])) { r++;ans+=r-l+1; F^=A[r]; } while(l<=r && (F&A[r+1])) F^=A[l++]; } printf("%lld\n",ans); return 0; }
这个是真的想不到 (u_u)io
/*Lucky_Glass*/ #include<cstdio> #include<cstring> #include<algorithm> #include<vector> using namespace std; const int MAXN=2000; const int INF=(int)1e9+5; int n,k,q,A[MAXN+5],ans=INF; void SOLVE(int x) { vector<int> pri; int i=0; while(i<n) { vector<int> que; while(A[i]<x && i<n) i++; while(A[i]>=x && i<n) que.push_back(A[i++]); if(que.size()>=k) { sort(que.begin(),que.end()); for(int j=0;j<(int)que.size()-k+1;j++) pri.push_back(que[j]); } } sort(pri.begin(),pri.end()); if((int)pri.size()>=q) ans=min(ans,pri[q-1]-pri[0]); } int main() { scanf("%d%d%d",&n,&k,&q); for(int i=0;i<n;i++) scanf("%d",&A[i]); for(int i=0;i<n;i++) SOLVE(A[i]); printf("%d\n",ans); return 0; }
(F题真的不会作了,请各位神牛多多指点)class
-Lucky_Glasstest