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.

  • 相关阅读:
    Window 窗口类
    使用 Bolt 实现 GridView 表格控件
    lua的table库
    Windows编程总结之 DLL
    lua 打印 table 拷贝table
    使用 xlue 实现简单 listbox 控件
    使用 xlue 实现 tips
    extern “C”
    COleVariant如何转换为int double string cstring
    原来WIN32 API也有GetOpenFileName函数
  • 原文地址:https://www.cnblogs.com/YYC-0304/p/9500114.html
Copyright © 2011-2022 走看看