蓝桥杯 Day 13(C++)

Dream-Y.ocean 先躺在说
C/C++领域潜力新星
2023-03-16 21:18:16

特殊日期

#include <iostream>
#include <vector>

using namespace std;

int ans = 0;

int day[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

int main()
{
    for(int year = 1900; year <= 9999; year ++)
    {
        for(int month = 1; month <= 12; month ++)
        {
            int tmp = year;
            int sum1 = 0;
            while(tmp)
            {
                sum1 += tmp % 10;
                tmp /= 10;
            }

            tmp = month;
            int sum2 = 0;
            while(tmp)
            {
                sum2 += tmp % 10;
                tmp /= 10;
            }

            for(int i = 1; i <= day[month]; i++)
            {
                int sum3 = 0;
                int tmp = i;
                while(tmp)
                {
                    sum3 += tmp % 10;
                    tmp /= 10;
                }

                if(sum1 == sum2 + sum3)
                {
                    ans ++;
                }
            }

            if(month == 2)
            {
                if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
                {
                    if(sum1 == sum2 + 2 + 9)
                    {
                        ans ++;
                    }
                }
            }
        }
    }

    cout << ans << endl;

    return 0;
}

img

重合次数

#include <iostream>

using namespace std;

int main()
{


    cout << 494 << endl;


    return 0;
}

左移右移

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

const int INF = 0x3f3f3f;

const int N = 1e6;

int n,m;

//思路:先预处理经过m次操作后的数字的位置,然后直接放数字即可

int main()
{
    cin >> n >> m;

    vector<pair<int, int>> v(n);

    //初始权重为自己的位置
    for(int i = 0; i< n; i++)
    {
        v[i].first = i + 1; //自己的位置
        v[i].second = i + 1;
    }

    int left = -1, right = n + 1;

    while(m --)
    {
        char op;
        int num;

        cin >> op >> num;

        if(op == 'L')
        {
            v[num - 1].first = left;
            //表示下一个到最左边的数 需要 比当前最左边的数 还要左
            left --;
        }
        else
        {
            v[num - 1].first = right;
            right ++;
        }    
    }

    sort(v.begin(), v.end());

    for(auto it : v)
    {
        cout << it.second << ' ';
    }

    return 0;
}

img

近似gcd

#include <iostream>

using namespace std;

//思路:最大gcd -- 也就说明 如果某个区间中的数字 都是 gcd的倍数的话,则说明这个区间就是满足条件的
//【题目可知 这区间可最大存在一个元素不满足是gcd的倍数,即 对其进行修改】
//也就是说,此时题目转换为:找出长度 >=2 的子数组中最多存在1个元素不满足是gcd的倍数

int n,g;

const int N = 1e5 + 10;

int a[N];

int main()
{
    cin >> n >> g;

    //此时我们可以转换数组的值
    //用1表示这个元素是满足gcd的倍数,0表示不满足
    for(int i = 1; i <=n; i++)
    {
        int tmp;
        cin >> tmp;
        a[i] = (tmp % g == 0 ? 1 : 0);
    }

    int ans = 0;

    //找子数组 -- 枚举右端点
    for(int i = 2; i <= n; i++)
    {
        //计算这个区间中出现了0的个数
        int flags = 0;

        if(a[i] == 0)
        {
            flags ++;
        }

        int j = i - 1;

        //从右往左 枚举 左端点
        while(j >= 1)
        {
            if(a[j] == 0)
            {
                flags ++;
            }

            if(a[j] != 0 || flags <= 1)
            {
                ans ++;
                j --;
            }

            if(flags > 1)
            {
                break;
            }
        }
    }

    cout << ans << endl;

    return 0;
}

img

...全文
8 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

50,782

社区成员

发帖
与我相关
我的任务
社区描述
和众多高校算法内卷分子,一起学习和交流算法那。浓郁的算法交流氛围,拒绝躺平,有效内卷。加入我们,私信我拉你入核心内卷群。
算法数据结构leetcode 个人社区
社区管理员
  • 执 梗
  • Dream-Y.ocean
  • ღCauchyོꦿ࿐
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

 刷题!

试试用AI创作助手写篇文章吧