202109 csp

  • 1.数组推导
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
int n;
int maxs = 0;
int mins = 0;
int main(){
	cin>>n;
	vector<int> B;
	int arr[n];
	memset(arr,0,sizeof(arr));
	for(int i=0;i<n;i++){
		int b;
		cin>>b; 
		B.push_back(b);
	}
   maxs=B[0];
   mins=B[0]; 
   int flag =0;
   //标记前面是否已出现过
	for(int i=1;i<B.size();i++){
		flag=0;
		for(int j=0;j<i;j++){
			if(B[i]==B[j]){
				flag =1;
				break; 
			}	 	 
		}
		if(flag ==1)
		{
		 maxs+=B[i];
		 mins+=0;	
		} else{
			 maxs+=B[i];
			 mins+=B[i];
		}
	}
	cout<<maxs<<endl;
	cout<<mins;
} 
    1. 非零段划分

样例1输入
11
3 1 2 0 0 2 0 4 5 0 2

样例1输出
5

样例2输入
14
5 1 20 10 10 10 10 15 10 20 1 5 10 15

样例2输出
4

样例3输入
3
1 0 0

样例3输出
1

样例4输入
3
0 0 0

样例4输出
0

70分

#include<iostream>
#include<vector>
#include<set>
#include<iterator>
using namespace std;
int n;
int ans = 0;
int main(){
	cin>>n;
	vector<int> v;
	set<int> s;
	int maxv = 0;
	for(int i=0;i<n;i++){
		int x;
		cin>>x;
		if(x>maxv) maxv=x; 
		v.push_back(x);	
		s.insert(x);
	}
	set<int>::iterator it = s.begin();
	int p = *it;
	int tmp[n];
	while(it!=s.end()){
	p=*it+1;
	int num=0;
	for(int i=0;i<n;i++){
		if(v[i]<p) tmp[i]=0;
		else tmp[i]=v[i];	
	}
	int i=0;
	int last=0;
	while(i<n){	
		if(tmp[i]!=0){
			if(last==0){
			num++;
			}				
		}
		last=tmp[i];
		i++;
	}	
	if(ans<=num) ans=num; 
	it++;
	}
	cout<<ans;
	return 0;
}

优化
[https://tigerisland.blog.csdn.net/article/details/120598581]

  • 3神经元
using namespace std;
int N;//神经元个数 
int S;//突触个数 
int P;//脉冲源个数 
int T;//输出t时刻神经元的v值 
double dt;//间隔时间 
double ik[1009][100019];//存放Ik 
map<int,int> maichong;//存放脉冲源的r值 
static unsigned long next_r = 1;
/* RAND_MAX assumed to be 32767 */
int myrand(void) {
    next_r = next_r * 1103515245 + 12345;
    return((unsigned)(next_r/65536) % 32768);
}
class Point{
	public:
		double v,u,pre_v,pre_u;
		double a;
		double b;
		double c;
		double d;
		int num;
}; 
class Edge{
	public:
	 int t;//出结点的编号 
	 double w;//脉冲强度 
	 int D;//传播延迟 
};
vector<Edge> nei[2009];//邻接表 
int main(){
	vector<Point> neuron;
	cin>>N>>S>>P>>T;
	cin>>dt;
	int cnt=0;
	int pre = 0;
	while(cnt<N){
		int n;
		cin>>n;
		double v;
		double u;
		double a;
		double b;
		double c;
		double d;
		cin>>v>>u>>a>>b>>c>>d;
		Point p = {0,0,v,u,a,b,c,d,0};
		for(int i=pre;i<pre+n;i++){
		neuron.push_back(p);
		}
		pre+=n;
		cnt+=n;
	}
	for(int i=N;i<N+P;i++){
		int r;
		cin>>r;
		maichong[i]=r;
	}
	for(int i=0;i<S;i++){
		int s,t,D;
		double w;
		cin>>s>>t>>w>>D;
		Edge e = {t,w,D};	
		nei[s].push_back(e);
	}
	for(int i=1;i<=T;i++){
		map<int,int>::iterator it = maichong.begin();
		for(it;it!=maichong.end();it++){//发送脉冲 
			int rom=myrand();
			if(it->second>rom){
				for(int j=0;j<(int)nei[it->first].size();j++){
					Edge tmp = nei[it->first][j];
					ik[tmp.t][i+tmp.D]+=tmp.w; 
				}
			}
		}
		//更新vk uk
		for(int j=0;j<N;j++) {
			neuron[j].v=neuron[j].pre_v+dt*(0.04*neuron[j].pre_v*neuron[j].pre_v+5*neuron[j].pre_v+140-neuron[j].pre_u)+ik[j][i];
			neuron[j].u=neuron[j].pre_u+dt*neuron[j].a*(neuron[j].b*neuron[j].pre_v-neuron[j].pre_u);
		    if(neuron[j].v>=30){
		    neuron[j].num++;
			neuron[j].v=neuron[j].c;
			neuron[j].u=neuron[j].u+neuron[j].d;
			for(int k=0;k<(int)nei[j].size();k++){
					Edge tmp = nei[j][k];
					ik[tmp.t][i+tmp.D]+=tmp.w; 
				}	
		    }
		    neuron[j].pre_v=neuron[j].v;
		    neuron[j].pre_u=neuron[j].u;
	   }	
    } 
  
    double ans1=99999999,ans2=-99999999;
	int ans3=99999999,ans4=0;
	for(int j=0;j<N;j++){
		ans1=min(ans1,neuron[j].v);
		ans2=max(ans2,neuron[j].v);
		ans3=min(ans3,neuron[j].num);
		ans4=max(ans4,neuron[j].num);
	}
	printf("%.3f %.3f\n",ans1,ans2);
	printf("%d %d",ans3,ans4);
	return 0;
} 
  • 4搜集卡牌
    10分
#include<iostream>
#include<stdio.h>
using namespace std;
int n,k;
int flag[16];//标记是否出现过 
double p[16];//标记每种牌出现的概率 
double ans;
void dfs(int x,int cnt,double y,double num){
	//x 记录当前有几种卡 
	//cnt 记录当前有几个硬币
	//y记录概率 
	//num记录抽了几次卡 
	if(x>=n||(x*k>=n*k-cnt)) {
		ans+=y*num;
		return; 
	}
   	for(int i=0;i<n;i++){
   	   int tx=x;
	   int tcnt= cnt;
       double ty= y;
	   double tnum=num;
       if(flag[i]){
       	dfs(tx,tcnt+1,ty*=p[i],++tnum);
       }else{
       	flag[i]=1;
       	dfs(tx+1,tcnt,ty*=p[i],++tnum);
       	flag[i]=0;
       }
	}
}
int main(){
	cin>>n>>k;
	for(int i=0;i<n;i++){
	cin>>p[i];	
	}
	//第一次抽卡 
	for(int i=0;i<n;i++){
	flag[i]=1;
	dfs(1,0,p[i],1);
	flag[i]=0;
	}
    printf("%.10lf",ans);//不知道为啥非得输10位 其他的都错的
	return 0;
} 

记忆型搜索

[https://paste.ubuntu.com/p/KTPwKRdPWB/]

posted @ 2021-11-28 22:29  0x3fffffff  阅读(35)  评论(0编辑  收藏  举报