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=1∏n!ai,其中a

最低0.47元/天 解锁文章
5629

被折叠的 条评论
为什么被折叠?



