首页 > 其他分享 >A组Day7

A组Day7

时间:2023-11-18 19:34:03浏览次数:31  
标签:int Day7 ll 差分 long 数组 change

A. 放置石子

image-20231118181321618

我们设第一格的东西为 \(x\) ,则接下来的格数为

\[2:1+x\\ 3:2x+1\\ 4:3x+2\\ 5:5x+3\\ ... \]

易得x的系数就是原来的斐波那契额数列,而后面加上来的也是!我们可以打表

image-20231118181709287

左边为系数表,右边为加的数表

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll xs[21] = {0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765};
ll k[21] = {1, 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181};
int main()
{
    freopen("kela.in", "r", stdin);
    freopen("kela.out", "w", stdout);
    long long a, x, b;
    while (cin >> a >> x >> b)
    {
        if ((x - k[a]) % xs[a] == 0)
            printf("%lld\n", (x - k[a]) / xs[a] * xs[b] + k[b]);
        else
            puts("-1");
    }
    return 0;
}

B.连通块数

image-20231118181811876

暴力进行dfs即可,这里注意,每次进行dfs的时候都要扩展完毕,然后后面一遇到没扩展的就扩展

#include <bits/stdc++.h>
using namespace std;
const int N = 55;
int l, w, h, m;
int dx[7] = {0, 0, 0, 0, 0, 1, -1};
int dy[7] = {0, 0, 0, -1, 1, 0, 0};
int dz[7] = {0, 1, -1, 0, 0, 0, 0};
int a[N][N][N];
bool vis[N][N][N];
int ans = 0;

void dfs(int x, int y, int z)
{
    for (int i = 1; i <= 6; i++)
    {
        int tx = x + dx[i], ty = y + dy[i], tz = z + dz[i];
        if (tx < 1 || tx > l || ty < 1 || ty > w || tz < 1 || tz > h || vis[tx][ty][tz])
            continue;
        if (abs(a[x][y][z] - a[tx][ty][tz]) <= m)
        {
            vis[tx][ty][tz] = 1;
            dfs(tx, ty, tz);
        }
    }
}

int main()
{
    freopen("engineer.in", "r", stdin);
    freopen("engineer.out", "w", stdout);
    cin >> l >> w >> h;
    cin >> m;
    for (int i = 1; i <= l; i++)
        for (int j = 1; j <= w; j++)
            for (int k = 1; k <= h; k++)
                cin >> a[i][j][k];
    for (int i = 1; i <= l; i++)
        for (int j = 1; j <= w; j++)
            for (int k = 1; k <= h; k++)
            {
                if (!vis[i][j][k])//就是这里
                {
                    ans++;
                    vis[i][j][k] = 1;
                    dfs(i, j, k);
                }
            }
    cout << ans << endl;
    return 0;
}

C.股票问题

反悔贪心模板题目

#include <bits/stdc++.h>
using namespace std;
int n;
priority_queue<int, vector<int>, greater<int>> q;
int main()
{
	freopen("b.in", "r", stdin);
	freopen("b.out", "w", stdout);
    long long ans = 0;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        int k;
        cin >> k;
        if (!q.empty() && q.top() < k)////如果今天的卖出股票比之前的某一天卖出股票更优的话,就买回之前的股票,然后再卖出今天的股票
            ans += k - q.top(), q.pop(), q.push(k);
        q.push(k);
    }
    cout << ans << endl;
    return 0;
}

D.灯泡开关

考虑加上一个等差数列。

怎么维护呢?先差分这个数组,举个例子,如果要在0 0 0 0 0 0 0 0 0 0 0中的3-7加一个从1开始的等差数列,

0 0 1 2 3 4 5 0 0 0 0差分后变成0 0 1 1 1 1 1 -5 0 0 0,就是一个区间+1后在末尾减掉最后一个数,

再差分一次,0 0 1 1 1 1 1 -5 0 0 0就变成了0 0 1 0 0 0 0 -6 5 0 0,发现等差数列差分两次后的数组只涉及三个数的修改。

所以我们每次更新原来的答案数组的差分再差分数组,最后前缀和还原差分数组以及还原原数组即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10;
int n, m;
ll a[N];
ll cnt[N][2];//cnt[i]表示以i为舒适值最多少走多少
//0,1分别是因为这是一个环差分。
ll check()
{
    ll res = 0;
    for (int i = 2; i <= n; i++)
    {
        if (a[i] > a[i - 1])
            res += a[i] - a[i - 1];
        else
            res += a[i] + m - a[i - 1];
    }
    return res;
}

void change(int l, int r, int s)
{
    // cout << l << ' ' << r << ' ' << s << endl;
    cnt[l][0] += s;
    cnt[r + 1][0] -= s;
    cnt[l + 1][1] += 1;
    cnt[r + 1][1] -= (r - l + 1);
    cnt[r + 2][1] += (r - l);
}

int main()
{
    freopen("light.in", "r", stdin);
    freopen("light.out", "w", stdout);
    cin >> n >> m;
    for (int i = 1; i <= n; i++)
        cin >> a[i];

    for (int i = 2; i <= n; i++)
    {
        if (a[i] > a[i - 1])
        {
            if (a[i] - a[i - 1] >= 2)
                change(a[i - 1] + 2, a[i], 1);
        }
        else
        {
            if (m - a[i - 1] >= 2)
                change(a[i - 1] + 2, m, 1), change(1, a[i], m - a[i - 1]);
            if (m - a[i - 1] == 1)
                change(1, a[i], 1);
            if (m == a[i - 1])
            {
                if (a[i] >= 2)
                    change(2, a[i], 1);
            }
        }
    }
    for (int i = 2; i <= m + 1; i++)
        cnt[i][0] += cnt[i - 1][0], cnt[i][1] += cnt[i - 1][1];
    for (int i = 2; i <= m + 1; i++)
        cnt[i][1] += cnt[i - 1][1];
    ll ans = 0;
    for (int i = 1; i <= m; i++)
        ans = max(ans, cnt[i][0] + cnt[i][1]);
    cout << check() - ans << endl;
    return 0;
}

标签:int,Day7,ll,差分,long,数组,change
From: https://www.cnblogs.com/ljfyyds/p/17840972.html

相关文章

  • pythonDay7
    列表值的追加、插入、删除 列表+count/index/reverse/sort/clear 补充1;队列  补充2:栈区 元组:tuple只能读不能改,就是一个不可变的列表字典的数据类型转换方式 字典删除 字典;clear\update\get\setdefault ......
  • qbxt 突破营 Day7 T3
    小葱想要吃糖,小葱将拿出来的N颗糖排成一排,第\(i\)颗糖的美味值为\(a_i\)。小葱很喜欢吃糖,所以小葱会从\(N\)颗糖选择不超过\(K\)段不相交的区间的糖果吃掉。但是小葱同学不希望别人吃到和他美味度差不多的糖,所以对于一颗没被吃掉的糖,小葱希望这颗糖美味度比他吃的糖的美味度最大......
  • qbxt 突破营 Day7 T2
    小葱将买来的糖放进了冰箱冷藏,但是小葱想吃糖了,小葱希望把自己想吃的糖从冰箱里面拿出来。具体来说,小葱同学的冰箱是一棵\(N\)个点的树,每个点有一颗糖,第\(i\)个点的糖的美味值是\(a_i\)。小葱每次取糖会从根节点出发,指定一个目标节点\(p\),走到\(p\)点并且把这条路径上的所有糖取......
  • 再谈 qbxt2023国庆刷题 Day7 T2 树
    T2倍增+换根即可,但赛时难写赛时想得线段树二分,也可from:https://www.cnblogs.com/fox-konata/p/17742669.html回头一看老师代码,发现换根换的非常神奇,长见识了方法0:第一次思考,以为要记录走排名为\(a_x\)和\(a_x+1\)的两个倍增数组,但发现并不好合并,也许可以憋出来,但还是......
  • qbxt2023国庆刷题 Day6 ~ Day7
    Day6\(100+30+100+0,rk3\),考成这样还能\(rk3\),好怪啊虽然但是\(T3\)是在\(oeis\)上找的,虽然写了随机数但还是运气好过掉了\(T2\)应该是写寄了吧,感觉自己做法并没有什么问题T1比较典的题,并查集维护下一个没被删的点即可复杂度\(O((n+Q)\alpha(n))\)T2题目里的同......
  • NOIP2023 国庆集训 A 组 Day7
    T1思路:因为只有三个串故枚举其中一个为调换的串,再枚举k验证即可。T2思路:正着不好做,考虑反着做。这样就不会覆盖之前的。赛时没想到这个常见套路,正难则反。T3事实上只有一种情况,故只需倒着枚举遇到a统计答案。使用一个变量sum来记录遇到下一个a的次数如果枚举到b,sum+=1。......
  • 加训日记 Day7——练题捏
    Day7,9.27  ·平凡的一天(指早上呼呼大睡)  ·今天挤时间把算法基础课看完了,时间拉的有点长  ·该开始一点一点写题了......
  • 随想录Day7|454. 四数相加Ⅱ、383. 赎金信、15. 三数之和、18. 四数之和
    随想录Day7|454.四数相加Ⅱ、383.赎金信、15.三数之和、18.四数之和 454.四数相加Ⅱ文章&视频讲解给你四个整数数组nums1、nums2、nums3和nums4,数组长度都是n,请你计算有多少个元组(i,j,k,l)能满足:0<=i,j,k,l<nnums1[i]+nums2[j]+nums3[k]+......
  • 日常记录--day7--2023-9月20日--周三
    日程:今天只有上午有节英语课,8点30起床,吃了个早饭去上课。中午小睡一个小时,下午没课,起来学习了一会Javaweb,今天主要学了HTML,自己写了个简单的,晚上7-9点继续javaweb,今天没有力扣。学了什么:Javaweb让人头疼,复习了之前的力扣题,继续学习Javaweb。PS:不想学习,想要成为充电线;......
  • drf-day7
    九个视图子类以后想写5个接口中的某一个或某几个或所有,只需要选择继承不同的类即可,类中只需要配置两个类属性queryset=Publish.objects.all()serializer_class=PublishSerialize使用九个视图子类两个综合类来写五个接口fromrest_framework.genericsimportListCrea......