uva 10683 Fill

https://vjudge.net/problem/UVA-10603

题意:

倒水问题,输出最少的倒水量和目标水量

如果无解,目标水量就是尽可能接近给定点的目标水量,但不得大于给定的目标水量

推推公式,不用分类讨论~\(≧▽≦)/~啦啦啦

#include<cstdio>
#include<cstring>
#include<queue>
#define N 201
using namespace std;
struct node
{
    int v[3],dis;
    bool  operator < (node p) const
    {
        return dis>p.dis;
    }
}now,nxt;
int v[N][N],cap[3],ans[N];
void up()
{
    int d;
    for(int i=0;i<3;i++)
    {
        d=now.v[i];
        if(ans[d]<0 || now.dis<ans[d]) ans[d]=now.dis;
    }
}
void solve(int a,int b,int c,int d)
{
    cap[0]=a; cap[1]=b; cap[2]=c;
    memset(v,0,sizeof(v));
    memset(ans,-1,sizeof(ans));
    priority_queue<node>q;
    node s;
    s.dis=0; s.v[0]=0; s.v[1]=0; s.v[2]=c;
    q.push(s);
    v[0][0]=1;
    while(!q.empty())
    {
        now=q.top(); q.pop();
        up();
        if(ans[d]>=0) break;
        for(int i=0;i<3;i++)
         for(int j=0;j<3;j++)
          if(i!=j)
          {
               if(!now.v[i] || now.v[j]==cap[j]) continue;//
               int amount=min(cap[j],now.v[i]+now.v[j])-now.v[j];
               nxt=now;
               nxt.dis+=amount;
               nxt.v[i]-=amount;
               nxt.v[j]+=amount;
               if(!v[nxt.v[0]][nxt.v[1]]) { v[nxt.v[0]][nxt.v[1]]=true; q.push(nxt); }
          }
    }
    while(d>=0)
    {
        if(ans[d]>=0) { printf("%d %d\n",ans[d],d);  return;}
        d--;
    }
}
int main()
{
    int T,a,b,c,d;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d%d",&a,&b,&c,&d);
        solve(a,b,c,d);
    }
}
 
时间: 2024-11-09 02:24:59

uva 10683 Fill的相关文章

UVA 10603 Fill(正确代码虽然很搓,网上许多代码都不能AC)

在做用户查找时 因为要把查找的结果动态加载和显示,所以,那些html元素要由Ajax动态生成.用户打开查找界面时,有系统推荐的用户,而当用户按条件查找后,查找的结果动态加载和显示.所以考虑到用js来搞. 这个for循环就是移除已有的表单.然后根据Ajax请求过来的数据,动态生成新的表单对象.一定要注意j变量从大往小循环,否则,删除div元素后会引起serchResultLenth=serchResult.children.length;长度的变化(这个问题摸索了好久,才搞定,切记) for(va

uva 10603 Fill (BFS)

uva 10603 Fill There are three jugs with a volume of a, b and c liters. (a, b, and c are positive integers not greater than 200). The first and the second jug are initially empty, while the third is completely filled with water. It is allowed to pour

[2016-03-19][UVA][11520][Fill the Square]

时间:2016-03-19 14:52:10 星期六 题目编号:[2016-03-19][UVA][11520][Fill the Square] 题目大意:给定n<=10 的不完全矩阵,求填充完整矩阵,使得相邻的字母不同,并且字典序最小,输出最终的矩阵 方法:从左到右,从上到下,每个空格枚举'A'-'Z'的所有情况,满足就跳出 #include <cstdio> using namespace std; #define FOR(x,y,z) for(int (x)=(y);(x)<

uva 11520 Fill the Square(枚举)

uva 11520 Fill the Square In this problem, you have to draw a square using uppercase English Alphabets. To be more precise, you will be given a square grid with some empty blocks and others already filled for you with some letters to make your task e

UVA 10603 Fill(正确代码尽管非常搓,网上很多代码都不能AC)

题目链接:option=com_onlinejudge&Itemid=8&page=show_problem&problem=1544">click here~ 此题我预计是加强过数据,在我纠结了非常久的时候我交了好几份网上的代码不是WA就是TLE.在我非常迷茫的时候我又交了一份,AC了(尽管我用随机数据找到了他代码一个不能过的数据). 给了我信心.然后我拿他的代码用随机数跟我的代码进行測试.再用FC找不同..发现了一个致命的错误.一般来说,BFS或者DFS都是须要

UVa 10603 Fill [暴力枚举、路径搜索]

10603 Fill There are three jugs with a volume of a, b and c liters. (a, b, and c are positive integers not greater than 200). The rst and the second jug are initially empty, while the third is completely lled with water. It is allowed to pour water f

uva 10603 Fill(倒水问题 BFS)

貌似uva崩了,现在进不去,所以这道题还判断正确与否,其实无所谓了,我这是看的网上的代码,写的基本上一样,唉,没办法,不会做,又看了网上的题解,认真写理解吧还是... 构造了一个结构体,water数组用来保存三个杯子的状态,sum用来保存当前的倒水量,visit数组用来保存状态,以 防他们重复访问,三个杯子只需要两个杯子来判断,第三个已经确定,所以开一个二维数组就可以了...然后用 reach数组来存储所有的倒水量,下标是目标水量,值是一共的倒水量... 只需要一次BFS最多有200*200种状

Uva 11520 - Fill the Square 贪心 难度: 0

题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2515 题意 n*n矩阵中填入大写字母,n <= 10,要求从上到下从左到右字母序最小,相邻格子字母不同 思路 如刘书思路,状态比较小,不会导致矛盾. 感想 1. 状态较小 代码 #include <algorithm> #include <cassert>

【路径寻找问题】UVa 10603 - Fill

如家大神书上的例题.第一次接触也是按代码敲得.敲的过程感觉很直观.但自己写估计会写的乱七八糟.以后不能砍得难就不愿意做这种题.否则只能做一些水题了.(PS:48) 紫书 1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<queue> 6 using namespace std; 7 const int maxn =