Codeforces Round #192 (Div. 2)

A:

题意:

给出一个矩阵表示蛋糕,矩阵中有毒草莓。我们每次可以选择一行或者一列来吃蛋糕,要保证改行该列不含有毒草莓。问我们能吃到的最多的小蛋糕快

思路:

直接枚举每一行,每一列然后吃,模拟就行。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
#include <map>
#include <queue>#define CL(arr, val)    memset(arr, val, sizeof(arr))#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define ll __int64
#define L(x)    (x) << 1
#define R(x)    (x) << 1 | 1
#define MID(l, r)   (l + r) >> 1
#define Min(x, y)   (x) < (y) ? (x) : (y)
#define Max(x, y)   (x) < (y) ? (y) : (x)
#define E(x)        (1 << (x))
#define iabs(x)     (x) < 0 ? -(x) : (x)
#define OUT(x)  printf("%I64d\n", x)
#define lowbit(x)   (x)&(-x)
#define Read()  freopen("din.txt", "r", stdin)
#define Write() freopen("dout.txt", "w", stdout);#define M 1007
#define N 1007
using namespace std;int n,m;
char str[N][N];
bool vt[N][N];int main()
{
//    Read();
cin>>n>>m;CL(vt,false);for (int i = 0; i < n; ++i){scanf("%s",str[i]);}int ans = 0;for (int i = 0; i < n; ++i){int f = 1;int tmp = 0;for (int j = 0; j < m; ++j){if (str[i][j] == 'S') f = 0;else if (!vt[i][j]) tmp++;}if (f == 1){ans += tmp;for (int j = 0; j < m; ++j){vt[i][j] = true;}}}for (int j = 0; j < m; ++j){int f = 1;int tmp = 0;for (int i = 0; i < n; ++i){if (str[i][j] == 'S') f = 0;else if (!vt[i][j]) tmp++;}if (f == 1){ans += tmp;for (int i = 0; i < n; ++i){vt[i][j] = true;}}}cout << ans << endl;return 0;
}
View Code

 

B:

题意:

给你n个点,m条边,m条边表示不能连接在一起的边。让我们建立这样一个图,使得任意一个点都能通过至多两条边就能到达其他的任意点。 题目保证有解,数出这个图的边

思路:

不能再一起的点肯定是通过一个中间点连接的,然后我们把不能在一起的点放进一个set,(因为可能会出现重复的点,题目只是说不会出现重复的边,比赛时理解错了wa了一次)

然后找出一个不存在排他关系的点当做中间点,所有点都连接一条边到他就好了。 

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
#include <map>
#include <queue>#define CL(arr, val)    memset(arr, val, sizeof(arr))#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define ll __int64
#define L(x)    (x) << 1
#define R(x)    (x) << 1 | 1
#define MID(l, r)   (l + r) >> 1
#define Min(x, y)   (x) < (y) ? (x) : (y)
#define Max(x, y)   (x) < (y) ? (y) : (x)
#define E(x)        (1 << (x))
#define iabs(x)     (x) < 0 ? -(x) : (x)
#define OUT(x)  printf("%I64d\n", x)
#define lowbit(x)   (x)&(-x)
#define Read()  freopen("din.txt", "r", stdin)
#define Write() freopen("dout.txt", "w", stdout);#define M 1007
#define N 1007
using namespace std;struct node
{int u,v;
}nd[N];
int len;
bool vt[N];vector<int> vc;
set<int> X;
int n,m;int main()
{
//    Read();cin>>n>>m;CL(vt,false); len = 0;int x,y;X.clear();for (int i = 1; i <= m; ++i){scanf("%d%d",&x,&y);if (!vt[x]) X.insert(x);if (!vt[y]) X.insert(y);vt[x] = true;vt[y] = true;}vc.clear();for (int i = 1; i <= n; ++i){if (!vt[i]) vc.push_back(i);}int ans = 0;ans += (vc.size() - 1 + X.size());cout << ans <<endl;int mid = vc[0];int sz = vc.size();for (int i = 1; i < sz; ++i){printf("%d %d\n",vc[i],mid);}set<int>::iterator it;for (it = X.begin(); it != X.end(); it++){printf("%d %d\n",*it,mid);}return 0;
}
View Code

 

C:

题意:

给你一个矩阵,其中的每个单元都需要净化,我们通过贴符的方式使得其在的行与列的所有的单元都会的到净化,其中“.”表示可以贴符的单元,“E”表示不可以贴符的单元。 求使贴最少的符,使得所有的单元都被得到净化。

思路:

我们分析可得,如果该矩阵的所有单元都得到净化的话。必定是每一行都存在“.” 或者每一列都存在"." 否则是不行的。然后我们只要枚举行,枚举列模拟一下记录“.”的位置就好了。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
#include <map>
#include <queue>#define CL(arr, val)    memset(arr, val, sizeof(arr))#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define ll long long
#define L(x)    (x) << 1
#define R(x)    (x) << 1 | 1
#define MID(l, r)   (l + r) >> 1
#define Min(x, y)   (x) < (y) ? (x) : (y)
#define Max(x, y)   (x) < (y) ? (y) : (x)
#define E(x)        (1 << (x))
#define iabs(x)     (x) < 0 ? -(x) : (x)
#define OUT(x)  printf("%I64d\n", x)
#define lowbit(x)   (x)&(-x)
#define keyTree (chd[chd[root][1]][0])
#define Read()  freopen("din.txt", "r", stdin)
#define Write() freopen("dout.txt", "w", stdout);#define M 100
#define N 307using namespace std;int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};//иообвСсрconst int inf = 0x7f7f7f7f;
const int mod = 1000000007;
const double eps = 1e-8;int rv[N],cv[N];
int n;
char str[N][N];
int a[N];int main()
{scanf("%d",&n);for (int i = 0; i < n; ++i) scanf("%s",str[i]);CL(rv,0);for (int i = 0; i < n; ++i){for (int j = 0; j < n; ++j){if (str[i][j] == '.'){rv[i] = 1;a[i] = j;break;}}}int f = 1;for (int i = 0; i < n; ++i) if (!rv[i]) f = 0;if (f) for (int i = 0; i < n; ++i) cout << i + 1 << " " << a[i] + 1 << endl;else{CL(cv,0); f = 1;for (int j = 0; j < n; ++j){for (int i = 0; i < n; ++i){if (str[i][j] == '.'){cv[j] = 1;a[j] = i;break;}}}for (int j = 0; j < n; ++j) if (!cv[j]) f = 0;if (f) for (int j = 0; j < n; ++j) cout << a[j] + 1 << " " << j + 1 << endl;else printf("-1\n");}return 0;
}
View Code

 

D:

题意:

给你一个矩阵,其中“T”表示树,“S”表示你的起点,“0 - 9”表示拥有该数量的团伙的敌人,“E”表示目的地,你的目标是移动到E,但是在你移动的过程中会有敌人一伙一伙的来找你,与你PK,当你们相遇时你必须PK掉所有的敌人才可以继续往下走。我们不管你走了多少步。我们只需要知道你在到达目的地的过程中最少的PK掉的人数。

思路:

所有的人同时向目标移动,移动的过程谁会碰到我呢,怎么判断呢? 分析可知道,只要某个人到达终点的最短距离小于等于我倒终点的最短距离的,一定会赶上我与我PK,然后我们只要利用spfa求出终点到每个点的最短距离,然后检查到达其他点的最短距离小于我的就加上即可。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
#include <map>
#include <queue>#define CL(arr, val)    memset(arr, val, sizeof(arr))#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define ll long long
#define L(x)    (x) << 1
#define R(x)    (x) << 1 | 1
#define MID(l, r)   (l + r) >> 1
#define Min(x, y)   (x) < (y) ? (x) : (y)
#define Max(x, y)   (x) < (y) ? (y) : (x)
#define E(x)        (1 << (x))
#define iabs(x)     (x) < 0 ? -(x) : (x)
#define OUT(x)  printf("%I64d\n", x)
#define lowbit(x)   (x)&(-x)
#define keyTree (chd[chd[root][1]][0])
#define Read()  freopen("din.txt", "r", stdin)
#define Write() freopen("dout.txt", "w", stdout);#define M 100
#define N 1007using namespace std;int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};//иообвСсрconst int inf = 0x7f7f7f7f;
const int mod = 1000000007;
const double eps = 1e-8;struct node
{int x,y;int stp;node(int tx = 0,int ty = 0,int ts = 0) : x(tx),y(ty),stp(ts) {}
};char str[N][N];
int dis[N][N];
bool vt[N][N];
int n,m;
int len;
int sx,sy;int inmap(int x,int y)
{if (x >= 0 && x < n && y >= 0 && y < m) return true;return false;
}
void spfa()
{queue<node> q;for (int i = 0; i < n; ++i){for (int j = 0; j < m; ++j){if (str[i][j] == 'E'){dis[i][j] = 0;vt[i][j] = true;q.push(node(i,j,0));}else{dis[i][j] = inf;vt[i][j] = false;}}}while (!q.empty()){node u = q.front(); q.pop();for (int i = 0; i < 4; ++i){int tx = u.x + dx[i];int ty = u.y + dy[i];if (!inmap(tx,ty)) continue;if (str[tx][ty] == 'T') continue;if (dis[tx][ty] > u.stp + 1){dis[tx][ty] = u.stp + 1;if (!vt[tx][ty])q.push(node(tx,ty,dis[tx][ty]));}}vt[u.x][u.y] = false;}
}
int main()
{cin>>n>>m;for (int i = 0; i < n; ++i){scanf("%s",str[i]);for (int j = 0; j < m; ++j){if (str[i][j] == 'S'){sx = i; sy = j;}}}spfa();int ans = 0;int tmp = dis[sx][sy];for (int i = 0; i < n; ++i){for (int j = 0; j < m; ++j){
//            printf("%c %d\n",str[i][j],dis[i][j]);if (str[i][j] >= '1' && str[i][j] <= '9' && dis[i][j] <= tmp){ans += str[i][j] - '0';}}}printf("%d\n",ans);return 0;
}
View Code

 

E:

题意:

给你一个n个点,m条边的无向图,然后让你重新构图,使得旧图中的边不会存在于新图。然后旧图与新图都必须满足每个点至多有两条边与其相连,两图的点的个数也必须相同。

思路:

首先不会存在重复的边,然后每个点至多有两条边与其相连。 该图一定是连续的链,或者一个一一排列的环的组和。 我们重新构建之后以肯定也是这样的。 所以我们只要保存起来不能存在于新图的边,然后利用随机函数 random_shuffle()的到1-n的一个排列,然后检查按照该顺序建边是否能够建造出满足条件的图,如果可以直接输出就好了。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
#include <map>
#include <queue>#define CL(arr, val)    memset(arr, val, sizeof(arr))#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define ll long long
#define L(x)    (x) << 1
#define R(x)    (x) << 1 | 1
#define MID(l, r)   (l + r) >> 1
#define Min(x, y)   (x) < (y) ? (x) : (y)
#define Max(x, y)   (x) < (y) ? (y) : (x)
#define E(x)        (1 << (x))
#define iabs(x)     (x) < 0 ? -(x) : (x)
#define OUT(x)  printf("%I64d\n", x)
#define lowbit(x)   (x)&(-x)
#define keyTree (chd[chd[root][1]][0])
#define Read()  freopen("din.txt", "r", stdin)
#define Write() freopen("dout.txt", "w", stdout);#define M 100
#define N 100007using namespace std;int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};//иообвСсрconst int inf = 0x7f7f7f7f;
const int mod = 1000000007;
const double eps = 1e-8;int n,m;
int id[N];set<pair<int,int> > st;bool solve()
{for (int i = 1; i <= n; ++i) id[i] = i;random_shuffle(id + 1,id + 1 + n);id[n + 1] = id[1];int cnt = 0;for (int i = 2; i <= n + 1; ++i){if (st.find(make_pair(id[i - 1],id[i])) == st.end()) cnt++;}if (cnt < m) return false;for (int i = 2; i <= n + 1 && m; ++i){if (st.find(make_pair(id[i - 1],id[i])) == st.end()){printf("%d %d\n",id[i - 1],id[i]);m--;}}return true;
}
int main()
{scanf("%d%d",&n,&m);int x,y;st.clear();for (int i = 0; i < m; ++i){scanf("%d%d",&x,&y);st.insert(make_pair(x,y));st.insert(make_pair(y,x));}for (int i = 0; i < 100; ++i){if (solve()) return 0;}printf("-1\n");return 0;
}
View Code

 

还有一种做法就是dfs我们按照点从小到大的顺序枚举,然后不断的往后检查符合条件的点,直到我们找到符合条件的边,这个过程中记录我们枚举到的边,然后利用set处理枚举可能会出现重复遍点的问题。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <algorithm>
#include <string>
#include <set>
#include <functional>
#include <numeric>
#include <sstream>
#include <stack>
#include <map>
#include <queue>#define CL(arr, val)    memset(arr, val, sizeof(arr))#define lc l,m,rt<<1
#define rc m + 1,r,rt<<1|1
#define pi acos(-1.0)
#define ll long long
#define L(x)    (x) << 1
#define R(x)    (x) << 1 | 1
#define MID(l, r)   (l + r) >> 1
#define Min(x, y)   (x) < (y) ? (x) : (y)
#define Max(x, y)   (x) < (y) ? (y) : (x)
#define E(x)        (1 << (x))
#define iabs(x)     (x) < 0 ? -(x) : (x)
#define OUT(x)  printf("%I64d\n", x)
#define lowbit(x)   (x)&(-x)
#define keyTree (chd[chd[root][1]][0])
#define Read()  freopen("din.txt", "r", stdin)
#define Write() freopen("dout.txt", "w", stdout);#define M 100
#define N 100007using namespace std;int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};//懈芯芯斜胁小褋褉const int inf = 0x7f7f7f7f;
const int mod = 1000000007;
const double eps = 1e-8;int n,m;
set<int> v;
vector< pair<int,int> > ans;
vector<int> vc[N];
bool isok(int u,int v)
{for (size_t i = 0; i < vc[u].size(); ++i){if (vc[u][i] == v) return false;}return true;
}
bool dfs(int u)
{if ((int)ans.size() == min(n - 1,m)) return true;v.erase(u);for (set<int>::iterator it = v.begin(); it != v.end(); ++it){if (!isok(u,*it)) continue;ans.push_back(make_pair(u,*it));if (dfs(*it)) return true;else{ans.pop_back();it = v.find(*it);//注意这里一定要重新定位it的值,//虽然后边的点都插进来了,而且是按顺序,但是it++的地址已经变了//如果不重新定位的话访问的将不是我们想要的值
        }}v.insert(u);return false;
}
int main()
{scanf("%d%d",&n,&m);for (int i = 0; i <= n; ++i) vc[i].clear();int x,y;for (int i = 0; i < m; ++i){scanf("%d%d",&x,&y);vc[x].push_back(y);vc[y].push_back(x);}for (int i = 1; i <= n; ++i) v.insert(i);ans.clear();for (int i = 1; i <= n; ++i){if (dfs(i)){if (m == n) ans.push_back(make_pair(ans[0].first,ans.back().second));for (int i = 0; i < m; ++i) printf("%d %d\n",ans[i].first,ans[i].second);return 0;}}printf("-1\n");return 0;
}
View Code

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/293165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql limit不接具体数字_这21个写SQL的好习惯,你要养成呀

前言每一个好习惯都是一笔财富&#xff0c;本文分SQL后悔药&#xff0c; SQL性能优化&#xff0c;SQL规范优雅三个方向&#xff0c;分享写SQL的21个好习惯&#xff0c;谢谢阅读&#xff0c;加油哈~公众号&#xff1a;「捡田螺的小男孩」1. 写完SQL先explain查看执行计划&#x…

巅峰对决!Spring Boot VS .NET 6

Spring Boot 和 ASP.NET Core 都是企业中流行的 Web 框架, 对于喜欢 C# 的人会使用 ASP.NET Core, 而对于 Java 或 Kotlin 等基于 JVM 的语言&#xff0c;Spring Boot 是最受欢迎的。这本文中&#xff0c;会对比这两个框架在以下方面有何不同&#xff1a;•控制器•模型绑定和验…

java 生成无重复 随机数

2019独角兽企业重金招聘Python工程师标准>>> 一、实现逻辑 1.需要一个固定的数据集。 2.从数据集中随机去除当前索引的数据&#xff0c;并移除生成。并重复生成多个。 二、编码 import java.util.ArrayList; import java.util.Calendar; import java.util.List; imp…

最诡异航空事件,幽灵航班包括驾驶人员,所有人都在高空中昏睡!而后整机坠毁!...

全世界只有3.14 % 的人关注了爆炸吧知识2005年8月14日&#xff0c;一架塞浦路斯的太阳神航空&#xff08;Helios Airways&#xff09;波音737-300客机&#xff0c;班次ZU-522&#xff08;HCY 522&#xff09;&#xff0c;机身编号5B-DBY&#xff0c;机上载有59名成年人及8名儿童…

[激励机制]浅谈内部竞争——如何让你的员工玩命干活?

我是标题党&#xff0c;标题是故意气你的&#xff0c;千万表拍我。公元2012年12月12号&#xff0c;Clark 拿出所有积蓄创办了一个公司&#xff0c;招了看上去还不错的5个员工组成了一个小型团队。紧接着&#xff0c;摆在他面前的一个很明显的问题就是——如何让他们玩命干活&am…

mybatis 查询的时间不对_程序员,Mybatis 你踩过坑吗?

点击上方“Java基基”&#xff0c;选择“设为星标”做积极的人&#xff0c;而不是积极废人&#xff01;源码精品专栏 中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业…

李洪强iOS开发之- 实现简单的弹窗

李洪强iOS开发之- 实现简单的弹窗 实现的效果: 112222222222223333333333333333

.NET 编码的基础知识

点击上方蓝字关注我们.NET 编码的一些基本概念和分析简单的类型概念Hex &#xff08;16进制&#xff09;byte 字节 范围是&#xff1a;0~255&#xff0c;二进制下的范围就是00000000~11111111&#xff0c;相当于1字节。byte[] 字节数组bit 比特&#xff0c;只有2种状态&#xf…

什么是MVC?MVC框架的优势和特点

目录 一、什么是MVC 二、MVC模式的组成部分和工作原理 1、模型&#xff08;Model&#xff09; 2、视图&#xff08;View&#xff09; 3、控制器&#xff08;Controller&#xff09; 三、MVC模式的工作过程如下&#xff1a; 用户发送请求&#xff0c;请求由控制器处理。 …

docker没有下载完全_会用Docker的人都别装了,这多简单呐

学术又官方的说法Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器或Windows 机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。没用过的人能看懂这段话&#xf…

WPF MVVM实例三

在没给大家讲解wpf mwm示例之前先给大家简单说下MVVM理论知识&#xff1a;WPF技术的主要特点是数据驱动UI,所以在使用WPF技术开发的过程中是以数据为核心的&#xff0c;WPF提供了数据绑定机制&#xff0c;当数据发生变化时&#xff0c;WPF会自动发出通知去更新UI。我们使用模式…

stringcstdlibctimecstdargctimectypecmathclimits

转载地址&#xff1a;http://blog.csdn.net/kz_ang/article/details/7767335 <string>头文件 string构造函数 string s  生成一个空字符串s string s(str)  拷贝构造函数,生成str对象的复制品 string s(str,stridx)  将字符串str对象内"始于位置stridx"…

C3P0 释放连接 的问题

2019独角兽企业重金招聘Python工程师标准>>> 记录一下使用C3P0 时犯的低级错误&#xff0c;没有关闭connection 达到连接池最大限制后造成程序假死的现象&#xff0c;以后得仔细再仔细了&#xff01; 转载于:https://my.oschina.net/fusxian/blog/146700

python随机抽取人名_python的random

python的random函数更多的random用法可参阅&#xff1a;random --- 生成伪随机数 - Python 3.7.4 文档​docs.python.org以下使用了&#xff1a;洗牌&#xff1a;random.shuffle随机抽取元素&#xff0c;且元素不重复&#xff1a;random.sample随机抽取元素&#xff0c;且元素可…

Windows 11/10 正式版全新 ISO 镜像下载

微软现已发布 Windows 11/10 正式版&#xff08;版本 21H2&#xff09;全新 ISO 镜像。Windows 11 版本 21H2 全新镜像集成了 2021 年 10 月更新、11 月更新和 12 月更新。Windows 10 版本 21H2 全新镜像集成了 2021 年 11 月更新和 12 月更新。版本区别Windows 11/10 消费者版…

java web filter 之一 基础实现

本文主要对filter的基本使用进行了讲解&#xff0c;其中涉及到了 filter是什么 一个filter处理一个jsp 多个filter处理一个jsp filter是什么 Filter 是java下的一种过滤器 &#xff0c;能实现对java web程序 客户端和服务器端消息的过滤&#xff0c;也就是在服务器段接受reques…