首页 > 其他分享 >暑假集训CSP提高模拟17

暑假集训CSP提高模拟17

时间:2024-08-10 15:49:59浏览次数:8  
标签:le 游戏 17 int 3010 集训 -- 100 CSP

暑假集训CSP提高模拟17

组题人: @joke3579

\(T1\) P222. 符号化方法初探 \(70pts\)

  • 原题: [ABC081D] Non-decreasing

  • 部分分

    • 测试点 \(1\) :输出样例 \(1\) 。
    • 测试点 \(11 \sim 15\) :由于 \(\{ a \}\) 非负,所以对 \(\{ a \}\) 作前缀和即可。
    • 随机 \(pts\) :乱搞。
  • 正解

    • 当 \(\{ a \}\) 都是负数时,对 \(\{ a \}\) 作后缀和即可。
    • 问题来到了怎么让 \(\{ a \}\) 的符号都相同。
    • 取 \(\{ a \}\) 中绝对值最大的一个数,让其他数都加上这个数即可。
    • 总次数为 \(2n-2\) 。
    点击查看代码
    int a[100010];
    int main()
    {
    	int n,maxx=0,pos=0,flag=1,i;
    	cin>>n;
    	for(i=1;i<=n;i++)
    	{
    		cin>>a[i];
    		if(abs(a[i])>maxx)
    		{
    			maxx=abs(a[i]);
    			pos=i;
    		}
    		if(i>=2)
    		{
    			flag&=((a[i]>=0&&a[i-1]>=0)||(a[i]<0&&a[i-1]<0));
    		}
    	}
    	if(flag==1)
    	{
    		cout<<n-1<<endl;
    		if(a[1]>=0)
    		{
    			for(i=2;i<=n;i++)
    			{
    				cout<<i-1<<" "<<i<<endl;
    			}
    		}
    		else
    		{
    			for(i=n-1;i>=1;i--)
    			{
    				cout<<i+1<<" "<<i<<endl;
    			}
    		}
    	}
    	else
    	{
    		cout<<2*n-2<<endl;
    		for(i=1;i<=n;i++)
    		{
    			if(i!=pos)
    			{
    				cout<<pos<<" "<<i<<endl;
    			}
    		}
    		if(a[pos]>=0)
    		{
    			for(i=2;i<=n;i++)
    			{
    				cout<<i-1<<" "<<i<<endl;
    			}
    		}
    		else
    		{
    			for(i=n-1;i>=1;i--)
    			{
    				cout<<i+1<<" "<<i<<endl;
    			}
    		}
    	}
    	return 0;
    }
    

\(T2\) P223. 无标号 Sequence 构造 \(40pts\)

  • 原题: luogu P10102 [GDKOI2023 提高组] 矩阵

  • 部分分

    • \(25 \sim 50pts\) :使用 \(O(n^{3})\) 的矩阵乘法暴力判断。
  • 正解

    • 发现仅需要判断相不相等,且只需要找到一个位置不同即可。
    • 考虑随机化,随机选择 \(1\) 个点进行判断的正确率太低,那么我们可以随机一个 \(1 \times n\) 的矩阵 \(D\) ,判断 \(D \times A \times B\) 是否等于 \(D \times C\) 。
    • 由秩-零化度定理可以知道这样判断错误的概率不超过 \(\frac{1}{998244353}\) ,不放心可以多随几次。
    点击查看代码
    const ll p=998244353;
    int a[3010][3010],b[3010][3010],c[3010][3010],d[2][3010],e[2][3010],f[2][3010];
    int main()
    {
    	ll t,n,flag,i,j,k,h;
    	scanf("%lld",&t);
    	srand(time(0));
    	for(k=1;k<=t;k++)
    	{
    		flag=0;
    		scanf("%lld",&n);
    		for(i=1;i<=n;i++)
    		{
    			for(j=1;j<=n;j++)
    			{
    				scanf("%d",&a[i][j]);
    			}
    		}
    		for(i=1;i<=n;i++)
    		{
    			for(j=1;j<=n;j++)
    			{
    				scanf("%d",&b[i][j]);
    			}
    		}
    		for(i=1;i<=n;i++)
    		{
    			for(j=1;j<=n;j++)
    			{
    				scanf("%d",&c[i][j]);
    			}
    		}
    		for(i=1;i<=n;i++)
    		{
    			d[1][i]=rand();
    		}
    		for(i=1;i<=1;i++)
    		{
    			for(j=1;j<=n;j++)
    			{
    				e[i][j]=0;
    				for(h=1;h<=n;h++)
    				{
    					e[i][j]=(1ll*e[i][j]+1ll*d[i][h]*a[h][j]%p)%p;
    				}
    			}
    		}
    		for(i=1;i<=1;i++)
    		{
    			for(j=1;j<=n;j++)
    			{
    				f[i][j]=0;
    				for(h=1;h<=n;h++)
    				{
    					f[i][j]=(1ll*f[i][j]+1ll*e[i][h]*b[h][j]%p)%p;
    				}
    			}
    		}
    		for(i=1;i<=1;i++)
    		{
    			for(j=1;j<=n;j++)
    			{
    				e[i][j]=0;
    				for(h=1;h<=n;h++)
    				{
    					e[i][j]=(1ll*e[i][j]+1ll*d[i][h]*c[h][j]%p)%p;
    				}
    			}
    		}
    		for(i=1;i<=1;i++)
    		{
    			for(j=1;j<=n;j++)
    			{
    				if(e[i][j]!=f[i][j])
    				{
    					flag=1;
    					break;
    				}
    			}
    			if(flag==1)
    			{
    				break;
    			}
    		}
    		if(flag==1)
    		{
    			printf("No\n");
    		}
    		else
    		{
    			printf("Yes\n");
    		}
    	}
    	return 0;
    }
    

\(T3\) P224. 无标号 Multiset 构造 \(5pts\)

  • 部分分
    • \(5pts\) :输出样例 \(1\) 。
  • 正解

\(T4\) P225. 有限制的构造 \(40pts\)

  • 原题: [ABC364E] Maximum Glutton
  • 考虑求出要求玩过的游戏的画面质量之和 \(\le A\) 且不可玩度之和 \(\le B\) 的最多游戏数,然后多玩一个即可(若还有剩的)。
  • 部分分
    • \(25 \sim 40pts\) :设 \(f_{i,j,k}\) 表示处理到第 \(i\) 个游戏时玩过的游戏的画面质量之和 \(\le j\) 且不可玩度之和 \(\le k\) 的最多游戏数,状态转移方程为 \(f_{i,j,k}=\max(f_{i-1,j,k},f_{i-1,j-a_{i},k-b_{i}}+1)\),跑一遍二维 \(01\) 背包 \(DP\) ,稍微压一下空间。

      点击查看代码
      int w[100],v[100];
      short f[10010][6510];
      int main()
      {
      	int n,a,b,i,j,k;
      	short sum;
      	cin>>n>>a>>b;
      	for(i=1;i<=n;i++)
      	{
      		cin>>w[i]>>v[i];
      		if(a<b)
      		{
      			swap(w[i],v[i]);
      		}
      	}
      	if(a<b)
      	{
      		swap(a,b);
      	}
      	for(i=1;i<=n;i++)
      	{
      		for(j=a;j>=w[i];j--)
      		{
      			for(k=b;k>=v[i];k--)
      			{
      				sum=f[j-w[i]][k-v[i]]+1;
      				f[j][k]=max(f[j][k],sum);
      			}
      		}
      	}
      	cout<<f[a][b]+(f[a][b]!=n)<<endl;
      	return 0;
      }
      
  • 正解
    • AT_dp_e Knapsack 2 | CF922E Birds 的经验,考虑优化状态设计。

    • 设 \(f_{i,j,k}\) 表示前 \(i\) 个游戏中玩了 \(j\) 个游戏,画面质量之和 \(\le k\) 时不可玩度之和的最小值,状态转移方程为 \(f_{i,j,k}=\min(f_{i-1,j,k},f_{i-1,j-1,k-a_{i}}+b_{i})\) 。

      点击查看代码
      int w[100],v[100],f[2][100][10010];
      int main()
      {
      	int n,a,b,i,j,k;
      	cin>>n>>a>>b;
      	memset(f,0x3f,sizeof(f));
      	for(i=1;i<=n;i++)
      	{
      		cin>>w[i]>>v[i];
      	}
      	f[0][0][0]=0;
      	for(i=1;i<=n;i++)
      	{
      		for(j=0;j<=i;j++)
      		{
      			for(k=0;k<=a;k++)
      			{
      				f[i&1][j][k]=f[(i-1)&1][j][k];
      				if(j-1>=0&&k-w[i]>=0)
      				{
      					f[i&1][j][k]=min(f[i&1][j][k],f[(i-1)&1][j-1][k-w[i]]+v[i]);
      				}
      			}
      		}
      	}
      	for(i=n;i>=0;i--)
      	{
      		for(k=0;k<=a;k++)
      		{
      			if(f[n&1][i][k]<=b)
      			{
      				cout<<i+(i!=n)<<endl;
      				return 0;
      			}
      		}
      	}
      }
      

总结

后记

标签:le,游戏,17,int,3010,集训,--,100,CSP
From: https://www.cnblogs.com/The-Shadow-Dragon/p/18352268

相关文章

  • P9750 [CSP-J 2023] 一元二次方程题目总结
    根据题面,我们将分为多种情况讨论:若a为负数,那么将a,b,c全部取反首先求出data=b^2-4*a*c;1,data<=0cout<<”NO”;否则带入求跟公式:-b/2a+(-)sqrt(data)注意::gcd(a,b)有可能为负数,此处应用abs(x)取绝对值若开根号data为有理数{-b为2*a的倍数则直接输出b否则输出b/gcd(b,2*a......
  • 升级到iOS 18、降级回iOS 17
    热烈欢迎,请直接点击!!!进入博主AppStore主页,下载使用各个作品!!!注:博主将坚持每月上线一个新app!! 苹果官方下载链接:【操作系统OperatingSystems】:https://developer.apple.com/download/【应用Applications】:https://developer.apple.com/download/applications/【描述文件Pr......
  • P1725 琪露诺 题解
    思路动态规划,单调队列动态规划观察题目,发现下标为\(i\)的点只能对\([i+l,i+r]\)区间的点产生贡献。设\(f_i\)为到达点\(i\)时的最大冻结指数。易得状态转移方程式:\(f_k\leftarrow\max(f_k,f_i+a_k),(k\in[i+l,i+r])\)。若直接对该方程进行转移,时间复......
  • P10008 [集训队互测 2022] Range Minimum Element
    MyBlogsP10008[集训队互测2022]RangeMinimumElement难点在于双射构造。首先考虑给定了\(b\)如何进行判定。从小到大填数\(x\),每次把能填的地方(\(b_i>x\)的区间之外)全部填上\(x\),这样填一定是最优的。合法当且仅当这样生成的序列\(a\)对应的\(b\)就是\(b\)本身......
  • 2024暑假集训测试20
    前言比赛链接。状态不太好,又犯了老毛病死磕T1,但T1是个很典的套路题我根本没听说过,T2做过原题但没打。T1九次九日久重色详细记录一下这个经典套路。求最长上升子序列\(O(n^2)\)的就不写了,但是记录路径或方案书必须用\(O(n^2)\),这里说如何\(O(n\logn)\)求。因为......
  • 2024暑假集训测试19
    前言比赛链接。T1因为忘记判一个东西挂分,听说还有被卡哈希的,题目若按照难度正序的话应该是T2、T1、T4、T3,T4看到图论就比较胆怯没怎么想,T3当然没想出来。总而言之T1挂分的人挺多的,T2都能做出来,T1不挂分的排名都很靠前。打得……不算很唐吧,除了T1挂分。T1串串......
  • “斯诺克”不等于“台球”-《分析模式》漫谈17
    DDD领域驱动设计批评文集做强化自测题获得“软件方法建模师”称号《软件方法》各章合集“AnalysisPatterns”的第一章有这么一句:Considersomeonewhowantstowritesoftwaretosimulatea game of snooker. 2004(机械工业出版社)中译本的译文为: game翻译成“游......
  • 什么是CSPO及成为CSPO的好处?
    组织在导入Scrum过程中,关于产品负责人,即PO通常会遇到类似于这样或那样的情况,例如有时整个项目在用Scrum但却无PO;有时项目中有PO但PO却没有充分被授权;有时PO又过分被动;还有时PO与SM是由项目中同一个人兼任……遇到这诸多问题,该如何解决呢?在这里我们不妨先明确一下PO这个角色的定义......
  • Odoo17.0基于企业微信的考勤应用
    对于使用企业微信进行办公的企业而言,使用企业微信打卡功能进行考勤非常常见,而如果能够将企业微信的打卡记录同步到odoo将极大的方便公司进行考勤统计和薪酬核算,降低人事工作的琐碎度,提供企业内部运营效率。本文就将展示如何借助企业微信高级版模块实现企业微信考勤应用的同步与应......
  • 8.6~8.19 MX-WF-C 集训
    8.6模拟赛盖世计划--C班--潍坊营--8月6日-比赛-梦熊联盟(mna.wang)盖世计划--C班--潍坊营--8月6日【订正】-比赛-梦熊联盟(mna.wang)太久没打真实的模拟赛了,今天有些不适应【】时间是8.6的8:00~12:00,时间分配出了大问题。主要问题是T3的5k线段树调起来困难......