ccf-csp:201803
作者:互联网
今天模拟的是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;}
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 longconst 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;}
标签:cnt,return,int,flag,num,ccf,201803,csp 来源: https://blog.csdn.net/m0_46241477/article/details/123596710