此题主要考虑一下B的值只与K有关就行,因为要关掉c=b+i⋅k的窗口,所以仅0<=b<k时关闭的窗口是有区别的,当b=0时就等同于b=k时关闭的窗口。
#include <iostream> using namespace std; int main (void) { int n, k; cin>>n>>k; int a[n]; for(int i = 0; i < n; i++) cin>>a[i]; int max = 0; for(int b = 0; b < k; b++){ int infor = 0; int social = 0; for(int i = 0; i < n; i++){ if((i-b)%k!=0){ if(a[i] == -1) social++; else infor++; } } if(max<fabs(infor-social)) max = fabs(infor-social); } cout<<max<<endl; return 0; }
B题主要考虑怎么去统计所有难度都出现过一次,这里我采用了计不同难度出现次数的方式,只要控制时间复杂度就没什么问题。
#include <iostream> #include <math.h> using namespace std; int main (void) { int n,m; cin>>n>>m; int ques[m]; int sign[n+1] = {0}; int count = 0; for(int i = 0; i < m; i++) { cin>>ques[i]; } for(int i = 0; i < m; i++) { sign[ques[i]]++; if(sign[ques[i]]==1) { count++; } if(count == n) { count = 0; cout<<1; for(int k = 1; k <= n; k++){ sign[k]--; if(sign[k]!=0){ count++; } } } else { cout<<0; } } }