2024初三年前集训测试1

STL大赛

STL大胜利!

打了场模拟赛,又垫底了😓😓😓

image

%%% 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[]\),然后分情况讨论

如果

  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}\) 不需增加,应加上他们之间的差。

  2. \(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 自己,多想想所有可能,以及提升码力,敢去写敢去调,不要只有一个思路在脑子里或者压根连思路都没有。

posted @ 2024-01-31 08:42  HS_xh  阅读(58)  评论(8编辑  收藏  举报
init();