蓝桥杯2023届第十四届省赛真题C/C++ A组个人题解

 A  幸运数

普通模拟

B 有奖问答

普通爆搜

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<long,long> pii;
#define int ll
const int dx[9]={-1, 0, 1, 0, 1, -1, 1, -1,0};
const int dy[9]={0, 1, 0, -1, -1, 1, 1, -1,0};
#define INF 0x3f3f3f3f
const int N=2e5+10;
int ans=0;
void dfs(int grade,int index)
{
	if(grade==70) ans++;
	if(grade==100) return;
	if(index==31) return;
	dfs(grade+10,index+1);
	dfs(0,index+1);
}
void solve()
{
	dfs(1,0);
	return;
}
 
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while(T--) solve();
}

有空补一下dp的题解 

 C 平方差

考察:数论

5831ce8fefc24d1abd63717b3442dbf7.jpg

 先列出一些,可以猜测规律:可以被平方差表示的数  “是奇数”  或 “因子有4”。

后续证明验证确实是这样

bbc803af4ff345c9b5d787d201658992.jpg

 

代码直接可以写了,不过1e9的数据会超时,只能过92%

 

优化

先求 L 到R的偶数个数,再求L到R的4的倍数

这样就从O(n)的时间复杂度减小为O(1);

ac code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<long,long> pii;
#define int ll
const int dx[9]={-1, 0, 1, 0, 1, -1, 1, -1,0};
const int dy[9]={0, 1, 0, -1, -1, 1, 1, -1,0};
#define INF 0x3f3f3f3f
const int N=2e5+10;

void solve()
{
	int l,r;
	cin>>l>>r;

	int a=r/2-(l-1)/2; //偶数个数
	int b=r/4-(l-1)/4;  //4的倍数
	int cnt=a-b;  
	int ans=r-(l-1)-cnt;
	cout<<ans;

}
 
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while(T--) solve();
}

D 更小的数

思路:往后找 比当前位小的数 的个数

如果相等就继续比较

AC code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<long,long> pii;
#define int ll
const int dx[9]={-1, 0, 1, 0, 1, -1, 1, -1,0};
const int dy[9]={0, 1, 0, -1, -1, 1, 1, -1,0};
string s;
int res=0;
void solve()
{
    cin>>s;
    for(int i=0;i<s.size();i++)
    {
        for(int j=i+1;j<s.size();j++)
        {
            if(s[i]>s[j]) res++;
            else if(s[i]==s[j])
            {
                int l=i+1;
                int r=j-1;
                while(s[l]==s[r]&&l<r)
                {
                    l++;
                    r--;
                }
                if(s[l]>s[r]) res++;
            }
        }
    }
    cout<<res<<endl;
}
 
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while(T--) solve();
}

 

E 颜色平衡树

 

F 买瓜

考察:dfs、剪枝

AC code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<long,long> pii;
#define int ll
const int dx[9]={-1, 0, 1, 0, 1, -1, 1, -1,0};
const int dy[9]={0, 1, 0, -1, -1, 1, 1, -1,0};
#define INF 0x3f3f3f3f
const int N=100;
 
double v[N];
double s[N];
int n,m,ans=INF;
 
void dfs(double sum,int res,int index) //sum当前瓜质量,res砍了几刀,index序号
{
    if(sum==m)
    {
        ans=min(ans,res);
        return;
    }
    if(index>n) return;
    if(res>=ans) return;
    if(sum>m) return;
    if(sum+s[index]<m) return;
    dfs(sum+v[index],res,index+1);
    dfs(sum+v[index]/2.0,res+1,index+1);
    dfs(sum,res,index+1);      
}
void solve()
{
      
    cin>>n>>m;
 
    for(int i=1;i<=n;i++) cin>>v[i];
    sort(v+1,v+1+n,[&](double x,double y){return x>y;});
    for(int i=n;i>=1;i--)
    {
        s[i]=s[i+1]+v[i];
    }
    dfs(0.0,0,1);
    if(ans==INF) cout<<-1<<endl;
    else cout<<ans<<endl;
}
  
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while(T--) solve();
}

 

G 网络稳定性

 

H 异或和之和

先试了试只有前缀和的做法,过了62%

这先要了解关于前缀异或和的前置知识:

edc1c0243d2b49179e85d8baa173ebe2.jpeg

 

62 %   code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<long,long> pii;
#define int ll
const int dx[9]={-1, 0, 1, 0, 1, -1, 1, -1,0};
const int dy[9]={0, 1, 0, -1, -1, 1, 1, -1,0};
const int N=1e5+10;
int n,sum=0;
int s[N],a[N];
void solve()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        s[i]=s[i-1]^a[i];
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=i;j<=n;j++)
        {
            sum+=s[i-1]^s[j];
        }
    }
    cout<<sum<<endl;
}
 
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while(T--) solve();
}

优化:贡献法

ac code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<long,long> pii;
#define int ll
const int dx[9]={-1, 0, 1, 0, 1, -1, 1, -1,0};
const int dy[9]={0, 1, 0, -1, -1, 1, 1, -1,0};
#define INF 0x3f3f3f3f
const int N=1e5+10;

void solve()
{
    int n,ans=0;
    cin>>n;
    vector<int>a(n);
    for(int i=0;i<n;i++) cin>>a[i];
    for(int i=20;i>=0;i--)  //枚举每一位
    {
    	int s=0,even=1,odd=0; 
    	//记录第i位时到第j个数有s个1,even个偶数,odd个奇数
    	for(int j=0;j<n;j++)
    	{
    		int bit=(a[j]>>i)&1;
    		s+=bit;
    		//差分
    		if(s%2)  //是奇数
    		{
    			ans+=even*(1<<i);  
                //奇-偶=奇  (奇个1异或和是1)
    			odd++;
    		}
    		else
    		{
    			ans+=odd*(1<<i); 
                //偶-奇=奇 (奇个1异或和是1)
    			even++;
    		}
    	}
	}
	cout<<ans<<endl;
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    int T = 1;
    //cin >> T;
    while(T--) solve();
}

有一道很相似的类运算题,不过是与运算

题目链接 

I 像素放置

dfs

J 翻转硬币

 

  • 43
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值