复赛后第一次正经写博客

HNOI的一道题,挺简单,差分约束解决。但听说可以用加权并查集解决,博主暂时不想想

粘题:

刁姹接到一个任务,为税务部门调查一位商人的账本,看看账本是不是伪造的。账本上记录了n个月以来的收入情况,其中第i 个月的收入额为Ai(i=1,2,3…n-1,n), 。当 Ai大于0时表示这个月盈利Ai 元,当 Ai小于0时表示这个月亏损Ai 元。所谓一段时间内的总收入,就是这段时间内每个月的收入额的总和。 刁姹的任务是秘密进行的,为了调查商人的账本,她只好跑到商人那里打工。她趁商人不在时去偷看账本,可是她无法将账本偷出来,每次偷看账本时她都只能看某段时间内账本上记录的收入情况,并且她只能记住这段时间内的总收入。 现在,刁姹总共偷看了m次账本,当然也就记住了m段时间内的总收入,你的任务是根据记住的这些信息来判断账本是不是假的。

输入:

第一行为一个正整数w,其中w < 100,表示有w组数据,即w个账本,需要你判断。每组数据的第一行为两个正整数n和m,其中n < 100,m < 1000,分别表示对应的账本记录了多少个月的收入情况以及偷看了多少次账本。接下来的m行表示刁姹偷看m次账本后记住的m条信息,每条信息占一行,有三个整数s,t和v,表示从第s个月到第t个月(包含第t个月)的总收入为v,这里假设s总是小于等于t。

输出:

包含w行,每行是true或false,其中第i行为true当且仅当第i组数据,即第i个账本不是假的;第i行为false当且仅当第i组数据,即第i个账本是假的。

关系式是:v<=x(t+1)-x(s)<=v

转化完是:x(s)+v<=x(t+1)     x(s)>=x(t+1)-v

取最小!

注意数组大小!!!

代码:

#include"cstdio"
#include"queue"
#include"cstring"
#define REP(i,n,x)for(i=x;i<=n;i++)
using namespace std;
struct Edge
{
    int v,w,next;
};
queue<int> end;
bool used[1000];
int dis[1000],p[1000],uses[1000],num=0,n,m;
Edge a[10000];
inline int SPFA(int i)
{
    end.push(i);
    used[i]=1;
    dis[i]=0;
    while(!end.empty())
    {
        int fro=end.front();
        uses[fro]++;
        used[fro]=0;
        end.pop();
        if(uses[fro]>=n)
            return 0;//把判断负环移到上面是为省点时间 
        for(int j=p[fro];j;j=a[j].next)
        if(dis[a[j].v]>dis[fro]+a[j].w)
        {
            dis[a[j].v]=dis[fro]+a[j].w;
            if(!used[a[j].v])
            {
                end.push(a[j].v);
                used[a[j].v]=1;
            }
        }
        
    }
}
int add(int u,int v,int w)
{
    a[++num].v=v;
    a[num].w=w;
    a[num].next=p[u];
    p[u]=num;
}
int main()
{
    int number,i,j;
    scanf("%d",&number);
    REP(i,number,1)
    {
        memset(used,false,sizeof(used));
        memset(uses,0,sizeof(uses));
        memset(p,0,sizeof(p));
        scanf("%d%d",&n,&m);
        REP(j,n+1,1)
        dis[j]=0x7ffffff;
        num=0;
        REP(j,m,1)
        {
        	int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            add(u,v+1,w);
            add(v+1,u,-w);
        }
        bool k;
        REP(j,n+1,1)
        if(!uses[j])
        {
            k=SPFA(j); 
            if(!k)
            {
                printf("false\n");
                break;
            }
        }
        if(k)printf("true\n");
    }
    return 0;
}
做完,挺好做的!

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值