2024初三年前集训测试1
2024初三年前集训测试1
\(T1\) 学说话 \(100pts\)
-
找到下划线后将计数器归零。
点击查看代码
string s; int main() { freopen("word.in","r",stdin); freopen("word.out","w",stdout); int ans=0,num=0,len,i; cin>>s; len=s.size(); for(i=0;i<=len-1;i++) { if(s[i]=='_') { ans=max(ans,num); num=0; } else { num++; } } ans=max(ans,num); cout<<ans<<endl; fclose(stdin); fclose(stdout); return 0; }
\(T2\) 膜拜大佬 \(100pts\)
-
map
大法好。点击查看代码
map<string,bool>vis; string s1,s2,s3; int main() { freopen("dalao.in","r",stdin); freopen("dalao.out","w",stdout); ll n,m,i; cin>>n; for(i=1;i<=n;i++) { cin>>s1; vis[s1]=true; } cin>>m; for(i=1;i<=m;i++) { cin>>s1>>s2>>s3; if(vis.find(s3)==vis.end()) { cout<<"No"<<endl; } else { cout<<"Yes"<<endl; } } fclose(stdin); fclose(stdout); return 0; }
\(T3\) 走迷宫 \(70pts\)
-
难点在于如何建图。
- 把一个二维矩阵压缩成一行,即原第 \(i\) 行第 \(j\) 列的点压缩后成了第 \((i-1)m+j\) 个点。
- 把
@
和=
同样视作.
,分别向 \(4\) 个方向在可以通过的情况下连一条边权为 \(1\) 的有向边。 - 当我们走到传送装置上时,会离开传送到另一个传送装置。故我们选择将传送装置与另一个传送装置的 \(4\) 个方向在可以通过的情况下连一条边权为 \(1\) 的有向边。
-
因边权只有 \(0\) 和 \(1\) ,故使用 \(BFS\) 或 \(01BFS\) 或其他求解单源最短路算法均可。
点击查看代码
struct node { ll nxt,to,w; }e[4000000]; ll dis[4000000],head[4000000],sum[30],cnt=0; char c[2000][2000]; bool vis[4000000]; pair<ll,ll>zimu[30][3]; void add(ll u,ll v,ll w) { cnt++; e[cnt].nxt=head[u]; e[cnt].to=v; e[cnt].w=w; head[u]=cnt; } ll val(ll i,ll j,ll m) { return (i-1)*m+j; } void dijkstra(ll s) { memset(dis,0x3f,sizeof(dis)); memset(vis,false,sizeof(vis)); priority_queue<pair<ll,ll> >q; ll x,i; dis[s]=0; q.push(make_pair(0,-s)); while(q.empty()==0) { x=-q.top().second; q.pop(); if(vis[x]==false) { vis[x]=true; for(i=head[x];i!=0;i=e[i].nxt) { if(dis[e[i].to]>dis[x]+e[i].w) { dis[e[i].to]=dis[x]+e[i].w; q.push(make_pair(-dis[e[i].to],-e[i].to)); } } } } } int main() { freopen("maze.in","r",stdin); freopen("maze.out","w",stdout); ll n,m,i,j,s,t; cin>>n>>m; for(i=0;i<=m+1;i++) { c[0][i]='#'; c[n+1][i]='#'; } for(i=0;i<=n+1;i++) { c[i][0]='#'; c[i][m+1]='#'; } for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { cin>>c[i][j]; if(c[i][j]=='@') { s=val(i,j,m); } if(c[i][j]=='=') { t=val(i,j,m); } if('A'<=c[i][j]&&c[i][j]<='Z') { sum[c[i][j]-'A'+1]++; zimu[c[i][j]-'A'+1][sum[c[i][j]-'A'+1]]=make_pair(i,j); } } } for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { if(c[i][j]=='.'||c[i][j]=='@') { if(c[i-1][j]!='#') { add(val(i,j,m),val(i-1,j,m),1); } if(c[i][j-1]!='#') { add(val(i,j,m),val(i,j-1,m),1); } if(c[i+1][j]!='#') { add(val(i,j,m),val(i+1,j,m),1); } if(c[i][j+1]!='#') { add(val(i,j,m),val(i,j+1,m),1); } } } } for(i=1;i<=26;i++) { if(sum[i]!=0) { if(c[zimu[i][2].first-1][zimu[i][2].second]!='#') { add(val(zimu[i][1].first,zimu[i][1].second,m),val(zimu[i][2].first-1,zimu[i][2].second,m),1); } if(c[zimu[i][2].first][zimu[i][2].second-1]!='#') { add(val(zimu[i][1].first,zimu[i][1].second,m),val(zimu[i][2].first,zimu[i][2].second-1,m),1); } if(c[zimu[i][2].first+1][zimu[i][2].second]!='#') { add(val(zimu[i][1].first,zimu[i][1].second,m),val(zimu[i][2].first+1,zimu[i][2].second,m),1); } if(c[zimu[i][2].first][zimu[i][2].second+1]!='#') { add(val(zimu[i][1].first,zimu[i][1].second,m),val(zimu[i][2].first,zimu[i][2].second+1,m),1); } if(c[zimu[i][1].first-1][zimu[i][1].second]!='#') { add(val(zimu[i][2].first,zimu[i][2].second,m),val(zimu[i][1].first-1,zimu[i][1].second,m),1); } if(c[zimu[i][1].first][zimu[i][1].second-1]!='#') { add(val(zimu[i][2].first,zimu[i][2].second,m),val(zimu[i][1].first,zimu[i][1].second-1,m),1); } if(c[zimu[i][1].first+1][zimu[i][1].second]!='#') { add(val(zimu[i][2].first,zimu[i][2].second,m),val(zimu[i][1].first+1,zimu[i][1].second,m),1); } if(c[zimu[i][1].first][zimu[i][1].second+1]!='#') { add(val(zimu[i][2].first,zimu[i][2].second,m),val(zimu[i][1].first,zimu[i][1].second+1,m),1); } } } dijkstra(s); cout<<((dis[t]==0x3f3f3f3f3f3f3f3f)?-1:dis[t])<<endl; fclose(stdin); fclose(stdout); return 0; }
\(T4\) 鸭子游戏 \(10pts\)
-
观察到 \([l,r]\) 内的数都加 \(1\) 或减 \(1\) ,此时有差分数组不变,考虑进行差分。
-
令 \(b_{1}=a_{1},b_{i}=a_{i}-a_{i-1}(2 \le i \le n)\) 。我们选择固定 \(b_{1}\) 不变,题意要求转化为让 \(b_{2} \sim b_{n}\) 均等于 \(0\) 。
-
令 \(p=\sum\limits_{i=2}^{n}[b_{i}>0] \times b_{i},q=\sum\limits_{i=2}^{n}[b_{i}<0] \times (-b_{i})\) 。考虑先把 \(b_{2} \sim b_{n}\) 都统一成正号或负号,需要 \(\min(p,q)\) 次次数;然后有 \(\sum\limits_{i=2}^{n}|b_{i}|=\max(p,q)- \min(p,q)\) ,为使 \(\sum\limits_{i=2}^{n}|b_{i}|=0\) 需要 \(\max(p,q)- \min(p,q)\) 次次数。故 \(\min(p,q)+ \max(p,q)- \min(p,q)= \max(p,q)\) 即为所求。
点击查看代码
ll a[2000002],b[2000002]; int main() { freopen("game.in","r",stdin); freopen("game.out","w",stdout); ll n,p=0,q=0,i; cin>>n; for(i=1;i<=n;i++) { cin>>a[i]; b[i]=a[i]-a[i-1]; } for(i=2;i<=n;i++) { p+=(b[i]>0)?b[i]:0; q+=(b[i]<0)?-b[i]:0; } cout<<max(p,q)<<endl; fclose(stdin); fclose(stdout); return 0; }
总结
- \(T3\) 暴露出自己的思维和能力太差,典型套路知道不全。
- \(T4\) 最后想出了结论,但少了个负号,挂了 \(90pts\) 。
后记
- 模拟赛重复利用。
- 引流:@jijidawang 在 \(2022\) 年 \(1\) 月写这套题的 题解 。
- 这套题数据太水了,导致部分错解获得了较高的分数。
- 部分分很足,但貌似不太符合普及难度比赛的要求,起不到提升拿部分分能力的效果。
- \(T3\) 第 \(9\) 个测试点的数据如下。
本文来自博客园,作者:hzoi_Shadow,原文链接:https://www.cnblogs.com/The-Shadow-Dragon/p/17999119,未经允许严禁转载。
版权声明:本作品采用 「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0) 进行许可。