洛谷2474 [SCOI2008] 天平 差分约束->枚举
题目描述
你有n个砝码,均为1克,2克或者3克。你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系。你把其中两个砝码A 和B 放在天平的左边,需要另外选出两个砝码放在天平的右边。问:有多少种选法使得天平的左边重(c1)、一样重(c2)、右边重(c3)?(只有结果保证惟一的选法才统计在内)
输入输出格式
输入格式:
第一行包含三个正整数n,A,B(1<=A,B<=N,A 和B 不相等)。砝码编号
为1~N。以下n行包含重量关系矩阵,其中第i行第j个字符为加号“+”表示砝
码i比砝码j重,减号“-”表示砝码i比砝码j 轻,等号“=”表示砝码i和砝码
j一样重,问号“?”表示二者的关系未知。存在一种情况符合该矩阵。
输出格式:
仅一行,包含三个整数,即c1,c2和c3。
输入输出样例
6 2 5
?+????
-?+???
?-????
????+?
???-?+
????-?
1 4 1
14 8 4
?+???++?????++
-??=?=???????=
??????????=???
?=??+?==??????
???-???-???-??
-=????????????
-??=???=?-+???
???=+?=???????
??????????????
??????+???????
??=???-????-??
????+?????+???
-?????????????
-=????????????
18 12 11
说明
4<=n<=50
给出A 和 B 找出C和 D 求A+B>C+D A+B=C+D A+B<C-D
由 A+B>C+D -> A-C>D-B -> A-C的最小值>D-B的最大值 就能想到了差分约束
于是我们要差分约束把每两个砝码的最大差值和最小差值算出来 之后暴力枚举即可
之后细节见代码
代码
#include<bits/stdc++.h>
using namespace std;
int N,A,B,dx[][],dn[][],ans1,ans2,ans3;
char s[];
int main()
{
scanf("%d%d%d",&N,&A,&B);
for(int i=;i<=N;i++){
scanf("%s",s);
for(int j=;j<strlen(s);j++){ //读字符矩阵建图
if(s[j]=='='||i==j+)dx[i][j+]=, dn[i][j+]= ; //相等 -> 相差0
else if(s[j]=='+') dx[i][j+]=, dn[i][j+]= ; //大于 -> 最多差1,最小差2
else if(s[j]=='-') dx[i][j+]=-,dn[i][j+]=-;
else if(s[j]=='?') dx[i][j+]=, dn[i][j+]=-;
}
}
for(int k=;k<=N;k++) //floyed求一下所有砝码的互相关系
for(int i=;i<=N;i++)
if(i!=k)for(int j=;j<=N;j++)
if(i!=k&&i!=j)
dx[i][j]=min(dx[i][j],dx[i][k]+dx[k][j]),
dn[i][j]=max(dn[i][j],dn[i][k]+dn[k][j]);
for(int i=;i<=N;i++) //然后暴力枚举统计答案
if(i!=A&&i!=B)for(int j=;j<i;j++)
if(j!=A&&j!=B){
if(dn[A][i]>dx[j][B]||dn[B][i]>dx[j][A])ans1++;
if(dn[i][A]>dx[B][j]||dn[i][B]>dx[A][j])ans3++;
if((dn[A][i]==dx[A][i]&&dn[j][B]==dx[j][B]&&dn[A][i]==dn[j][B])||(dn[A][j]==dx[A][j]&&dn[i][B]==dx[i][B]&&dn[A][j]==dn[i][B]))ans2++;
}
printf("%d %d %d",ans1,ans2,ans3);
return ;
}
洛谷2474 [SCOI2008] 天平 差分约束->枚举的更多相关文章
- 洛谷P2474 [SCOI2008]天平
P2474 [SCOI2008]天平 题目背景 2008四川NOI省选 题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A ...
- [SCOI2008]天平 差分约束
---题面--- 题解: 差分约束学得实在是太烂了,,,,QAQ 这里先记下: a - b >= x ---> a >= b + x ----> b - ...
- 题解——洛谷P1250 种树(差分约束)
一道看一眼就知道差分约束的题目 但是最短路spfa的时候注意松弛条件是 if(dis[u]+w[i]<dis[v[i]]) dis[v[i]]=dis[u]+w[i]; 不能写成 if(dis[ ...
- 洛谷P3275 [SCOI2011]糖果(差分约束)
题目描述 幼儿园里有 $N$ 个小朋友,$lxhgww $老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的 ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- BZOJ1079或洛谷2476 [SCOI2008]着色方案
一道记忆化搜索 BZOJ原题链接 洛谷原题链接 发现对于能涂木块数量一样的颜色在本质上是一样的,所以可以直接压在一个状态,而这题的数据很小,直接暴力开\(6\)维. 定义\(f[a][b][c][d] ...
- 洛谷P2405 non天平
题目背景 non最近正在为自己的体重而苦恼,他想称量自己的体重.于是,他找来一个天平与许多砝码. 题目描述 砝码的重量均是n的幂次,n^1.n^2.n^3.n^4.n^5的……non想知道至少要多少个 ...
- bzoj 4650(洛谷 1117) [Noi2016]优秀的拆分——枚举长度的关键点+后缀数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4650 https://www.luogu.org/problemnew/show/P1117 ...
- 洛谷 P2473 [SCOI2008]奖励关 解题报告
P2473 [SCOI2008]奖励关 题目描述 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出\(k\)次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝 ...
随机推荐
- javax.validation注解使用
@Pattern(regexp = "^[0-9]*$",message = "完成比例(进度)必须是数字")
- label标签的可访问性问题
label标签可以优雅地扩大表单控件元素的点击区域.例如,单纯的单选框点击区域就鼻屎那么大的地方,经常会点不到位置.因此,label标签的使用对于提高页面的可用性可访问性是很有帮助的. 其实,它的样子 ...
- PostgreSQL 数据库性能调优的注意点
PostgreSQL提供了一些性能调优的功能.主要有如下几个方面.1.使用EXPLAIN EXPLAIN命令可以查看执行计划,这个方法是我们最主要的调试工具. 2.及时更新执行计划中使用的统计信息 ...
- hiho 1590 - 紧张的会议室。区间问题
题目链接 小Hi的公司最近员工增长迅速,同时大大小小的会议也越来越多:导致公司内的M间会议室非常紧张. 现在小Hi知道公司目前有N个会议,其中第i个会议的时间区间是(Si, Ei). 注意这里时间区间 ...
- SQL SERVER 提取字符串中汉字
IF OBJECT_ID('DBO.GET_ZNSTR') IS NOT NULLDROP FUNCTION DBO.GET_ZNSTRGOCREATE FUNCTION DBO.GET_ZNSTR( ...
- js产生随机数的几个方法
1.Math.random(); 结果为0-1间的一个随机数(包括0,不包括1) 2.Math.floor(num); 参数num为一个数值,函数结果为num的整数部分. 3.Math.round(n ...
- SpringBoot学习笔记(6)----SpringBoot中使用Servlet,Filter,Listener的三种方式
在一般的运用开发中Controller已经大部分都能够实现了,但是也不排除需要自己实现Servlet,Filter,Listener的方式,SpringBoot提供了三种实现方式. 1. 使用Bean ...
- EasyUI Combotree只选择叶子节点
EasyUI Combotree的方法拓展自Combo和Tree.而Tree有一个onBeforSelect事件来帮助我们实现只选择叶子节点的功能. Tree事件需要 'node' 参数,它包括下列属 ...
- HDU-1024 Max Sum Plus Plus 动态规划 滚动数组和转移优化
题目链接:https://cn.vjudge.net/problem/HDU-1024 题意 给n, m和一个序列,找m个不重叠子串,使这几个子串内元素和的和最大. n<=1e6 例:1 3 1 ...
- -bash: nginx: 未找到命令 (command not found) 解决方案
昨天在linux中安装了 nginx ,并按照网上教程 进行启动 如: ps -ef | grep nginx 可以查看到 我就想重新加载一次 如:提示我找不到 nginx 命令 -c参数指定了要加载 ...