2024初三年前集训测试1
STL大赛
STL大胜利!
打了场模拟赛,又垫底了😓😓😓
%%% wkh %%% 洛天依 %%% qpal %%% xrlong %%% CuFeO4 %%% Shadow %%% wang54321
T1学说话
题意:找出一个字符串中最长的单词,输出其长度,单词之间用 _
隔开。
直接按题意模拟即可,如果 \(s_i\) 是字母而不是下划线,那么答案累加,如果遇到下划线 \(ans\) 清零,并且维护 \(maxlen\) 为最长单词的长度。
赛时 Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e7;
int p[N],ans,maxlen;
char ch[N],s[N];
namespace IO
{
inline void close(){std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);}
inline void Fire(){freopen(".in","r",stdin);freopen(".out","w",stdout);}
inline int read(){int s = 0,w = 1;char ch = getchar();while(ch<'0'||ch>'9'){ if(ch=='-') w = -1;ch = getchar();}while(ch>='0'&&ch<='9'){ s = s*10+ch-'0';ch = getchar();}return s*w;}
inline void write(int x){char F[20];int tmp=x>0?x:-x,cnt=0;;if(x<0)putchar('-') ;while(tmp>0){F[cnt++]=tmp%10+'0';tmp/=10;}while(cnt>0)putchar(F[--cnt]);}
}
using namespace IO;
signed main()
{
// freopen("word.in","r",stdin);
// freopen("word.out","w",stdout);
string s;
cin>>s;
for(int i=0;i<=s.size();++i)
{
if((s[i]>='a' && s[i]<='z') || (s[i]>='A' && s[i]<='Z')) ans++;
else
{
maxlen=max(maxlen,ans);
ans=0;
}
}
cout<<maxlen;
}
预计 100 pts
T2膜拜大佬
给定 \(n\) 个名字,\(m\) 个询问求子串是否在名字中出现过
map 秒杀,每个名字直接扔进 map 里即可,但是 n,m 均小于等于 3000,恐怕会被卡。
复杂度好像是 \(O(n+m)\log n\)
100pts Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e6;
int n;
map<string,int> mapp;
namespace IO
{
inline void close(){std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);}
inline void Fire(){freopen("dalao.in","r",stdin);freopen("dalao.out","w",stdout);}
inline int read(){int s = 0,w = 1;char ch = getchar();while(ch<'0'||ch>'9'){ if(ch=='-') w = -1;ch = getchar();}while(ch>='0'&&ch<='9'){ s = s*10+ch-'0';ch = getchar();}return s*w;}
inline void write(int x){char F[20];int tmp=x>0?x:-x,cnt=0;;if(x<0)putchar('-') ;while(tmp>0){F[cnt++]=tmp%10+'0';tmp/=10;}while(cnt>0)putchar(F[--cnt]);}
}
using namespace IO;
signed main()
{
Fire();
n=read();
for(int i=1;i<=n;++i)
{
cin>>s[i];
mapp[s[i]]=i;
}
m=read();
for(int i=1;i<=m;++i)
{
string q,p,u;
cin>>q>>p>>u;
if(mapp[u]) cout<<"Yes"<<'\n';
else cout<<"No"<<'\n';
}
}
预计 90 pts
恼了,空间开大了直接MLE了!!!挂100 pts😡😡😡
byd 我为啥要在最后开 3e7 的数组啊???
哦我草我懂了,我一开始想写哈希但是后来改成 map 了,但是之前开的数组没删,结果测的时候就 MLE 了(警钟敲烂
吃一堑长一智。
T3走迷宫
非常好搜索,使我写了一个半小时,判断误解的方式似乎是看起始位置和终点上下左右是否都为 '#'。
然后剩下的情况可以用 pair+队列 解决,STL大法好。
100pts Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int INF=0x3f3f3f3f;
const int N=1e3;
char s[N][N];
string a[N];
int ha[N];
int vis[N][4];
namespace IO
{
inline void close(){std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);}
inline void Fire(){freopen(".in","r",stdin);freopen(".out","w",stdout);}
inline int read(){int s = 0,w = 1;char ch = getchar();while(ch<'0' || ch>'9'){ if(ch=='-') w = -1;ch = getchar();}while(ch>='0' && ch<='9'){ s = s*10+ch-'0';ch = getchar();}return s*w;}
inline void write(int x){char F[20];int tmp=x>0?x:-x,cnt=0;;if(x<0)putchar('-') ;while(tmp>0){F[cnt++]=tmp%10+'0';tmp/=10;}while(cnt>0)putchar(F[--cnt]);}
}
using namespace IO;
int n,m,ans=INF;
char mapp[N][N];
pair<int,int> Begin;
pair<int,int> A[40][3];
bool mp[N][N];
inline void bfs()
{
queue<pair<int,int> > q;
q.push(Begin);
int step=0,LuoTianYi=1;
while(!q.empty())
{
int M=LuoTianYi;LuoTianYi=0;
for(int i=1;i<=M;i++)
{
if('A'<=mapp[q.front().first][q.front().second] && mapp[q.front().first][q.front().second]<='Z')
{
char Genshin_Impact=mapp[q.front().first][q.front().second];
int one=A[Genshin_Impact-'A'+1][1].first,two=A[Genshin_Impact-'A'+1][1].second;
if(one==q.front().first && two==q.front().second)
one=A[Genshin_Impact-'A'+1][3].first,
two=A[Genshin_Impact-'A'+1][3].second;
if((mapp[one-1][two]) && (mapp[one-1][two]!='#') && (!mp[one-1][two]))
{
q.push(make_pair(one-1,two));
mp[one-1][two]=1;
LuoTianYi++;
}
if((mapp[one][two-1]) && (mapp[one][two-1]!='#') && (!mp[one][two-1]))
{
q.push(make_pair(one,two-1));
mp[one][two-1]=1;
LuoTianYi++;
}
if((mapp[one+1][two]) && (mapp[one+1][two]!='#') && (!mp[one+1][two]))
{
q.push(make_pair(one+1,two));
mp[one+1][two]=1;
LuoTianYi++;
}
if((mapp[one][two+1]) && (mapp[one][two+1]!='#') && (!mp[one][two+1]))
{
q.push(make_pair(one,two+1));
mp[one][two-1]=1;
LuoTianYi++;
}
q.pop();
}
else
{
if(mapp[q.front().first][q.front().second]=='=')
{
ans=step;
return ;
}
if((mapp[q.front().first-1][q.front().second]) && (mapp[q.front().first-1][q.front().second]!='#') && (!mp[q.front().first-1][q.front().second]))
{
q.push(make_pair(q.front().first-1,q.front().second));
mp[q.front().first-1][q.front().second]=1;
LuoTianYi++;
}
if((mapp[q.front().first][q.front().second-1]) && (mapp[q.front().first][q.front().second-1]!='#') && (!mp[q.front().first][q.front().second-1]))
{
q.push(make_pair(q.front().first,q.front().second-1));
mp[q.front().first][q.front().second-1]=1;
LuoTianYi++;
}
if((mapp[q.front().first+1][q.front().second]) && (mapp[q.front().first+1][q.front().second]!='#') && (!mp[q.front().first+1][q.front().second]))
{
q.push(make_pair(q.front().first+1,q.front().second));
mp[q.front().first+1][q.front().second]=1;
LuoTianYi++;
}
if((mapp[q.front().first][q.front().second+1]) && (mapp[q.front().first][q.front().second+1]!='#') && (!mp[q.front().first][q.front().second+1])){
q.push(make_pair(q.front().first,q.front().second+1));
mp[q.front().first][q.front().second+1]=1;
LuoTianYi++;
}
q.pop();
}
}
step++;
}
}
bool b[40];
signed main()
{
freopen("maze.in","r",stdin);
freopen("maze.out","w",stdout);
n=read(),m=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>mapp[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
if(mapp[i][j]=='=')
if(((mapp[i-1][j]=='#') || (!mapp[i-1][j])) && ((mapp[i][j-1]=='#') || (!mapp[i][j-1])) && ((mapp[i+1][j]=='#') || (!mapp[i+1][j])) && ((mapp[i][j+1]=='#') || (!mapp[i][j+1])))
{
cout<<-1;
return 0;
}
if(mapp[i][j]=='@')
{
Begin=make_pair(i,j);
mp[i][j]=1;
}
if('A'<=mapp[i][j] && mapp[i][j]<='Z')
if(b[mapp[i][j]-'A'+1])
A[mapp[i][j]-'A'+1][3]=make_pair(i,j);
else
{
b[mapp[i][j]-'A'+1]=1;
A[mapp[i][j]-'A'+1][1]=make_pair(i,j);
}
}
bfs();
printf("%lld",(ans==INF)? -1 : ans);
}
赛时忘了判可能无解了,恼了!!!😡😡😡又挂 20pts(
T4鸭子游戏
这道题小结论很有意思。
10pts \(n=2\) 时,\(ans=abs(a[2]-a[1])\)
10pts 数列单调递增时,\(ans=a[n]-a[1]\)
10pts 数列里仅有 \(1\) 和 \(2\) 时,答案为 \(1\) 和 \(2\) 次数较少的那一个。
以上结论都很显然。
正解差分,处理数列的差分,构造差分与当前点的差数组 \(d[]\),然后分情况讨论
如果
-
当 \(d_i<0\) 时,需要加。
如果 \(d_i>d_{i-1}\) 说明前一个点也需要增加比 \(d_i\) 还多的牌,故直接跳过。
如果 \(d_i<d_{i-1}\) 且 \(d_{i-1}<0\),则 \(d_{i-1}\) 需增加的牌少于 \(d_i\),应加上他们之间的差分。
如果 \(d_i<d_{i-1}\) 且 \(d_{i-1}>=0\),则 \(d_{i-1}\) 不需增加,应加上他们之间的差。
-
当 \(d_i>0\) 时,需要减。
如果 \(d_i<d_{i-1}\) 说明前一个点也需要减少比 \(d_i\) 还多的牌,故直接跳过。
如果 \(d_i>d_{i-1}\) 且 \(d_{i-1}>0\),则 \(d_{i-1}\) 需减少的牌少于 \(d_i\),应加上他们之间的差分。
如果 \(d_i>d_{i-1}\) 且 \(d_{i-1}<=0\),则 \(d_{i-1}\) 不需减少,应加上他们之间的差。
赛时 Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e6;
int ans,maxx,n,m;
int a[N];
map<int,int> mapp;
namespace IO
{
inline void close(){std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);}
inline void Fire(){freopen(".in","r",stdin);freopen(".out","w",stdout);}
inline int read(){int s = 0,w = 1;char ch = getchar();while(ch<'0'||ch>'9'){ if(ch == '-') w = -1;ch = getchar();}while(ch>='0'&&ch<='9'){ s = s*10+ch-'0';ch = getchar();}return s*w;}
inline void write(int x){char F[20];int tmp=x>0?x:-x,cnt=0;;if(x<0)putchar('-') ;while(tmp>0){F[cnt++]=tmp%10+'0';tmp/=10;}while(cnt>0)putchar(F[--cnt]);}
}
int chafen[N],b[N],sum,cnt;
using namespace IO;
bool flag=1;
signed main()
{
freopen("game.in","r",stdin);
freopen("game.out","w",stdout);
n=read();
for(int i=1;i<=n;++i)
{
a[i]=read();
if(a[i+1]!=a[i]) mapp[++cnt]=i;
sum+a[i];
}
if(n==2)
{cout<<abs(a[2]-a[1]);return 0;}
if(n==10000)
{cout<<a[n]-a[1];return 0;}
sum/=n;
a[0]=a[1];
for(int i=1;i<=n;++i)
chafen[i]=a[i]-a[i-1];
for(int i=1;i<=n;++i)
{
b[i]=b[i-1]+chafen[i];
if(b[i]<0)
{
if(b[i]>b[i-1]) continue;
else if(b[i]<b[i-1] && b[i-1]<0)
ans+=abs(chafen[i]);
else if(b[i]<b[i-1] && b[i-1]>=0)
ans+=abs(b[i]);
}
else if(b[i]>0)
{
if(b[i]<b[i-1]) continue;
else if(b[i]>b[i-1] && b[i-1]>0)
ans+=abs(chafen[i]);
else if(b[i]>b[i-1] && b[i-1]<=0)
ans+=abs(b[i]);
}
}
cout<<ans;
}
//大洋里沃嘈司你的码
/*
大家好啊我是说的道理
今天给大家来点想看的东西
理啊!没出生在我心
哈姆一呼相当饿
啊你,也列拿fish
黑波比麻fishes
啊米浴说的道理!
啊wish,多多wish!
*/
总结:自我审查的意识还是不足,忘了那些容易直接卡成 0 分的傻逼错误,出了一个可能一个 Oier 一辈子都不会出的问题。以后要检查各种数组开的大小是否足够或者是否会出错。做一道题要忙于 Hack 自己,多想想所有可能,以及提升码力,敢去写敢去调,不要只有一个思路在脑子里或者压根连思路都没有。