原来第二题就是一分钟一分钟的枚举,还是经验少了,想到了却没写出来
附上四道题代码,欢迎交流
第一题:
其实用位运算更好些,但是懒得搞了,题目说是非负数 
#include<iostream>
#include<cstring>
using namespace std;
int countx(int x){
	int cnt=0;
	while(x){
		if(x%2==1) cnt++;
		x=x/2;
	}
	return cnt;	
}

int main(){
	int T,N;
	cin>>T;
	
	for(int i=1;i<=T;i++)
	{
		cin>>N;

		int ans[35]={0};
		int x,temp;
		
		for(int j=1;j<=N;j++)
		{
			cin>>x;
			temp=countx(x);
			ans[temp]++;
		}
		int cnt=0;
		for(int k=0;k<32;k++)
		{
			if(ans[k]) cnt++;
		}
		cout<<cnt<<endl;
	} 

	return 0;
}

第二题:
一分钟维护一次,每次查询进出口状态,分四类情况即可
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;

bool check(int x,int t){
	x=x-(x/(2*t))*2*t;
	if(x>0 && x<=t) return 1;
	else return 0;
}

int main(){
	int T;
	cin>>T;
	int m,t,m1,t1,m2,t2;
	
	while(T--){
		int sum=0;
		cin>>m>>t>>m1>>t1>>m2>>t2;
		for(int i=1;i<=t;i++)
		{
			bool p1=check(i,t1);
			bool p2=check(i,t2);
			
			//if(p1==0 && p2==0) continue;
			if(p1==1 && p2==1){
				sum+=m1-m2;
				if(sum>m) sum=m;
				if(sum<0) sum=0;
			}
			if(p1==1 && p2==0)
			{
				sum+=m1;
				if(sum>m) sum=m;
			}
			if(p1==0 && p2==1)
			{
				sum-=m2;
				if(sum<0) sum=0;
			}
			//cout<<i<<" "<<p1<<" "<<p2<<" "<<sum<<endl;
		}
		cout<<sum<<endl;
	}
	return 0;
}
第三题:滑动窗口,双指针,维持窗口内只有两个非N字符即可(贪心:能换一个N肯定会换,所以肯定是两次,不会是1次或0次),每次窗口最大时即为一个可能的解,维护ans即可
#include<iostream>
#include<cstring>
using namespace std;

int main(){
	int T;
	cin>>T;
	string s;
	while(T--)
	{
		cin>>s;
		int len=s.size();
		int flag=2,i=0,j=0,ans=0;
		while(j<len){
			if(s[j]=='N')	j++;
			else{
				if(flag>0) {flag--;j++;}
				else
				{
					ans = max(ans,j-i);
					while(flag==0)
					{
						if(s[i]=='N')	i++;
						else 	{i++;flag++;break;}
					}
				} 
			}
		}
		ans=max(ans,j-i);
		cout<<ans<<endl;
	}
	return 0;
}
第四题:
只做了40%,感觉要维护一个数组,将O(n*q)变成O(n+q),稍后看完大佬的再补充,吃饭去了
#include<iostream>
#include<cstring>
using namespace std;

int main(){
	int n;
	cin>>n;
	int a[n];
	int mina=1<<30,maxa=-1;
	
	for(int i=0;i<n;i++) 
	{
		cin>>a[i];
		mina=min(mina,a[i]);
		maxa=max(maxa,a[i]);
	}
	
	
	int q,h;
	cin>>q;
	while(q--){
		cin>>h;
		if(h>=maxa) cout<<0<<endl;
		else if(h<mina) cout<<1<<endl; 
		else
		{
			int cnt=0;
			for(int i=0;i<n;i++)
			{
				if(a[i]>h){
					if(i==0 || i>0&&a[i-1]<=h) cnt++;
				}
			}
			cout<<cnt<<endl;
		}
	}

	return 0;
}