2024CCPC网络赛题目(一)包含L,K,B,I

2024CCPC网络赛题目(一)包含L,K,B,I

所有题目链接

题目链接

L 网络预选赛
思路

签到题,输入数据后,暴力枚举即可

解题代码
// L
#include<bits/stdc++.h> 

using namespace std;
using ll = long long;
int ans=0;
char g[510][510];

int main()
{
	ios::sync_with_stdio(false) ;
	cin.tie(0);
	cout.tie(0);
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++) 
		for(int j=1;j<=m;j++)
			cin>>g[i][j];
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
	{
		if(g[i-1][j]=='c'&&g[i-1][j]==g[i-1][j+1]&&g[i-1][j+1]==g[i][j+1]&&g[i][j]=='p')
			ans++;
	}
	cout<<ans;
	return 0;
 } 
K 取沙子游戏
思路

首先遍历一定范围内n值,比如140时,k从1n的获胜情况,通过观察,寻找规律。再使用规律来完成题解。

首先可以确定的时当,n为奇数时,Alice必赢,因为当k=1时,有奇数个1,代表了Alice赢。所以只用看n取偶数时的情况

探索代码

遍历所有情况的代码

#include<bits/stdc++.h> 
using namespace std;
using ll = long long;

int lowbit(int x){
	return x&-x;
}
//探索思路 
int dfs(int n,vector<int>& v,int p,int cnt,vector<int> path)
{
	//cnt1表示乙选择
	//cnt0表示甲选择 
	if(n==0)
	{
//		cout<<"数量"<<path.size()<<"\n";
//		for(int i=0;i<path.size();i++)
//			cout<<path[i]<<"->";
		int anc = path.size()%2;
//		cout<<"\n";
//		if(anc)
//			cout<<"甲"; 
//		else
//			cout<<"乙";
//		cout<<"\n" ;
		//返回的是获胜情况 在该路情况下 1甲赢 0乙赢 
		return anc;
	}
	for(int i=0;i<=p;i++)
		if(n-v[i]<0) continue;
		else 
		{
			vector<int> path2=path;
			path2.push_back(v[i]) ;
			int m =dfs(n-v[i],v,i,1-cnt,path2);
			//如果返回的是自己赢,那肯定会选自己 
			if(m==cnt)
				return cnt;
		}
	//都没有找到能让自己赢的方法,就返回对手赢 
	return 1- cnt;
}

int main()
{
	int n,k;
	for(int z=2;z<100;z+=2) 
	{
		n=z;
		k=z; 
		bool find = false;
		cout<<"n:"<<n<<"\n" ;
		for(int i=1;i<k;i++)
		{
			vector<int> v;
			vector<int>path;
//			cout<<"公因子:";
			for(int j=1;j<=i;j++) if(i%j==0) v.push_back(j);
//			for(int k=0;k<v.size();k++) cout<<v[k]<<" ";
//			cout<<"\n";
			path.push_back(i);
			string anss = dfs(n-i,v,v.size()-1,0,path)==1?"甲":"乙";
//			cout<<"dfs:"<<anss<<" "<<"\n";
			if(anss.compare("甲")==0)	
			{
				bitset<8> binary_rep(n); // 假设是8位二进制数,根据实际情况调整位数  
				cout<<"最低位为"<<(lowbit(n))<<"\n";
				cout << binary_rep << "\n";
				cout<<"k="<<i<<"时"<<" ";
				cout<<anss<<"赢\n";
				cout<<"\n" ;
				cout<<(lowbit(n))<<" "<<i<<"\n" ;
				if(lowbit(n)==i) 
				{
					cout<<"yes\n";
				}
				else
				{
					cout<<"no\n";
				} 
				find = true;
				break;
			}
		}
		
		if(!find) 
		{
			cout<<"乙赢了" <<"\n\n" ;
		}
	}
}

这是前30的情况

n:2
乙赢了

n:4
乙赢了

n:6
最低位为2
00000110
k=2时 甲赢

2 2
yes
n:8
乙赢了

n:10
最低位为2
00001010
k=2时 甲赢

2 2
yes
n:12
最低位为4
00001100
k=4时 甲赢

4 4
yes
n:14
最低位为2
00001110
k=2时 甲赢

2 2
yes
n:16
乙赢了

n:18
最低位为2
00010010
k=2时 甲赢

2 2
yes
n:20
最低位为4
00010100
k=4时 甲赢

4 4
yes
n:22
最低位为2
00010110
k=2时 甲赢

2 2
yes
n:24
最低位为8
00011000
k=8时 甲赢

8 8
yes
n:26
最低位为2
00011010
k=2时 甲赢

2 2
yes
n:28
最低位为4
00011100
k=4时 甲赢

4 4
yes
n:30
最低位为2
00011110
k=2时 甲赢

观察以上代码时,发现规律,当k为偶数时,只要k至少大于等于自己二进制的最低位时,甲可以获胜。

一个数的二进制最低位的含义

比如6,6的二进制是110,那么它最低为也就是10,也就是2

比如7,7的二进制是111,那么它最低为就是1,也就是1

解题方程

A l i c e 必赢 { 当 n 为奇数时, 当 n 为偶数时且 l o w b i t ( n ) < = k 时, Alice必赢\begin{cases} 当n为奇数时,\\ 当n为偶数时且lowbit(n)<=k时, \end{cases} Alice必赢{ n为奇数时,n为偶数时且lowbit(n)<=k时,

解题代码
#include<bits/stdc++.h> 
using namespace std;
using ll = long long;
//返回一个数最低为的函数
int lowbit(int x){
	return x&-x;
}
//Problem K. 取沙子游戏
int main() 
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;	
	while(t--)
	{
		int n,k;
		cin>>n>>k;
		bool F=false;
		if(n&1)
		{
			F=true;
		}
		else
		{
			if(lowbit(n)<=k)
			{
				F=true;
			}
		}
		if(F)
		{
			cout<<"Alice"<<"\n";
		}
		else
			cout<<"Bob"<<"\n";
	}
}
B 军训 Ⅱ
思路

思路,为了取得最小的身高极差,显然当将序列降序或升序时,即可。

9 9 8 2 4 4 3 5 3

就会变为

2 3 3 4 4 5 8 9 9

由于同一身高的人,可以随意调换位置,所以应该将每个身高的排序情况相乘(An取n,也就是A的阶乘)得到答案。
∏ i = 1 n ! a i , 其中 a i 表示身高为 i 的人数 \prod_{i = 1}^{n}!a_i,其中a_i表示身高为i的人数 i=1n!ai,其中a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值