第十四届蓝桥杯c++b组题解

 

 这里用dfs写,带剪枝

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

const int N = 1e2 + 1;
int a[N];

set<int> s;

bool check(int date)
{
    int mm = date / 100 % 100;
    int dd = date % 100;
    if (mm < 1 || mm > 12)
        return false;
    if (mm == 1 || mm == 3 || mm == 5 || mm == 7 || mm == 8 || mm == 10 || mm == 12)
    {
        if (dd >= 1 && dd <= 31)
            return true;
    }
    else if (mm == 2)
    {
        if (dd >= 1 && dd <= 28)
            return true;
    }
    else if (dd >= 1 && dd <= 30)
        return true;

    return false;
}

void dfs(int x, int cnt, int date)
{
    if (x == 100)
        return;
    if (cnt == 8)
    {
        if (check(date))
            s.insert(date);
        return;
    }

    if (cnt == 0)
        date = 0;

    if ((cnt == 0 && a[x] == 2) || (cnt == 1 && a[x] == 0) || (cnt == 2 && a[x] == 2) || (cnt == 3 && a[x] == 3) || (cnt == 4 && a[x] >= 0 && a[x] <= 1) || (cnt == 5 && a[x] >= 0 && a[x] <= 9) || (cnt == 6 && a[x] >= 0 && a[x] <= 3) || (cnt == 7 & a[x] >= 0 && a[x] <= 9))
        dfs(x + 1, cnt + 1, date * 10 + a[x]); // 合法可以选

    dfs(x + 1, cnt, date); // 不选
}
int main()
{
    for (int i = 0; i < 100; i++)
        cin >> a[i];
    dfs(0, 0, 0);
    cout << s.size() << endl;

    return 0;
}

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

const int N = 23333333,M = N/2;
long double eps = 11625907.5798;
int cal(int i)
{
    long double p;
    long double n0 = i;
    long double n1 = N-i;
    p = -((n0*n0/N)*log2l(n0/N)+(n1*n1/N)*log2l(n1/N));
    //cout<<p<<endl;
    if(abs(p-eps)<0.0001)
        cout<<i<<endl;

    return p;
}

int main()
{
    //cout<<cal(114514)<<endl;
    for(int i = 1;i<=N/2;i++)
        cal(i);

    return 0;
}

 对答案使用二分,复杂度o(nlog(n))

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

const int N = 1e5 + 1;
int a[N], b[N], n;

bool checkmin(int mid)
{
    for (int i = 0; i < n; i++)
        if (a[i] / mid > b[i])
            return false;
    return true;
}

bool checkmax(int mid)
{
    for (int i = 0; i < n; i++)
        if (a[i] / mid < b[i])
            return false;
    return true;
}

int main()
{
    cin >> n;

    for (int i = 0; i < n; i++)
        cin >> a[i] >> b[i];

    int l = 0, r = 1e9;
    while (l <= r)
    {
        int mid = (l + r) >> 1;
        if (checkmin(mid))
            r = mid - 1;
        else
            l = mid + 1;
    }

    cout << l << " ";

    l = 0, r = 1e9;
    while (l <= r)
    {
        int mid = (l + r) >> 1;
        if (checkmax(mid))
            l = mid + 1;
        else
            r = mid - 1;
    }

    cout << r << endl;

    return 0;
}

 

 

 

 

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

const int N = 1001;
int T, n;
int t[N], d[N], l[N];
bool st[N];
bool flag = false;

void dfs(int k, int time)
{
    if (k == n - 1)
    {
        flag = true;
        return;
    }

    for (int i = 0; i < n; i++)
    {
        if (!st[i])
        {
            if (t[i] + d[i] >= time)
            {
                st[i] = true;
                dfs(k + 1, max(time + l[i], t[i] + l[i]));
                st[i] = false; // 找完了放回去}
            }
        }
    }
}
void solve()
{
    flag = false;
    memset(st, 0, sizeof(st));
    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> t[i] >> d[i] >> l[i];

    for (int i = 0; i < n; i++)
    {
        if (!st[i])
        {
            st[i] = true;
            dfs(0, t[i] + l[i]);
            st[i] = false;
        }
    }

    if (flag)
        cout << "YES" << endl;
    else
        cout << "NO" << endl;
}

int main()
{
    cin >> T;
    while (T--)
        solve();

    return 0;
}

/*
2
3
0 100 10
10 10 10
0 2 20
3
0 10 20
10 10 20
20 10 20

*/

 

 

dp

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

const int N = 1e5 + 1;

int f[N];
int a[N], last[N], st[N];
int n;

int get_the_first_number(int n)
{
    while (n)
    {
        int t = n % 10;
        n /= 10;
        if (n == 0)
            return t;
    }
    return 0;
}

int get_the_last_number(int n)
{
    return n % 10;
}

bool check(int a, int b)
{
    int a_last = get_the_last_number(a);
    int b_first = get_the_first_number(b);

    if(a_last==b_first)
        return true;
    return false;
}

int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];

    for (int i = 1; i <= n; i++)
    {
        f[i] = f[i - 1];
        st[i] = st[i - 1];
        if (i == 1 || check(st[i], a[i]))
        {
            f[i]++;
            st[i] = a[i];
        }
    }

    cout<<n-f[n]<<endl;

    return 0;
}

### 第十四届蓝桥杯 C++ B 目解析 以下是关于第十四届蓝桥杯 C++ B的部分目解析及其相关内容: #### 一、整体趋势分析 近年来,蓝桥杯的难度有所调整,不再单纯依赖“暴力求解”,而是更加注重动态规划 (DP) 和搜索图论的应用。这种变化使得参者需要具备更强的算法设计能力和逻辑思维能力[^1]。 #### 二、具体目解析 由于完整的官方题解可能无法完全公开获取,以下提供部分典型目的思路和解答方法: ##### 1. 填充问(Greedy Algorithm) 此属于典型的贪心类问。其核心在于如何通过局部最优策略实现全局最优效果。参考某篇博客中的解决方案可知,在处理此类问时应优先考虑资源分配的最大化利用原则[^2]。 ```cpp #include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; // 输入数据量大小n vector<int> a(n); for(auto &x : a){ cin>>x; } sort(a.begin(),a.end()); long long sum=0LL; for(int i=0;i<n/2;i++)sum +=(long long)(a[n-i-1]-a[i]); cout<<sum<<endl; } ``` 上述代码片段展示了针对该问的一种高效解决方式——通过对数排序并计算差值来达到目标函数最大化的目的。 ##### 2. 翻转操作(Thinking Problem) 对于涉及字符串或者序列变换的操作,《翻转》这类目往往考验选手的基础编程技巧与灵活运用能力。通常情况下,可以通过模拟实际过程完成任务;但在某些特殊场景下,则需引入额外的数据结构辅助运算以提升效率。 ```cpp string reverseString(string s, int k){ string res = ""; bool flag=true; while(!s.empty()){ if(flag && k<=s.size()){// 当前段长度大于等于k则反转前k个字符 string temp=s.substr(0,k);reverse(temp.begin(),temp.end());res+=temp;s.erase(0,k); }else{ res+=flag?s:s.substr(s.size()-k+1,s.size());// 不足k个按原样加入结果串 break; } flag=!flag;// 切换状态 } return res+s; } ``` 这里给出了一种基于条件判断逐步构建最终输出的方法,体现了程序设计过程中清晰逻辑的重要性。 #### 总结说明 以上仅列举了两个具有代表性的例子,并附上了相应的实现方案供学习交流之用。更多深入探讨可查阅相关资料进一步了解[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值