今天模拟的是2018年三月份的csp,这次题目也是比较简单(要是现在的csp还是以前的难度就好了~~~~),前两题不说了很简单,第三题是一个模拟题,难点在于字符串的处理,这道题我拿了80分,时间到了实在是改不出来了~~~,第四题就是一个简单地dfs就出来了,第五题我拿了暴力的40分,一共拿了100+100+80+100+40=420~~~~~
通过这几次模拟考试发现,考场上选择做题的顺序以及考试时候的心态真的十分重要!!!还有考试的细心程度!!!!其实四个小时并不算短,因此如果一道题卡了一会也不要慌,当下最紧要的是做明智的决定,是决定换一道题还是在思考一会,千万记得不要被沉没成本所影响!!!!
最后贴一下这次模拟考试的题目和代码
201803-1 | 跳一跳 |
代码如下:
#include <iostream>
using namespace std;
int ans,num;
int main()
{
int a;
while(cin>>a)
{
if(a==0) break;
if(a==1) num=1;
else if(a==2)
{
if(num==1) num=2;
else num+=2;
}
ans+=num;
}
cout<<ans;
return 0;
}
201803-2 | 碰撞的小球 |
代码如下:
#include <bits/stdc++.h>
using namespace std;
int n,l,t;
struct node{
int id,pos;
} a[110];
int b[110],v[110];
bool cmp(node c,node d)
{
return c.pos<d.pos;
}
int main()
{
cin>>n>>l>>t;
for(int i=1;i<=n;i++)
{
cin>>a[i].pos;
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
a[n+1].pos=l,a[0].pos=0;
fill(v+1,v+n+1,1);
for(int i=1;i<=n;i++) b[a[i].id]=i;
for(int i=0;i<=t;i++)
{
for(int j=1;j<=n;j++)
{
if(i==0)
{
if(a[j].pos==a[j-1].pos||a[j].pos==a[j+1].pos) v[j]=-v[j];
continue;
}
a[j].pos+=v[j];
if(a[j].pos==a[j-1].pos||a[j].pos==(a[j+1].pos+v[j+1]))
{
v[j]=-v[j];
//cout<<"sudu "<<j<<endl;
}
}
}
for(int i=1;i<=n;i++) cout<<a[b[i]].pos<<" ";
return 0;
}
201803-3 | URL映射 |
这个只拿了80分,还有些细节没注意到~~~
代码如下:
#include <bits/stdc++.h>
using namespace std;
string s[110],na[110];
vector<string> ans;
string ss;
int n,m,cnt;
bool func1(string sss)
{
int k=cnt;
if(sss=="<int>")
{
int flag=0;
for(;cnt<ss.size();cnt++)
{
if(ss[cnt]=='/') break;
if(ss[cnt]<'0'||ss[cnt]>'9')
{
flag=0;break;
}
else flag=1;
}
cnt++;
if(!flag) return false;
else
{
for(int i=k;i<cnt;i++)
{
if(ss[i]!='0')
{
ans.push_back(ss.substr(i,cnt-i-1));
break;
}
}
return true;
}
}
if(sss=="<str>")
{
int flag=0;
for(;cnt<ss.size();cnt++)
{
if(ss[cnt]=='/') break;
flag=1;
}
cnt++;
if(!flag) return false;
else
{
ans.push_back(ss.substr(k,cnt-k-1));
return true;
}
}
if(sss=="<path>")
{
if(cnt<ss.size())
{
ans.push_back(ss.substr(cnt));
cnt=ss.size();
return true;
}
else return false;
}
string tem="";
for(int i=0;i<sss.size();i++)
{
if(ss[cnt]==sss[i]) cnt++;
else
{
return false;
}
}
if(cnt<ss.size()&&ss[cnt]!='/') return false;
else
{
cnt++;
return true;
}
}
void func()
{
int flag=0;
for(int i=1;i<=n;i++)
{
int k=1,ll=s[i].size();
cnt=1;
for(int j=1;j<ll;j++)
{
if(s[i][j]!='/')
{
if(cnt>=ss.size()) break;
}
if(s[i][j]=='/')
{
string s1=s[i].substr(k,j-k);
//cout<<s1<<endl;
k=j+1;
if(!func1(s1)) break;
}
if(j==ll-1)
{
if(s[i][j]!='/')
{
string s1=s[i].substr(k);
if(!func1(s1)) break;
else
{
if(ss[ss.size()-1]!='/') flag=i;
}
}
else
{
if(ss[ss.size()-1]=='/')flag=i;
}
}
}
if(cnt<ss.size()) flag=0;
if(flag) break;
ans.clear();
}
if(flag)
{
cout<<na[flag]<<" ";
for(int i=0;i<ans.size();i++) cout<<ans[i]<<" ";
cout<<endl;
}
else cout<<404<<endl;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>s[i]>>na[i];
while(m--)
{
cin>>ss;
int flag=1;
for(int i=0;i<ss.size();i++)
{
if(ss[i]=='?')
{
flag=0;
break;
}
}
if(!flag)
{
cout<<404<<endl;
continue;
}
func();
}
return 0;
}
/*
1 4
/static/<path> static_serve
/static/js/jquery.js
/articles/1985/09/aloha/
/articles/2004/
/articles/hello/
*/
201803-4 | 棋局评估 |
代码如下:
#include <iostream>
using namespace std;
int g[4][4];
int t;
bool check(int x)
{
if(g[1][1]==x&&g[2][2]==x&&g[3][3]==x) return true;
if(g[3][1]==x&&g[2][2]==x&&g[1][3]==x) return true;
for(int i=1;i<=3;i++)
{
if(g[i][1]==x&&g[i][2]==x&&g[i][3]==x) return true;
if(g[1][i]==x&&g[2][i]==x&&g[3][i]==x) return true;
}
return false;
}
int score(int x)
{
int res=1;
for(int i=1;i<=3;i++)
{
for(int j=1;j<=3;j++)
{
if(!g[i][j]) res++;
}
}
if(x==1) return res;
else return -res;
}
int dfs(int x)
{
if(check(1))return score(1);
else if(check(2)) return score(2);
else if(score(1)==1) return 0;
int maxx=-10,minn=10;
for(int i=1;i<=3;i++)
{
for(int j=1;j<=3;j++)
{
if(g[i][j])continue;
if(x==1)
{
g[i][j]=1;
maxx=max(maxx,dfs(2));
g[i][j]=0;
}
else
{
g[i][j]=2;
minn=min(minn,dfs(1));
g[i][j]=0;
}
}
}
if(x==1) return maxx;
else return minn;
}
int main()
{
cin>>t;
while(t--)
{
for(int i=1;i<=3;i++)
{
for(int j=1;j<=3;j++)
{
cin>>g[i][j];
}
}
cout<<dfs(1)<<endl;;
}
return 0;
}
01803-5 | 二次求和 |
关于第五题我想说以前的csp是真的香啊,暴力破解能拿40分!!!!对比上一次的csp(2021年 12月份的)第五题暴力12分,,,不得不说好怀念以前的csp啊啊啊~~~~
代码如下:
#include <bits/stdc++.h>
using namespace std;
#define ll unsigned long long
const int N=1e5+10;
const int mod=1e9+7;
ll a[N];
vector<int>adj[N];
vector<int>ans;
int ans1[N];
int t,n,m,l,r;
int u0,v0;
ll d;
bool dfs(int fa,int u)
{
if(u==v0) return true;
for(int i=0;i<adj[u].size();i++)
{
int v=adj[u][i];
if(v==fa)continue;
if(dfs(u,v))
{
ans.push_back(v);
return true;
}
}
return false;
}
void func()
{
for(int i=0;i<ans.size();i++)
{
int u=ans[i];
a[u]=(a[u]+d)%mod;
}
ll anss=0;
for(int i=1;i<=n;i++)
{
anss=(anss+ans1[i]*a[i]%mod)%mod;
}
cout<<anss<<endl;
}
void dfs1(int fa,int s,int u,int num)
{
if(num>=l&&num<=r&&s<=u)
{
for(int i=0;i<ans.size();i++)
{
ans1[ans[i]]++;
}
}
if(num>=r) return;
for(int i=0;i<adj[u].size();i++)
{
int v=adj[u][i];
if(v==fa) continue;
ans.push_back(v);
dfs1(u,s,v,num+1);
ans.pop_back();
}
}
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m>>l>>r;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=2;i<=n;i++)
{
int u1;
cin>>u1;
adj[u1].push_back(i);
adj[i].push_back(u1);
}
for(int i=1;i<=n;i++)
{
ans.clear();
ans.push_back(i);
dfs1(-1,i,i,1);
}
while(m--)
{
cin>>u0>>v0>>d;
ans.clear();
ans.push_back(u0);
dfs(-1,u0);
func();
}
fill(ans1,ans1+n+1,0);
for(int i=1;i<=n;i++) adj[i].clear();
}
return 0;
}