CF-192-diy-2
题目链接:
http://codeforces.com/contest/330
题目意思:
给一个r*c的矩阵方格,有些位置有S,如果某一行和一列都不含标记为S的方格,则可以把该行所有方格都收掉,问最多能收多少个方格,方格可以收多次,多次收的方格计数一次。
解题思路:
暴力
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
using namespace std; /*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/ char save[15][15];
bool flag[15][15];
struct Point
{
int x,y;
}pp[120]; int main()
{
int r,c; while(scanf("%d%d",&r,&c)!=EOF)
{
int cnt=0;
memset(flag,false,sizeof(flag));
for(int i=1;i<=r;i++)
{
scanf("%s",save[i]+1);
for(int j=1;j<=c;j++)
{
if(save[i][j]=='S')
{
pp[++cnt].x=i;
pp[cnt].y=j;
}
}
}
for(int i=1;i<=r;i++) //扫描每一行
{
bool ff=true;
for(int j=1;j<=c;j++) //如果都没有S,则标记这一行
if(save[i][j]=='S')
{
ff=false;
break;
}
if(ff)
memset(flag[i],true,sizeof(flag[i]));//表示能收
}
for(int i=1;i<=c;i++) //扫描每一列
{
bool ff=true;
for(int j=1;j<=r;j++)
if(save[j][i]=='S')
{
ff=false;
break;
}
if(ff)
for(int j=1;j<=r;j++) //标记这一列
flag[j][i]=true;
} int ans=0;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
if(flag[i][j]) //统计计数
ans++;
printf("%d\n",ans);
}
return 0;
}
B. Road Construction
题目意思:
给一些不能连接的边,让你构造一幅图,使任意两点能互相到达,且经过的边数不超过2。
解题思路:
任意两个点之间的边数不超过2,说明该图一定是星图。找到中心的那个点(没有限制的边连接这点),直接连线即可。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
using namespace std; /*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/
int num[1100]; int main()
{
int n,m; while(scanf("%d%d",&n,&m)!=EOF)
{
int a,b; memset(num,0,sizeof(num));
for(int i=1;i<=m;i++) //num[i]表示i点的度数
{
scanf("%d%d",&a,&b);
num[a]++,num[b]++;
}
int M=0;
num[0]=INF;
for(int i=1;i<=n;i++)
if(num[i]<num[M]) //找到度数为零的点
M=i;
printf("%d\n",n-1);
for(int i=1;i<=n;i++)
{
if(i==M)
continue;
printf("%d %d\n",i,M); //连接即可
}
}
return 0;
}
题目意思:
给n*n的矩阵,让你放最少数量的清洗剂,使得所有的点都能清洗到,清洗剂所放位置的那一行和那一列的所有点都能清洗,其中E点不能放清洗剂。
解题思路:
如果能放,一定为n个,因为每一行或每一列都要扫描到。
如果每一行都有可放的位置,则输出每一行的任意一个能放的点即可,这样每一行的点都会清洗到。
如果每一列都有可放的位置,则输出每一列的任意一个能放得点即可,这样每一列的都会清洗到,也就达到了要求。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
using namespace std; /*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/ bool rr[120],cc[120];
char save[120][120];
vector<int>row[120];
vector<int>col[120]; int main()
{
int n; while(scanf("%d",&n)!=EOF)
{
memset(rr,false,sizeof(rr));
memset(cc,false,sizeof(cc));
for(int i=1;i<=n;i++)
{
row[i].clear();
col[i].clear();
}
for(int i=1;i<=n;i++)
{
scanf("%s",save[i]+1);
for(int j=1;j<=n;j++)
{
if(save[i][j]=='.')
{
rr[i]=true,cc[j]=true; //当前行和列能扫描到
row[i].push_back(j);
col[j].push_back(i);
}
}
}
bool r=true,c=true; //是否所有的行或列能扫描到 for(int i=1;i<=n;i++)
if(!rr[i])
{
r=false;
break;
}
for(int i=1;i<=n;i++)
if(!cc[i])
{
c=false;
break;
}
if(!r&&!c) //行或列都扫描不到
{
printf("-1\n");
continue;
}
if(r) //如果行都能扫描到,直接输出每一行的第一个可以放的位置
{
for(int i=1;i<=n;i++)
printf("%d %d\n",i,row[i][0]);
continue;
}
if(c) //对于列 同理
{
for(int i=1;i<=n;i++)
printf("%d %d\n",col[i][0],i);
continue;
} } return 0;
}
题目意思:
给一个n*m的矩阵,一个起始点和终点,矩阵中的数字表示该位置的魔鬼数量,当从起点到终点选择一条路径时,如果魔鬼能够在人之前或同时到达该路径某一位置,则人和魔鬼要打仗,选择一条路径,使得人与魔鬼打仗的个数最少。
解题思路:
该题主要是思维转换。bfs+贪心
假设人当前选择了一条路径C->D,终点为D,某处魔鬼B 能够和人C打仗,假设魔鬼在A位置与人打仗,则dis(B,A)<=dis(C,A) =>dis(B,A,D)<=dis(C,D) 如果选择D终点,只需使得Min(dis(B,D))<=dis(C,D) 而dis(B,A,D)>=Min(dis(B,D)) 所以对于某一特定路径,选择终点D打仗比其他任何一点都好。
如果选择从C-D的最短路,则能够打仗的魔鬼数量就最少。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
using namespace std; /*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/ int dp[1100][1100],n,m;
char save[1100][1100];
bool vis[1100][1100];
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; struct PP
{
int x,y;
};
PP s,e; void bfs() //找到终点到任何一点的最短距离
{
queue<PP>myq;
myq.push(e); while(!myq.empty())
{
PP f=myq.front();
myq.pop(); for(int i=0;i<4;i++)
{
int xx=f.x+dir[i][0],yy=f.y+dir[i][1]; if((save[xx][yy]=='S'||(save[xx][yy]>='0'&&save[xx][yy]<='9'))&&!vis[xx][yy])
{
//printf(":%d %d\n",xx,yy);
vis[xx][yy]=true;
dp[xx][yy]=dp[f.x][f.y]+1;
myq.push((PP){xx,yy});
} //不在方格里的点为空的,不会扫描的
}
}
return ;
} int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(vis,false,sizeof(vis));
for(int i=1;i<=n;i++)
{
scanf("%s",save[i]+1);
for(int j=1;j<=m;j++)
{
if(save[i][j]=='S')
s.x=i,s.y=j;
if(save[i][j]=='E')
e.x=i,e.y=j,dp[i][j]=0,vis[i][j]=true;
}
}
// printf("%d %d\n",e.x,e.y);
bfs();
int ans=0;
// printf("%d\n",dp[s.x][s.y]);
for(int i=1;i<=n;i++) //最短距离小的话,就直接加上
for(int j=1;j<=m;j++)
if(save[i][j]>'0'&&save[i][j]<='9'&&vis[i][j]&&dp[i][j]<=dp[s.x][s.y])
ans+=save[i][j]-'0';
printf("%d\n",ans); } return 0;
}
题目意思:
给一幅图,图中任意结点的度数至多为2。
让你重构一幅图,要求:图中节点和原来一样,边数数量也一样,任意节点度数至多为2.
解题思路:
题中所说的图的边数最多为n.
1、随机算法。
随机m个点,连成m条边,判断每一条边是否在给定的图里面,在的话,在随机,都不在,则满足题目要求,直接输出就行了。
2、构造法。
当n<=7,直接暴力判断
当n>7,一定存在一种构造满足题意。
构造方法:
因为每个点的度数最多为2,所以每一个联通块要么是一条线,要么是一个环,首先根据联通块将节点分成若干部分。
然后将每一部分的节点的奇数位置节点提前。(保证相同部分的相邻节点之间的连线不冲突)
然后选择一个节点数量最多的那个部分,如果其节点数为偶数的话,交换头两个节点(防止环的情况尾和首相连有冲突),最后将其余各部分的节点从前之后依次插入。
最后按照给定的边数,从前之后输出相邻的两个节点构成一条边,如果需要把最后一个节点和第一个节点连起来。
代码:
#include<iostream>
#include<cmath>
#include<time.h>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#define eps 1e-6
#define INF 0x1f1f1f1f
#define PI acos(-1.0)
#define ll __int64
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
using namespace std; /*
freopen("data.in","r",stdin);
freopen("data.out","w",stdout);
*/
vector<int>myv;
vector<int>vv[110000];
int n,m; int main()
{
srand((unsigned)(time(NULL)));
while(scanf("%d%d",&n,&m)!=EOF)
{
int a,b;
myv.clear(); for(int i=1;i<=n;i++)
{
vv[i].clear();
myv.push_back(i);
} for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
vv[a].push_back(b);
vv[b].push_back(a);
} bool tt=false;
for(int i=1;i<=500;i++) //随机次数
{
random_shuffle(myv.begin(),myv.end()); //随机节点
bool flag=true; for(int j=0;j<m&&flag;j++) //看是否满足
{
int a=myv[j];
int b=myv[(j+1)%n]; for(int k=0;k<vv[a].size();k++)
if(b==vv[a][k])
flag=false;
}
if(flag) //满足的话,直接输出
{
for(int j=0;j<m;j++)
printf("%d %d\n",myv[j],myv[(j+1)%n]);
tt=true;
break;
} }
if(!tt)
printf("-1\n");
} return 0;
}
CF-192-diy-2的更多相关文章
- CF 192 Div2
A.Cakeminator 暴搞之,从没有草莓覆盖的行.列遍历 char map[30][30]; int vis[30][30]; int hang[30],lie[30]; int main() ...
- CF 192 DIV.2
总结一下这场比赛,就是我太SB了.说多了都是泪. A,大水题. B,根据题意,可以肯定有一个城市是可以与所有城市相连的,直接找到该点然后输出该点与其他所有点相连即可. int x[111111] , ...
- Codeforces Round #192 (Div. 2) (330B) B.Road Construction
题意: 要在N个城市之间修建道路,使得任意两个城市都可以到达,而且不超过两条路,还有,有些城市之间是不能修建道路的. 思路: 要将N个城市全部相连,刚开始以为是最小生成树的问题,其实就是一道简单的题目 ...
- Codeforces Round #192 (Div. 2) (330A) A. Cakeminator
题意: 如果某一行没有草莓,就可以吃掉这一行,某一列没有也可以吃点这一列,求最多会被吃掉多少块蛋糕. //cf 192 div2 #include <stdio.h> #include & ...
- DNSmasq – 配置DNS和DHCP
DNSmasq是一个小巧且方便地用于配置DNS和DHCP的工具,适用于小型网络.它提供了DNS功能和可选择的DHCP功能可以取代dhcpd(DHCPD服务配置)和bind等服务,配置起来更简单,更适用 ...
- zookeeper(2)-curator
一.Curator介绍 zookeeper的提交人也说过,curator对于zookeeper而言就像是guava对于java差不多,更加优雅高效. 而且之前的zookeeper原生API,往往因为2 ...
- linux之sort和uniq
uniq uniq命令: uniq不加参数,只对相邻的相同行内容去重. 例子如下: [root@localhost ~]# pwd /root [root@localhost ~]# cat oldb ...
- Oracle Study之-AIX6.1构建Oracle 10gR2 RAC(3)
Oracle Study之-AIX6.1构建Oracle 10gR2 RAC(3) 一.配置共享存储 [oracle@aix203 ~]$lsdev -c disk hdisk0 Available ...
- FAILED java.lang.IllegalArgumentException: java.net.URISyntaxException: Relative path in absolute URI:hdfs:192.*
运行的参数配置 hdfs:192.168.58.180/cf/userItem.txt 应该写成 hdfs://192.*
- SLAM+语音机器人DIY系列:(三)感知与大脑——5.机器人大脑嵌入式主板性能对比
摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...
随机推荐
- html回车事件
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- gmpy2安装使用方法
GMP(GNU Multiple Precision Arithmetic Library,即GNU高精度算术运算库),它是一个开源的高精度运算库,其中不但有普通的整数.实数.浮点数的高精度运算,还有 ...
- Android 4.0 ProGuard 代码混淆 以及 proguard returned with error code 1.See console异常的解决方法
最近呢说要上线,就去找了下上线的方法...之前做过代码混淆,用的是progarud.cfg,但是呢自己反编译了之后还是无效,然后就丢着先不管了,因为实在不知道什么情况.今天来上线的时候结果总是报错,总 ...
- Java 初学者帮助文档以及基础教程
一下午的时间,大致看了一下Java的文档,进一步熟悉了Java的大体框架和结构,整理了一下有用的资源. 帮助文档: JSE 8 API 英文版 在线HTML格式:http://docs.oracle. ...
- [C/C++标准库]_[0基础]_[优先队列priority_queue的使用]
std::priority_queue 场景: 1. 对于一个任务队列,任务的优先级由任务的priority属性指明,这时候就须要优先级越高的先运行.而queue并没有排序功能,这时priority_ ...
- CVT电子集团--笔试部分试题
之前有在网上答了下CVT的网上笔试题,特别把它们都弄下来,答案参考,不一定是对的,有错希望大家能提出来. 1.有关系R和S,R∩S等价于(B) A.S-(R-S) B.R-(R-S) C.( ...
- Android内存泄漏分析及调试
尊重原创作者,转载请注明出处: http://blog.csdn.net/gemmem/article/details/13017999 此文承接我的另一篇文章:Android进程的内存管理分析 首先 ...
- matlab画甘特图
近期为发小论文一直在研究作业调度问题,好不easy把数据搞出来了,结果又被画甘特图给难住了,查了各种资料.anygantt,highchart.Jfree chart等都试了,效果都不咋好.无意中留意 ...
- BootStrap 智能表单系列 五 表单依赖插件处理
这一章比较简单哦,主要就是生产表单元素后的一些后续处理操作,比如日期插件的渲染.一些autocomplete的处理等,在回调里面处理就可以了, demo: $("input.date-pic ...
- Unity cg vertex and fragment shaders(二)
着色器的一般结构: Shader "MyShader/MyShaderName" { Properties { // ... properties here ... } SubSh ...