NOIP2024模拟3

NOIP2024模拟3

T1 GHzoj 3765. 超市抢购 100pts

点击查看原版数据生成器
int a[maxn],b[maxn];
int randseed;
unsigned int rnd()
{
  unsigned int r;
  r = randseed = randseed * 1103515245 + 12345;
  return (r << 16) | ((r >> 16) & 0xFFFF);
}
int main()
{
	cin>>n>>randseed;
	int sum=0;
	for (int i=n;i>=1;i--)
	{
		a[i]=rnd()%1000,b[i]=rnd()%1000;
		if (sum+(a[i]-b[i])<0) swap(a[i],b[i]);
		sum+=(a[i]-b[i]);
	}
}
  • 题面有些绕口。其实就是如果第 i 种商品可以使用 1 点法力借用 1 件第 i+1 种商品。

  • 下发的数据生成器实际上是将种子自然溢出后再求解,但最后答案会炸 int ,如果直接 #define int long long 会生出错误数据。

    点击查看代码
    const int maxn=10000010;
    int a[maxn],b[maxn];
    int n,randseed;
    unsigned int rnd()
    {
        unsigned int r;
        r = randseed = randseed * 1103515245 + 12345;
        return (r << 16) | ((r >> 16) & 0xFFFF);
    }
    void solve()
    {
        ll ans=0;
        for(int i=1;i<=n-1;i++)
        {
            if(b[i]>a[i])
            {
                ans+=b[i]-a[i];
                a[i+1]-=b[i]-a[i];
            }
        }
        cout<<ans<<endl;
    }
    int main()
    {
        cin>>n>>randseed;
        int sum=0;
        for (int i=n;i>=1;i--)
        {
            a[i]=rnd()%1000,b[i]=rnd()%1000;
            if (sum+(a[i]-b[i])<0) swap(a[i],b[i]);
            sum+=(a[i]-b[i]);
        }
        solve();
        return 0;
    }
    

T2 GHzoj 3766. 核酸检测 0pts

  • 第一问同区间选点问题,贪心胡乱做就行。

  • 观察到住户(询问区间)很多,但时刻很少,说明有很多无用区间(能被覆盖的区间)。

  • 对于每个左端点 i 我们仅保存最小的右端点 ri

  • fi 表示在 i 喊了一句,要使观望时间与 [1,i] 有交集的人全部听到的最小喊的次数,考虑刷表,有 fj=min(fj,fi+1)(i<jmink=i+1j{rk}) ,边界为 f0=0 。方案数在继承状态时一并转移即可。

    点击查看代码
    const ll p=1000000007;
    ll r[1100],f[100010],g[100010];
    int main()
    {
    	ll n,x,y,maxl=0,maxr=0,ans=0x7f7f7f7f,sum=0,i,j,k;
    	cin>>n;
    	memset(r,0x3f,sizeof(r));
    	memset(f,0x3f,sizeof(f));
    	for(i=1;i<=n;i++)
    	{
    		cin>>x>>y;
    		r[x]=min(r[x],y);
    		maxl=max(maxl,x);
    		maxr=max(maxr,y);
    	}
    	f[0]=0;
    	g[0]=1;
    	for(i=0;i<=maxr-1;i++)
    	{
    		for(j=i+1,k=r[i+1];j<=k;j++,k=min(k,r[j]))
    		{               
    			g[j]=((f[j]<=f[i]+1)*g[j]+(f[j]>=f[i]+1)*g[i])%p;
    			f[j]=min(f[j],f[i]+1);
    		}
    	}
    	for(i=maxl;i<=maxr;i++)
    	{
    		sum=((ans<=f[i])*sum+(ans>=f[i])*g[i])%p;
    		ans=min(ans,f[i]);
    	}
    	cout<<ans<<endl;
    	cout<<sum<<endl;
    	return 0;
    }
    

T3 GHzoj 3767. 七龙珠 0pts

  • 时限 3s

  • 部分分

    • 0pts :输出 Stop dreaming xm!

      Q:为什么没有设置这档分呢?

      A:因为 bobo 是不可能被战胜的。

      Q:那为什么数据中小明一定能召唤出神龙呢?

      A:因为就算小明召唤了神龙也无法改变 bobo 是不可能被战胜的事实。

  • 正解

    • 龙珠能量有阈值限制,背包维护每种碎片所能拼出的所有能量值。
    • 然后等价于从 7 个不等长数组中各取出 1 个数乘以一定的权重作为其权值,找到其中第 k 大的数。做法同 POJ2442 Sequence ,可由 luogu P1631 序列合并 拓展得到。注意去重。
      • 具体地,设构成第 k 大的元素在所处个数组中的排名为 (rk1,rk2,rk3,rk4,rk5,rk6,rk7) ,则构成第 k+1 大的元素在所处个数组中的排名为一定 {(rk1+1,rk2,rk3,rk4,rk5,rk6,rk7)(rk1,rk2+1,rk3,rk4,rk5,rk6,rk7)(rk1,rk2,rk3+1,rk4,rk5,rk6,rk7)(rk1,rk2,rk3,rk4+1,rk5,rk6,rk7)(rk1,rk2,rk3,rk4,rk5+1,rk6,rk7)(rk1,rk2,rk3,rk4,rk5,rk6+1,rk7)(rk1,rk2,rk3,rk4,rk5,rk6,rk7+1)
    • 时间复杂度瓶颈在背包预处理上,需要 bitset 优化。
    点击查看代码
    struct node
    {
    	ll val;
    	vector<ll>s;
    	bool operator < (const node &another) const
    	{
    		return val<another.val;
    	}
    };
    ll a[10],x[10],b[10][10010];
    bitset<100010>f;
    vector<ll>s[10],g;
    priority_queue<node>q;
    map<vector<ll>,bool>c;
    int main()
    {
    	ll m,k,sum=0,i,j,h;
    	cin>>m>>k;
    	for(i=1;i<=7;i++)
    	{
    		cin>>a[i];
    	}
    	for(i=1;i<=7;i++)
    	{
    		cin>>x[i];
    		for(j=1;j<=x[i];j++)
    		{
    			cin>>b[i][j];
    		}
    	}
    	for(h=1;h<=7;h++)
    	{
    		f.reset();
    		f[0]=1;
    		for(i=1;i<=x[h];i++)
    		{
    			f|=(f<<b[h][i]);//溢出的直接丢掉
    		}
    		if(a[h]>=0)
    		{
    			for(i=m;i>=0;i--)
    			{
    				if(f[i]==1)
    				{
    					s[h].push_back(i);
    				}
    			}
    		}
    		else
    		{
    			for(i=0;i<=m;i++)
    			{
    				if(f[i]==1)
    				{
    					s[h].push_back(i);
    				}
    			}
    		}
    	} 
    	for(i=1;i<=7;i++)
    	{
    		g.push_back(0);
    		sum+=a[i]*s[i][g[i-1]];
    	}
    	c[g]=true;
    	q.push((node){sum,g});
    	while(q.empty()==0)
    	{
    		k--;
    		if(k==0)
    		{
    			break;
    		}
    		else
    		{
    			sum=q.top().val;
    			g=q.top().s;
    			q.pop();
    			for(i=1;i<=7;i++)
    			{
    				if(g[i-1]<s[i].size()-1)
    				{
    					g[i-1]++;
    					if(c.find(g)==c.end())
    					{
    						c[g]=true;
    						q.push((node){sum+a[i]*(s[i][g[i-1]]-s[i][g[i-1]-1]),g});
    					}
    					g[i-1]--;
    				}
    			}
    		}
    	}
    	if(k==0)
    	{
    		cout<<q.top().val<<endl;
    	}
    	else
    	{
    		cout<<"Stop dreaming xm!"<<endl;
    	}
    	return 0;
    }
    

T4 GHzoj 3768. 龙珠游戏 0pts

  • 时限 3s ,内存限制给到了 1024MB

  • luogu P7137 [THUPC2021 初赛] 切切糕 中的优先选择权不适用于本题,而 初中信息奥赛模拟测试 T4 ZEW 玩 thd 对补刀的理解可以适用于本题。

  • 龙若不拿左右两段,而拿中间的龙珠在一定时间内是不会影响答案的。即若拿中间的龙珠可以先钦定拿,最后一次性全部拿出统计答案。因此我们可以只统计龙和小明只拿两端的龙珠的情况。

  • fl,r,i/gl,r,i 表示要拿掉 [l,r] 内的龙珠,龙能额外(之前应该拿的时候没有拿导致的)拿 i 龙珠,轮到龙/小明拿龙珠,小明最少/最多能拿多少个龙珠,状态转移方程为 {gl,r,i=max(fl,r1,i+1+vr,fl+1,r,i+1+vl)fl,r,i=min(gl,r,i,fl+1,r,i1,fl,r1,i1)

    点击查看代码
    ll v[505],f[505][505][255],g[505][505][255];
    int main()
    {
    	ll n,i,len,l,r;
    	cin>>n;
    	for(i=1;i<=n;i++)
    	{
    		cin>>v[i];
    	}
    	for(len=1;len<=n;len++)
    	{
    		for(l=1,r=l+len-1;r<=n;l++,r++)
    		{
    			for(i=0;i<=n/2;i++)
    			{
    				f[l][r][i]=g[l][r][i]=max(f[l][r-1][i+1]+v[r],f[l+1][r][i+1]+v[l]);
    				if(i-1>=0)
    				{
    					f[l][r][i]=min(f[l][r][i],min(f[l+1][r][i-1],f[l][r-1][i-1]));
    				}
    			}
    		}
    	}
    	cout<<g[1][n][0]<<endl;
    	return 0;
    }
    

总结

  • 有大样例,赢。
  • T1
    • 发下来的数据生成器尽量不要改。
    • 不保证发下来的数据生成器能够通过编译。
  • T2
    • 第二问口胡了正着放一遍,反着放一遍,然后容斥的做法写假了,赛后发现两次区间都是一样的,白容斥了。

后记

  • 昨晚上一开始将比赛加进来的时候显示的是 IOI 赛制 ,后来又改成了 OI 赛制。

  • 比赛还没开始就把大样例发下来了。

  • T1

    • 发下来的数据生成器不能通过编译,还需要亲自定义 nmaxn
  • T2

    • 什么是 bendan

  • T3

    • 双引号的前后引号都写反了。

    • 某hub是啥?

    • 小明就算召唤了神龙,找到了 GXYZAKIOI ,解决了 NP 完全问题也不能打败 bobobobo 是无敌的。

    • 小明原来还好这口。话说 @jijidawang 还没女装呢。

posted @   hzoi_Shadow  阅读(74)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
扩大
缩小
点击右上角即可分享
微信分享提示