蓝桥杯真题

2020 C合并检测

#include<iostream>
using namespace std;
int main()
{
    int m=100000000;//自行假设人数
    int minn=9999999;
    int k,sum,ans;
    for(k=1;k<=100;k++)
    {
        if(100%k==0)
        {
            sum=m/k+0.01*m*k;
        }
        else
            sum=m/k+0.01*m*k+1;
        if(sum<minn)//所需的试剂盒数量比较取小的
        {
            minn=sum;
            ans=k;
        }
    }
    cout<<ans<<endl;
}

冶炼金属

#include<iostream>
/*  A->Bhttps://www.acwing.com/
V->1
A/V下取整个X =B  ->B*V<=A 
无b+1个 ***
所以a<(b+1)*V  ->a<,,
所以v>a/(b+1) <=a/b*/

//min:a/(b+1)+1  max:a/b
using namespace std;
int main()

{
    int n;
   
    cin>>n;
    int a,b;
    cin>>a>>b;
    int minn=a/(b+1),maxx=a/b;
    n--;
    while(n--)
    {
        cin>>a>>b;
        minn=max(a/(b+1) +1,minn);
        maxx=min(maxx,a/b);
    }
    printf("%d %d\n",minn,maxx);
    return 0;
}

积木画

dp

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e7+10,MOD=1e9+7;

int n;
//状态压缩数组
//数组第一行00,表示i-1列没有伸到i列,
//对i列进行操作,第i+1列可能的状态为:00,01,10,11,
//转换为十进制为0,1,2,3。对应数组位置上标为1,表示可以转换到。

//*******************************
//结合图解:https://www.acwing.com/solution/content/111473/
int g[4][4]={
    {1,1,1,1},
    {0,0,1,1},
    {0,1,0,1},
    {1,0,0,0},
    
    
};
int f[N][4];

int main()
{
    scanf("%d", &n);
    f[1][0]=1;//初始情况,第1列摆好,且从1列到第2列伸出来的状态为0的方案数,只有第一列竖着摆这1种状态

    for (int i = 1; i <= n; i ++ )//枚举每一列
        for (int j = 0; j < 4; j ++ )//枚举第i列的所有状态
            for (int k = 0; k < 4; k ++ )//枚举第i+1列的所有状态
                f[i+1][k]=(f[i+1][k]+ f[i][j]*g[j][k])%MOD;//判断第i列能否转移到第i+1列   对应图 j:第i列 
                //f[i][j]以前的个数,每组,每加一种情况,都有,,f[i][j]种 
//i,i+1状态固定:g[][];   :f[i][j]*g[j][k])%MOD;//判断第i列能否转移到第i+1列
    printf("%d\n",f[n+1][0]);//前n列都处理完,并且第n列没有伸出来的所有方案数。
 
    return 0;
}

acwing 1239 乘积最大

#include<iostream>
#include<algorithm>
#define LL long long int
using namespace std;
const int mod=1000000009;
const int N=100010;

LL a[N];
int main()
{
    //贪心;分类
    int n,k;
    cin>>n>>k;
    for(int i=0;i<n;i++) cin>>a[i];
    sort(a,a+n);
    int ans=1;
    int l=0,r=n-1;   //双指针
    int sign=1;
    if(k%2)
    {
        ans=a[r];
        if(a[r]<0)  //k奇数且全负数
        {
            sign=-1;
        }
        r--;k--;
    }
    while(k)
    {
        LL x=a[l]*a[l+1],y=a[r]*a[r-1];
        if(x*sign>y*sign)  //带符号判断
        {
            ans=x%mod*ans%mod;  //x先%mod 因为x*ans可能超过int
            l+=2;
        }
        else 
        {
            ans=y%mod*ans%mod;
            r-=2;
        }
        
        k-=2;
    }
    printf("%d\n",ans);  //奇数判断那里,ans=a[r]已经有负号
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值