题目链接:https://www.luogu.org/problemnew/show/P4578

题目描述

据古代传说记载,所罗门王既是智慧的代表,又是财富的象征。他建立了强大而富有的国家,聚集了大批的黄金象牙和钻石,并把这些价值连城的珍宝藏在一个神秘的地方,这就是世人瞩目的“所罗门王的宝藏”。多少个世纪以来,人们一直在寻找这批早已失落的古代文明宝藏,寻找盛产黄金和钻石的宝地。曾经追寻所罗门王宝藏的冒险者们都一去不回,至今没人解开这个谜题。亨利男爵在一次幸运的旅途中意外地得到了三百年前一位葡萄牙贵族留下的写在羊皮卷上的所罗门王的藏宝图和一本寻宝秘籍。在这张藏宝图的诱惑下,亨利男爵邀请约翰上校和勇敢的猎象人夸特曼开始了寻找埋葬在黑暗地底的所罗门王宝藏的艰险历程。他们横穿渺无边际的沙漠和浓荫蔽日的原始森林,越过汹涌澎湃的激流险滩,翻越高耸入云的峻岭雪山,饱尝沙漠的酷热和冰雪严寒,在藏宝图的指引下来到非洲一个原始的神秘国度库库安纳。这里有残酷的人殉制度,有一个拥有一千个妻室的独眼暴君特瓦拉,有像兀鹫一般丑恶诡诈老而不死的女巫加古尔,还有美丽聪慧的绝代佳人弗拉塔。在这片陌生而又险象环生的土地上三位寻宝英雄历尽艰辛,终于在绝代佳人弗拉塔的帮助下在海底深处找到了珍藏这批价值连城宝藏的巨大的藏宝洞。然而在女巫加古尔的精心策划下,一场灭顶之灾正在悄悄逼近。

藏宝洞的洞门十分坚固且洞门紧闭,如果不知道开启洞门的秘密是无法打开藏宝洞的洞门。在藏宝洞的洞门一侧有一个奇怪的矩形密码阵列。根据寻宝秘籍的记载,在密码阵列每行的左侧和每列的顶端都有一颗红宝石按钮。每个按钮都可以向左或向右转动。每向左转动一次按钮,相应的行或列中数字都增 11 。每向右转动一次按钮,相应的行或列中数字都减 11 。在矩形密码阵列的若干特定位置镶嵌着绿宝石。只有当所有绿宝石位置的数字与藏宝图记载的密码完全相同,紧闭的洞门就会自动缓缓打开。女巫加古尔早已得知开门的秘密。为了阻止寻宝者打开洞门,女巫加古尔为开门的密码阵列设置了全 00 的初始状态。试图打开洞门的寻宝者如果不能迅速转动按钮使所有绿宝石位置的数字与藏宝图记载的密码完全相同,就会自动启动藏宝洞玄妙的暗器机关,使寻宝者遭到灭顶攻击而死于非命。

您能帮助三位寻宝英雄顺利打开藏宝洞的洞门吗?

编程任务:对于给定的密码阵列,找到获得正确密码的红宝石按钮的转动序列。

输入输出格式

输入格式:

输入的第一行中有一个正整数 T (T \le 5)T(T≤5) 表示有 TT 组数据。每组数据的第一行有 33 个正整数 n,mn,m 和 kk ,表示洞门密码阵列共有 nn 行和 mm 列, 0<n,m,k \le 10000<n,m,k≤1000 。各行从上到下依次编号为 1,2,\ldots,n1,2,…,n ;各列从左到右依次编号为 1,2,\ldots,m1,2,…,m 。接下来的 kk 行中每行有三个整数 x,y,cx,y,c ,分别表示第 kk 个绿宝石在密码阵列中的位置和密码, xx 为行号 yy 为列号, cc 为该位置处的密码。

输出格式:

对于每组数据,用一行输出 Yes 或者 No。输出 Yes 表示存在获得正确密码的红宝石按钮的转动序列。输出 No则表示无法找到获得正确密码的红宝石按钮的转动序列。

输入输出样例

输入样例#1: 复制

22 2 4
1 1 0
1 2 0
2 1 2
2 2 2
2 2 4
1 1 0
1 2 0
2 1 2
2 2 1

输出样例#1: 复制

Yes
No

说明

对于100%的数据,1≤n,m,k≤1000,k≤n×m,∣c∣≤1,000,000。

题意:给你一个n*m的图,刚开始全部都是0,然后问你如何操作能够满足k个位置都是它要求的数字,每次操作通过一行或者一列+1,如果最后可以变成要求的图 就输出yes否则no

① 图论法

感想:能把这样的题跟图论结合我也是服气,厉害呀~

思路:将x与(y+n) 构成双向边,如果是(x,y)的话分开记录也是可以的,但是麻烦的多。不如这样简便。

对于某个点来说他受到了来自X轴和Y轴上其他点的影响,所以对于X轴和Y轴他们的所有操作可以使得sum[x] 和 sumn[y] 都是一个值,而不是不同的值,这样的就可以,但是如果是不同的值说明对于某个点肯定是不符合题意的。

大概这样的六个点,从1开始出发,(1,2)需要+1,(1,3)需要+3,然而对于以2为开始的点,他需要翻转的次数等于边的权值减去当前已经加的数表示还需要加的数,就这样一直到最后某个点,如果是单源路肯定没问题,如果是多源路可能会碰到那种对于同一个节点需要不同的次数,这样的肯定GG 组不出来符合题意的情况,所以需要对于1-n+m每个点为开始点来判断是否满足题意。Fu~ck好题。

#include<bits/stdc++.h>
using namespace std;
struct node{int u;int v;int valu;int next;
}no[4005];
int cnt;
int head[2005];
int vis[2005];
int sum[2005];
void add(int u,int v,int valu)
{no[cnt].u=u;no[cnt].v=v;no[cnt].valu=valu;no[cnt].next=head[u];head[u]=cnt++;
}
int bfs(int u)
{queue<int>q;q.push(u);vis[u]=1;while(!q.empty()){int temp=q.front();q.pop();for(int i=head[temp];i!=-1;i=no[i].next){int tt=no[i].v;int Valu=no[i].valu;if(vis[tt]){if(sum[temp]+sum[tt]!=Valu)return 0;}else{sum[tt]=Valu-sum[temp];vis[tt]=1;q.push(tt);}}} return 1;
}
int main()
{int t;scanf("%d",&t);while(t--){cnt=1;memset(head,-1,sizeof(head));memset(vis,0,sizeof(vis)); memset(sum,0,sizeof(sum));int n,m,k;scanf("%d%d%d",&n,&m,&k);   while(k--){int x,y,w;scanf("%d%d%d",&x,&y,&w);add(x,y+n,w);add(y+n,x,w);}int flag=1;for(int i=2;i<=n+m;i++)if(vis[i]==0)flag=flag&bfs(i);if(flag)printf("Yes\n");elseprintf("No\n"); }return 0;
} 

②另外一种K^2的做法

K^2的做法是枚举任何2个点判断之间的关系

比如第 i 行相等,那么对于其他行的同样2列的差值应该是对应的,因为对于一行来说2个数是同时在变化的,他们之间2个数的差值取决于2列,如果2列之间的差值不相等的话,肯定会有2列不符合题意。

#include<bits/stdc++.h>
using namespace std;int a[1005];
int b[1005];
int c[1005];
int n,m,k;
int vis1[1005][1005];
int vis2[1005][1005];
int cha1[1005][1005];
int cha2[1005][1005];
int check(int i,int j,int flag)
{if(flag==0){if(b[i] > b[j])swap(i,j);return c[i]-c[j];//小的在前边 统一  }else{if(a[i] > a[j])swap(i,j);return c[i]-c[j];}
}
int solve()
{memset(vis1,0,sizeof(vis1));memset(vis2,0,sizeof(vis2));memset(cha1,0,sizeof(cha1));memset(cha2,0,sizeof(cha2));for(int i=0;i<k;i++){for(int j=i+1;j<k;j++){if(a[i]==a[j] && b[i] == b[j] && c[i] != c[j])return 0; if(a[i]==a[j]){if(vis1[b[i]][b[j]] && cha1[b[i]][b[j]] != check(i,j,0))return 0;vis1[b[i]][b[j]]=1;vis1[b[j]][b[i]]=1;cha1[b[i]][b[j]]=check(i,j,0);cha1[b[j]][b[i]]=check(i,j,0);}else if(b[i]==b[j]){if(vis2[a[i]][a[j]] && cha2[a[i]][a[j]] != check(i,j,1))return 0;vis2[a[i]][a[j]]=1;vis2[a[j]][a[i]]=1;cha2[a[i]][a[j]]=check(i,j,1);cha2[a[j]][a[i]]=check(i,j,1);}}}return 1;
}
int main()
{int t;scanf("%d",&t);while(t--){scanf("%d%d%d",&n,&m,&k);for(int i=0;i<k;i++)scanf("%d%d%d",&a[i],&b[i],&c[i]);if(solve())printf("Yes\n");elseprintf("No\n");  }   return 0;
}

洛谷 P4578 [FJOI2018] Upc6605 福建OI2018 所罗门王的宝藏相关推荐

  1. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  2. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

  3. 洛谷 P1387 最大正方形

    P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...

  4. 洛谷P2763 试题库问题

    题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...

  5. 动态规划——洛谷_P1057传球游戏

    题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...

  6. 洛谷P1417 烹调方案

    洛谷P1417 烹调方案 如果是一般的01背包的话 选的先后是没关系的 但是这题选的先后是有关系的,因为他的价值是随着时间而变化的, 而你的01背包是做不到先选2再选1的 那么我们就跟国王游戏一样 用 ...

  7. 记忆优化搜索(简单题)(洛谷P3183 [HAOI2016]食物链 )( P5635 【CSGRound1】天下第一 )

    昨天做了蓝桥杯的时候,发现自己对于记忆优化搜索甚是不熟悉,所以今天随便找了几个基础题做做,顺便写下两片题解,顺便用了一下devc++敲的代码,发现没有代码补全真的可以说是灰常难受了... 洛谷P318 ...

  8. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

  9. 洛谷专题训练 ——【算法1-1】模拟与高精度

    洛谷题单[算法1-1]模拟与高精度 ACM-ICPC在线模板 题单链接: [算法1-1]模拟与高精度 下面的这一坨都是洛谷题单上的东东 题单简介 恭喜大家完成了第一部分语言入门,相信大家已经可以使用 ...

  10. 洛谷P1006 传纸条 (棋盘dp)

    好气,在洛谷上交就过了,在caioj上交就只有40分 之前在51nod做过这道题了. https://blog.csdn.net/qq_34416123/article/details/8180902 ...

最新文章

  1. 这个需求很简单,明天上线没问题吧?要不要怼回去?
  2. windows常用命令netstat
  3. java实现自动任务_Java实现定时任务的三种方法
  4. shell 自动输入密码
  5. Java笔记07-List、Set、数据结构、Collections
  6. C语言格式控制符/占位符 - C语言零基础入门教程
  7. C# if---else---练习题整理
  8. 用matlab拟合多元函,MatLab中多元拟合的函数是什么?
  9. php 未实例化类调用方法的问题
  10. java 如何去掉http debug日志_谈谈日志的最佳实践
  11. php cms 那个安全,PHPCMS系统安全设置步骤
  12. JAVA代码实现MD5加密算法
  13. 2021年全球人工智能行业调研及趋势分析报告
  14. 需求分析(知识点总结)
  15. Cint() , int(),round() , fix() 的区别与联系
  16. winpe修复改linux工具,利用WinPE修改原系统注册表来修复系统
  17. pythonrequests请求https错误_如何解决python之requests安全证书(HTTPS请求)问题?
  18. Oracle Temp临时表空间及其故障处理
  19. SystemInfo 类
  20. 利用百度APIStoreSDK获取Json数据并解析加载到ListView上

热门文章

  1. 软件测试工程师需要掌握哪些技能呢?
  2. 聊一聊如何准备计算机Python二级考试
  3. 普通上班族如何快速买房买车,一个程序员摸索的实操经验分享
  4. Ubuntu20.04安装五笔、拼音混合输入法
  5. K8S故障排查指南- but volume paths are still present on disk
  6. 另一个伊甸国际服节奏榜(以下全为个人观点,仅供参考
  7. python绘制彩色地震剖面断层解释_地震剖面上断层的识别标志主要有哪些
  8. Syntax error: ( unexpected (expecting fi) ubuntu上sh脚本报错解决办法
  9. 《明朝那些事儿》读后感
  10. windows x64和x86的区别