首页 > 其他分享 >新生赛及预选赛 10

新生赛及预选赛 10

时间:2024-10-06 13:22:51浏览次数:1  
标签:10 int void re while wr 预选赛 赛及

新生赛及预选赛 10

这个和昨天的不太一样,但只做了四道题,昨天有点小摆

A

还是很清晰的一个模拟题,预处理的时候判断一下,在询问的时候二分查找就可以了。

Code

#include<bits/stdc++.h>
using namespace std;
template<typename T>inline void re(T &x)
{
	x=0;int f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	x*=f;
}
template<typename T>inline void wr(T x)
{
	if(x<0)putchar('-'),x=-x;
	if(x>9)wr(x/10);
	putchar(x%10^48);
}
const int N=2e5+10;
int n,q,x[N],v[N],in[N];
inline void pre()
{
	re(n);
	for(register int i=1;i<=n;++i)
		re(x[i]),re(v[i]);
	in[1]=1;
	int nowv=0;x[n+1]=2005120700;
	for(register int i=1;i<=n;++i)
	{
		nowv+=v[i]; 
		if(x[i]+nowv<x[i+1])
		{
			v[i]=nowv;
			break;	
		}
		in[i+1]=1;
		nowv-=(x[i+1]-x[i]);
		v[i]=x[i+1]-x[i];
	}
}
inline void solve(int k)
{
	int pos=upper_bound(x+1,x+n+1,k)-x-1;
	if(in[pos]&&x[pos]+v[pos]>=k)puts("Yes");
	else puts("No");
}
int main()
{
	pre();
	int k;
	re(q);
	while(q--)
	{
		re(k);
		solve(k);
	}
	return 0;
}

B

从 \(k\) 个数组 ,记从每个数组的 \(a[i]\) 个人中共选出 \(x\) 个人的方案数为 \(f(x)\) (不能全都不选,也就是 \(x>0\) )。

求 \(\sum_{x=1}^{p} f(x)\) 。

B 题就是这个题在 \(k=2\) 时候的简单版本,很明显直接人肉枚举情况就可以通过了。

Code

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MOD=13331;
int n,m,p;
int C[1010][1010];
inline void pre()
{
	cin>>n>>m>>p;
	for(int i=0;i<=1000;++i)	
	{
		C[i][0]=1;
		for(int j=1;j<=i;++j)
			C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;				
	}
}
inline void solve()
{
	int ans=0;
	for(int i=0;i<=min(n,p);++i)
		for(int j=0;j<=m&&(i+j<=p);++j)
			ans+=1ll*C[n][i]*C[m][j]%MOD,ans%=MOD;
	cout<<ans-1;
}
signed main()
{
	pre();
	solve();
	return 0;
}

C

C 题就是 B 题的原版描述,个人写了个 DP ,大概思路是:定义 \(dp[i][j]\) 为,前 \(i\) 个数组,选了 \(j\) 个人的方案数。

那么转移方程其实也很明显:

for(register int i=1;i<=n;++i)
{
    for(register int j=0;j<=p;++j)
    {
		for(register int x=0;x<=min(j,a[i]);++x)
        {
            dp[i][j]+=dp[i-1][j-x]*C(a[i],x);
		}
    }
}

但是可惜的是这道题的数据范围十分的大, \(k\le \sum a_i\le10^6\) ,上述方法明显具有正确性,但是无法通过该题目。

D

不会

E

给出若干个数字,已知这些数字是若干个未知数字的因数(可重),求出这若干个未知数字。

很明显的是我们从最大的数开始枚举,然后剔除它所有的因数,直到集合里再也没有数字即可。

这里用了个 multiset 实现,剔除操作是 wipe() 函数。

数据范围很小,随便怎么做应该都能过。

Code

#include<bits/stdc++.h>
using namespace std;
template<typename T>inline void re(T &x)
{
	x=0;int f=1;char c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	x*=f;
}
template<typename T>inline void wr(T x)
{
	if(x>9)wr(x/10);
	putchar(x%10^48);
 } 
multiset<int> s;
int n,a[100000];
int cnt,ans[100000];
inline void wipe(int x)
{
	int i;
	for(i=1;i*i<x;++i)
	{
		if(x%i!=0)continue;
		auto it=s.find(i);s.erase(it);
		it=s.find(x/i);s.erase(it);
	}
	if(i*i!=x)return;
	auto it=s.find(i);s.erase(it);
}
inline void pre()
{
	re(n);
	for(register int i=1;i<=n;++i)re(a[i]),s.insert(a[i]);
	while(s.size())
	{
		auto it=s.end();it--;
		ans[++cnt]=*it;
		wipe(*it);
	}
}
int main()
{
	pre();
	wr(cnt),putchar('\n');
	for(register int i=cnt;i>=1;--i)wr(ans[i]),putchar(' ');
	return 0;
 } 
 /*
12
1 2 1 6 3 5 1 2 3 4 6 12
 */

标签:10,int,void,re,while,wr,预选赛,赛及
From: https://www.cnblogs.com/Hanggoash/p/18449016

相关文章

  • GESP等级考试 20241006_121124
    官网CCF-GESP编程能力等级认证https://gesp.ccf.org.cn/考钢图形化1579692243025952.pdfhttps://gesp.ccf.org.cn/101/attach/1579692243025952.pdf考钢C++1579675000242208.pdfhttps://gesp.ccf.org.cn/101/attach/1579675000242208.pdf考级相关真题解析-CCF-GESP编程......
  • 20241006每日一题洛谷P1031
    对题目第一印象:贪心吧,或者纯模拟第一次贪心,由于左右端堆只能想内一堆移动,遂放弃第一次模拟,开多个数组,(可能还要用递归?),遂放弃于是求助如来佛祖:从逻辑上可以看出,第一堆缺或者多的牌只能移动到第二堆上当第一堆达到期望值时,第一堆便不能再做操作,于是,可以将第二堆作为第一堆来处理......
  • P11059 [入门赛 #27] 数字 (Hard Ver.)题解
    Solution先读题:在给定x的位数\(n\)和模数\(p\)后,要求构造一个\(x\)在满足\(x\modp\)的余数尽可能小的前提下使\(x\)的数字尽可能小。我们假设\(x\)的各位数字之和为\(m\),有\(1\lem\le9n\)。.(当\(x\)仅在最高位有1时\(m=1\),称为情况一,当x每位为9时\(m=9n\),称为情况二......
  • 20241002每日一题洛谷P1563
    粗看题目我靠,什么方向还变来变去的(哭泣核心思想:圈内右数,圈外左数为整体逆时针数;圈外右数,圈内左数为整体顺时针数运用结构体就有了第一版源码:structpeople{ intface; charname[12];};intmain(){ intm,n; scanf("%d%d",&n,&m); peoplea[10010]; for(inti......
  • P10678 『STA - R6』月 题解
    Solution看了别的大佬的题解,感觉都是数学证明然后用树和图做的,看不懂啊。。。萌新瑟瑟发抖用vector模拟树,然后贪心摸索做出来了。注意到要求最深叶子结点和最浅叶子结点的距离最短时的情况,那么此时根节点应该是树中度数最大的点,把树尽可能的拓宽,深度换宽度。那么同理的根节点......
  • 题解:P11008 『STA - R7』异或生成序列
    Solution序列\(p\)是\(1\)~\(n\)的排列,因此考虑搜索回溯。由\(\sumn\le2\times10^6\)得知\(O(n^2)\)会炸,深感遗憾但仍考虑剪枝。坚信深搜过百万的蒟蒻。。。原\(b\)序列为长度\(n-1\)的序列:{\(b_1,b_2,b_3\cdotsb_n-1\)}将其前面插入一个元素\(......
  • Cisco Firepower 4100 Series FTD Software 7.6.0 & ASA Software 9.22.1
    CiscoFirepower4100SeriesFTDSoftware7.6.0&ASASoftware9.22.1FirepowerThreatDefense(FTD)Software-思科防火墙系统软件请访问原文链接:https://sysin.org/blog/cisco-firepower-4100/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgCiscoSecure防......
  • Cisco Firepower 1000 Series FTD Software 7.6.0 & ASA Software 9.22.1
    CiscoFirepower1000SeriesFTDSoftware7.6.0&ASASoftware9.22.1FirepowerThreatDefense(FTD)Software-思科防火墙系统软件请访问原文链接:https://sysin.org/blog/cisco-firepower-1000/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org面向小型办公室......
  • 10.5组队训练赛-2024CCPC山东省赛
    10.5组队训练赛-2024CCPC山东省赛成绩4排名8(差3题)写在前面Ika是简单题,但是因为a爆longlong一直没有看出来,导致交了很都发。出现的问题就是代码能力太弱,不能保证一遍过。改错的能力也很弱,没有及时发现出错的地方,一直在题意理解和算法方面打转。浪费时间。J题想了......
  • P10418 [蓝桥杯 2023 国 A] 相连的边 题解
    一个比较有趣的树形DP,情况比较多。【题目简述】给定一棵树,求三条相连的边,其边权之和最大。【思路】以X代表当前节点,S表示儿子,G表示孙子,P表示父节点。首先把树建出来,在以下图中,我们模拟二号点的DP过程,考虑以下几种情况:有一条边指向父节点时FG(FatherGrandson):一......