zoukankan      html  css  js  c++  java
  • 倒水

    【题目描述】 

    从前有一个DTZ,它面前有一排格子,每个格子都放着一个杯子,每个杯子下面都配有一个集水盘,每个杯子都有有限的容量,而集水盘没有容量限制。

    由于水利局局长Skylynf想喝水,DTZ需要往杯子里面倒水。

    DTZ有两种操作,1.倒水;2.交换。具体如下:

    · 1.倒水:DTZ不是一个一个杯子地倒水,而是一片片的倒水。它每次选择一个连续区域a~b,第a个杯子倒到第b个杯子(包含ab),往里面的每个杯子倒入相同的水(即杯子们的水量同时加上一个数)。由于杯子大小不一。倒了若干次以后,某些杯子会溢出来很多水,流进这些杯子下面的集水盘里面。如果第a个杯子(即最前面那个杯子)溢水了,DTZ就会毫不犹豫地交换第a个杯子和第b个杯子,但不移动原本的集水盘。(以上2个操作同属1个倒水操作)

    · 2.交换:但是DTZ特别调皮,除了上述情况,他有时候会在倒完一片水之后,交换一些杯子的位置,但不移动原本的集水盘。

    Skylynf在想知道DTZ一系列操作完成后,最后所有杯子水量的情况的同时,喝令DTZ算出每个集水盘有多少被浪费的水。

    同时,DTZ被红云威胁去帮它解密码,好让红云有时间喂养它的蜘蛛们,但他倒水任务在身,请你赶快帮他完成任务,不然DTZ就会变成一台Iphone6.

    所以请帮DTZ计算一下倒水的结果吧。

    【输入描述】 

    第一行2个整数n,m,表示方格阵有n个格子(1<=n<=3000 1<=m<=100),DTZ总共倒了m次水。

    接下来一行n个整数,每个数字之间用空格隔开。表示每个杯子的最大容量为X 份水(1<=X<=1000)。

    接下来m行,每行3个整数a, b, s (1<=a<=b<=n 0<=s<=30),

    · 如果s等于0,则表示DTZ要把第a个杯子和第b个杯子交换位置;

    · 如果s不为0,那就表示DTZ要倒水,这次倒水从第a个杯子倒到第b个杯子(包含ab)每一个杯子倒s份水。

    【输出描述】 

    第一行n个整数,每个整数之间用空格隔开,表示最后每个杯子里面有多少水。

    接下来一行再有n个整数,表示最后每个杯子的集水盘里面有多少水。

    【输入样例】 

    3 3

    1 2 3

    1 2 1

    1 3 0

    2 3 1

    【输出样例】 

    0 2 1

    0 0 1



    程序:

    var
    n,m,i,a,b,s:longint;
    x:array[0..6000]of longint;
    r,p:array[0..5000]of int64;
    procedure jh;
    begin
        x[0]:=x[a];x[a]:=x[b];x[b]:=x[0];
        r[0]:=r[a];r[a]:=r[b];r[b]:=r[0];
    end;
    procedure js;
    var
    i:longint;
    begin
        for i:=1 to n do
        begin
            if r[i]>x[i] then
            begin
                p[i]:=(r[i]-x[i])+p[i];
                r[i]:=x[i];
            end;
        end;
    end;
    procedure jia;
    var
    i:longint;
    begin
        for i:=a to b do
        r[i]:=r[i]+s;
        for i:=a+1 to b do
        if r[i]>x[i] then
        begin
            p[i]:=(r[i]-x[i])+p[i];
            r[i]:=x[i];
        end;
    end;
    begin
        fillchar(r,sizeof(r),0);
        fillchar(p,sizeof(p),0);
        readln(n,m);
        for i:=1 to n do
        read(x[i]);
        readln;
        for i:=1 to m do
        begin
            readln(a,b,s);
            if s=0 then jh;
            if s>0 then
            begin
                jia;
                if r[a]>x[a] then
                begin
                    p[a]:=p[a]+(r[a]-x[a]);
                    r[a]:=x[a];
                    jh;
                end;
            end;
        end;
        js;
        for i:=1 to n do
        write(r[i],' ');
        writeln;
        for i:=1 to n do
        write(p[i],' ');
    end.

  • 相关阅读:
    paip.51cto HTML转码规则
    常用记账软件总结
    paip.为什么软件体积越来越大
    paip.版本控制CVSSVNTFS总结
    paip.提升用户体验导入导出
    paip.手机ROOT过程总结
    PAIP.http post 400错误
    paip.javaaspphp.net互相调用方法大总结
    PAip.英文引擎在项目开发上的作用
    paip.SVN无法提交提示冲突的解决
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9500114.html
Copyright © 2011-2022 走看看