首页 > 其他分享 >差分约束应用题

差分约束应用题

时间:2024-04-13 22:12:40浏览次数:22  
标签:cnt dist C24 应用题 int tt 差分 约束 st

// 差分约束,此题难点在于如何找出这些关系
// 1-24是一个环,这里处理办法是把24时固定
// 当 i > 8 时,s[i] >= R[i] + s[i − 8]
// 当 i <= 7 时,s[i] >= s[16 + i] - s[24] + R[i]
// 当 1 <= i <= 24时,s[i] >= s[i − 1], s[i - 1] >= s[i] - num[i]

#include <iostream>
#include <cstring>

using namespace std;

const int N = 30, M = 100;

int nums[N], r[N];
int head[N], ver[M], edge[M], Next[M], tot;
int q[N], cnt[N], tt, hh;
int dist[N], n;
bool st[N];

void add(int u, int v, int w) {
    ver[++tot] = v, edge[tot] = w, Next[tot] = head[u], head[u] = tot;
}

void build(int C24) {
    memset(head, 0, sizeof head);
    tot = 0;
    for (int i = 1; i <= 24; i++) {
        add(i - 1, i, 0);
        add(i, i - 1, -nums[i]);
    }
    for (int i = 8; i <= 24; i++) add(i - 8, i, r[i]);
    for (int i = 1; i < 8; i++) add(i + 16, i, -C24 + r[i]);
    // 固定24,S24 >= C24 && C24 >= S24
    // 为了与0相连,所以 S24 >= C24 + S0, S0 >= S24 - C24;
    add(0, 24, C24), add(24, 0, -C24);
}

bool spfa(int C24) {

    build(C24);
    memset(dist, -0x3f, sizeof dist);
    memset(st, 0, sizeof st);
    memset(cnt, 0, sizeof cnt);

    hh = tt = 0;
    q[tt++] = 0;
    st[0] = true;
    dist[0] = 0;

    while (hh != tt) {
        int t = q[hh++];
        if (hh == N) hh = 0;
        st[t] = false;

        for (int i = head[t]; i; i = Next[i]) {
            int j = ver[i];

            if (dist[j] < dist[t] + edge[i]) {
                dist[j] = dist[t] + edge[i];
                cnt[j] = cnt[t] + 1;

                if (cnt[j] >= 25) return false;

                if (!st[j]) {
                    st[j] = true;
                    q[tt++] = j;
                    if (tt == N) tt = 0;
                }
            }
        }
    }
    return true;

}

int main() {
    int t;
    cin >> t;
    while (t--) {
        for (int i = 1; i <= 24; i++) cin >> r[i];
        cin >> n;
        memset(nums, 0, sizeof nums);
        for (int a, i = 0; i < n; i++) {
            cin >> a;
            nums[a + 1]++;
        }

        bool flag = false;
        for (int i = 0; i <= 1000; i++) {
            if (spfa(i)) {
                cout << i << endl;
                flag = true;
                break;
            }
        }
        if (!flag) puts("No Solution");
    }

    return 0;
}

标签:cnt,dist,C24,应用题,int,tt,差分,约束,st
From: https://www.cnblogs.com/zdwzdwzdw/p/18133467

相关文章

  • [学习笔记] 树上差分 - 图论
    前置知识:树,LCA,前缀和与差分边差分这个名字是在网上看到的,不理解为什么要叫这么一个名字,可能是因为它与树链修改有关。当然,用于树链修改单点查询非常方便~看这个图,该图是以点1为根进行DFS的。如果我们要把从3->4这条树链上所有的点统统加上1,可以都转化为对到根节点的......
  • 简单处理——FPGA实现图像中心差分变换
    简单处理——FPGA实现图像中心差分变换一、图像中心差分变换算法简介​ 差分图像就是目标场景在连续时间内图像相减所构成的图像,对图像进行中心差分变换的主要目的是计算图像中心每个像素点的梯度,而每个像素点的梯度在图像处理中就可以被用于描述图像中灰度变化的快慢和方向。......
  • 泛型类型参数约束2 - 枚举作为约束类型
    先复习下枚举的相关基础知识:枚举类型(EnumType)说明枚举只有一种成员:命名的整型常量的集合枚举是值类型使用枚举有效地防止用户提供无效值,使代码更加清晰定义枚举:注意:​枚举成员不可以使用修饰符​每个枚举成员底层都是一个常量值​默认情况下,枚举成员的类型是int......
  • 关于差分约束的一切
    观前须知笔者的博客主页声明本文使用CCBY-NC-SA4.0许可。本文为笔者在OI学习中的复习向学习笔记。部分内容会比较简略。如有好的习题会不断补充。知识简介差分约束解决这样一类问题:给定一个n元一次不等式组,让你求出一组解/判定是否有解/算出某个数的最值/算出和......
  • 【蓝桥·算法双周赛 第 9 场 小白入门赛】字符迁移【算法赛】题解(字符串+模运算+差分)
    思路差分数组是一种特殊的数组,它的第iii个数定义为原数组的第ii......
  • 简单处理——二值化(钢笔画)和差分化(浮雕画)
    简单处理——二值化(钢笔画)和差分化(浮雕画)一、钢笔画和浮雕画​ RGB转灰度图就类似于英语学习中的abandon,在熟悉了YCbCr等颜色空间以及简单的图像反转之后,我们可以将目光移向今天的主题——二值化和差分化;​ 二值化概念比较简单,就是你给灰度在0—255的灰度图像设置一个阈值,大于......
  • 差分和前缀和——蓝桥杯备赛
    一、大学里的树木要打药问题描述教室外有N棵树,根据不同的位置和树种,学校要对其上不同的药。因为树的排列成线性,且非常长,我们可以将它们看作一条直线给他们编号。树的编号从0∼N−1且N<1e6。对于树的药是成区间分布,比如3∼5号的树靠近下水道,所以他们要用驱蚊虫的药,20......
  • 差分
    前言学习差分前一定要先学习前缀和,因为差分就是前缀和的一个逆运算(有点像微分和积分),所以只有先搞清楚前缀和才能明白差分点这里补习前缀和这里同样也是从一维和二维两个角度去分析差分这个算法正文我们要先理清差分的含义:注意关系,这里跟前缀和里举的例子有差别,b的前缀和数组......
  • 差分约束
    前言考虑单源最短路的一个性质:在有向图中,若存在边\(u\tov\),边权为\(w\),则\(\mathit{dis}_u+w\ge\mathit{dis}_v\)。正确性是显然的,因为如果反之\(\mathit{dis}_u+w<\mathit{dis}_v\),我们就可以令\(\mathit{dis}_v\gets\mathit{dis}_u+w\),原先的就不是最短路了,与题设矛盾......
  • MySQL-相关约束
    MySQL-约束前提:防止数据库中存在不符合语义规定的数据和防止因错误信息的输入输出造成无效操作或错误信息。为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制。有以下考虑要点:①实体完整性(EntityIntegrity):例如,同一个表中,不能存在两条完全相同无法区......