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输入
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;
}
ljm要加油