BZOJ1077 : [SCOI2008]天平

首先通过差分约束系统建图,用Floyed算法求出任意两个砝码差值的上下界。

然后暴力枚举放在右边的砝码C,D,通过与A,B差值的上下界分类讨论统计方案。

时间复杂度$O(N^3)$。

#include<cstdio>
#define rep(i) for(i=0;i<=n+1;i++)
const int N=55,inf=1000;
int n,A,B,i,j,k,C,D,dx[N][N],dn[N][N],c1,c2,c3;char s[N][N];
inline void umin(int&a,int b){if(a>b)a=b;}
inline void umax(int&a,int b){if(a<b)a=b;}
int main(){
  scanf("%d%d%d",&n,&A,&B);
  rep(i)rep(j)if(i!=j)dx[i][j]=inf*2;
  for(i=1;i<=n;i++)dx[i][0]=dx[n+1][i]=0;
  dx[0][n+1]=2,dx[n+1][0]=-2;
  for(i=1;i<=n;i++)for(scanf("%s",s[i]+1),j=1;j<=n;j++){
    if(s[i][j]==‘-‘)dx[j][i]=-1;
    if(s[i][j]==‘=‘)dx[i][j]=0;
  }
  rep(k)rep(i)rep(j)umin(dx[i][j],dx[i][k]+dx[k][j]);
  rep(i)rep(j)if(i!=j)dn[i][j]=-inf*2;
  for(i=1;i<=n;i++)dn[0][i]=dn[i][n+1]=0;
  dn[0][n+1]=2,dn[n+1][0]=-2;
  for(i=1;i<=n;i++)for(j=1;j<=n;j++){
    if(s[i][j]==‘-‘)dn[i][j]=1;
    if(s[i][j]==‘=‘)dn[i][j]=0;
  }
  rep(k)rep(i)rep(j)umax(dn[i][j],dn[i][k]+dn[k][j]);
  for(C=1;C<=n;C++)if(C!=A&&C!=B)for(D=1;D<C;D++)if(D!=A&&D!=B){
    if(dn[C][A]>dx[B][D]||dn[D][A]>dx[B][C])c1++;
    if((dn[C][A]==dx[C][A]&&dn[B][D]==dx[B][D]&&dn[C][A]==dn[B][D])||
       (dn[D][A]==dx[D][A]&&dn[B][C]==dx[B][C]&&dn[D][A]==dn[B][C]))c2++;
    if(dx[C][A]<dn[B][D]||dx[D][A]<dn[B][C])c3++;
  }
  return printf("%d %d %d",c1,c2,c3),0;
}

  

时间: 2024-07-30 10:45:19

BZOJ1077 : [SCOI2008]天平的相关文章

洛谷P2474 [SCOI2008]天平

P2474 [SCOI2008]天平 题目背景 2008四川NOI省选 题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A 和B 放在天平的左边,需要另外选出两个砝码放在天平的右边.问:有多少种选法使得天平的左边重(c1).一样重(c2).右边重(c3)?(只有结果保证惟一的选法才统计在内) 输入输出格式 输入格式: 第一行包含三个正整数n,A,B(1<=A,B<=N,A 和B 不相等).砝码编号 为1~N.以下n行

[bzoj1077]天平

先考虑如何求出任意两数的最大差值和最小差值,直接差分约束建图跑floyd求最短路和最长路即可然后枚举i和j,考虑dA+dB和di+dj的关系,分两种情况移项,转化成dA-di和dj-dB的关系或dA-dj和di-dB的关系(只要有一个关系确定即确定)即可考虑(由于不等式都是两个变量,因此一定无法形成dA-dj和dB-di的固定关系) 1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,x,y,c1,c2,c3,mx[105][105

BZOJ1076: [SCOI2008]奖励关

1076: [SCOI2008]奖励关 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1669  Solved: 921[Submit][Status][Discuss] Description 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物, 每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再吃).  宝物一共有n种,系统每次抛出这n种宝物的概率都相同且

UVA - 12166 Equilibrium Mobile (修改天平)(dfs字符串表示的二叉树)

题意:问使天平平衡需要改动的最少的叶子结点重量的个数. 分析:天平达到平衡总会有个重量,这个重量可以由某个叶子结点的重量和深度直接决定. 如下例子: 假设根结点深度为0,结点6深度为1,若以该结点为基准(该结点值不变),天平要平衡,总重量是12(6 << 1),而若以结点3为基准,天平要平衡,总重量也是12(3 << 2). 由此可得,只需要算出以每个结点为基准的总重量,若该重量下对应的叶子结点最多,则使天平在此重量下平衡改变的叶子结点数最少. #pragma comment(li

UVa 12166 修改天平

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3318 题意:给一个深度不超过16的二叉树,代表一个天平.每根杆悬挂在中间,每个秤砣的重量已知,至少修改多少个秤砣的重量才能让天平平衡? 要让天平平衡,必须以其中一个秤砣作为标准,然后修改其余的秤砣.当以深度为d,值为x的叶子节点作为标准时,可以发现此时天平的总质量为x<<d.

bzoj:1673: [Usaco2005 Dec]Scales 天平

Description Farmer John has a balance for weighing the cows. He also has a set of N (1 <= N <= 1000) weights with known masses (all of which fit in 31 bits) for use on one side of the balance. He places a cow on one side of the balance and then adds

BZOJ 1079: [SCOI2008]着色方案 记忆化搜索

1079: [SCOI2008]着色方案 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1079 Description 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块.所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n.相邻两个木块涂相同色显得很难看,所以你希望统计任意两个相邻木块颜色不同的

二叉树的递归遍历 天平UVa839

题意:输入一个树状的天平,利用杠杆原理,根据力矩是否相等(W1D1==W1D2)判断天平是否平衡 解题思路:1.由于判断天平是否平衡,当W1和W2都为0的时候,会先输入左子树,再输入右子树 2.此时的W1和W2会变成子树的重量之和,此时最好用到引用(同时改变传入参数的值) 3.递归的输入,并且判断子天平是否平衡 代码如下: 1 #include<stdio.h> 2 #include<iostream> 3 using namespace std; 4 bool input(int

[SCOI2008] 着色方案[高维dp]

321. [SCOI2008] 着色方案 ★★★   输入文件:color.in   输出文件:color.out   简单对比时间限制:1 s   内存限制:64 MB 题目背景: 有n个木块排成一行,从左到右依次编号为1~n.你有k种颜色的油漆,其中第i 种颜色的油漆足够涂ci 个木块.所有油漆刚好足够涂满所有木块,即 c1+c2+...+ck=n.相邻两个木块涂相同色显得很难看,所以你希望统计任意两个相邻木块颜色不同的着色方案.[输入]第一行为一个正整数k,第二行包含k个整数c1, c2,