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,一经查实,立即删除!

相关文章

*[hackerrank]Girlfriend Necklace

https://www.hackerrank.com/contests/w8/challenges/gneck 有点意思。是DP&#xff0c;最优解包含最优子问题。F(X)F(X-1)F(X-3)。因为F(X-1)右边放个“R”和F(X-3)右边放"RRB"是左右可以互推的&#xff0c;包含全了最右是R和B的两种情况。 #include <iostream&g…

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名儿童…

c#代码实现GPS数据的有效性校验

用于校验GPS报文指令的有效性 很简单的代码&#xff0c;留存吧 public static bool Verify(string gpsInfo) { if (gpsInfo null || "".Equals(gpsInfo)) return false; char p gpsInfo[0]; char c (cha…

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

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

Android之TrafficStats实现流量实时监测

---恢复内容开始---TrafficStats类是由Android提供的一个从你的手机开机开始&#xff0c;累计到现在使用的流量总量&#xff0c;或者统计某个或多个进程或应用所使用的流量&#xff0c;当然这个流量包括的Wifi和移动数据网Gprs。这里只针对手机所使用的流量作介绍&#xff0c;至…

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

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

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

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

数据挖掘模型生命周期管理

为成功地利用预测模型&#xff0c;您需要从开发阶段直至生产环境对模型进行全面管理。模型生命周期管理是由以下阶段组成的高效交替过程&#xff1a; • 确定业务目标 • 访问和管理数据 • 开发模型 • 验证模型 • 部署模型 • 监控模型 确定业务目标 第一步确定所需模型以及…

.NET 编码的基础知识

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

Android之android.os.NetworkOnMainThreadException异常

今天用handler.post(Runnable);的时候出现了android.os.NetworkOnMainThreadException Runnable里面使用的访问网络请求&#xff0c;网络请求是不可以放在主线程里面的&#xff0c;所以出现了这个问题 因为我想执行 handler.post(runnable); Runnable runnable new Runnable(…

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

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

每日英语:The First Day On A Job Is Tough Work

Why is the first day on the job often the worst?New employees tend to be greeted with stacks of benefits paperwork, technology hassles and dull presentations about company culture. hassle&#xff1a;激战&#xff0c;争辩&#xff0c;麻烦事    But some c…

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

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

数据挖掘领域十大经典算法初探

一、C4.5 C4.5&#xff0c;是机器学习算法中的一个分类决策树算法&#xff0c; 它是决策树(决策树也就是做决策的节点间的组织方式像一棵树&#xff0c;其实是一个倒树)核心算法 ID3的改进算法&#xff0c;所以基本上了解了一半决策树构造方法就能构造它。 决策树构造方法其实就…

WPF MVVM实例三

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