Codeforces Round #363 (Div. 2)A-D
699A
题意:在一根数轴上有n个东西以相同的速率1m/s在运动,给出他们的坐标以及运动方向,问最快发生的碰撞在什么时候
思路:遍历一遍坐标,看那两个相邻的可能相撞,更新ans
#include<cstdio>
int n,num[200100];
char s[200100];
int main()
{
scanf("%d",&n);
scanf("%s",s+1);
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
int ma=0x3f3f3f3f;
for(int i=1;i<n;i++)
if(s[i]=='R'&&s[i+1]=='L')
if(num[i+1]-num[i]<ma)
ma=num[i+1]-num[i];
if(ma==0x3f3f3f3f)
printf("%d\n",-1);
else
printf("%d\n",ma/2);
return 0;
}
699B
题意:给出一个由.或者*表示的矩阵,.表示空,*表示墙,现在要用一个炸弹来置于矩阵的某个位置炸掉所有的墙,炸弹的破坏范围是其所置位置的那一行以及那一列,问是不是有可能用一个炸弹就能全部炸掉
思路:首先记录每一行以及每一列的炸弹个数,然后遍历整个矩阵,看这个位置能炸掉的墙是不是等于全部的墙。
#include<cstdio>
const int MAXN=1010;
int n,m;
char s[MAXN][MAXN];
int c[MAXN],l[MAXN]; int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%s",s[i]+1);
int num=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(s[i][j]=='*')
c[i]++,l[j]++,num++; bool flag=false;
int x,y;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
int sum=s[i][j]=='*'?c[i]+l[j]-1:c[i]+l[j];
if(sum==num)
flag=true,x=i,y=j;
}
if(flag)
printf("YES\n%d %d\n",x,y);
else
printf("NO\n");
return 0;
}
699C
题意:Vasya有一个n天的假期,假期里面他可以做3件事
1.休息
2.做算法竞赛
3.做运动
但是每一天的情况都会导致他可以做的选择不同,
情况0:他只能休息
情况1:他可以休息也可以做算法竞赛
情况2:他可以休息也可以去运动
情况3;他可以休息,也可以做算法竞赛或者去运动
另外还有一个限制条件:他不喜欢连续两天运动或者连续两天做算法竞赛
问:在以上情况下,他休息天数最少可以是多少天?
思路:这可是非常简单的DP类型啊,滚动DP?没什么好说的,就是注意一下递推的细节,比如不论是哪一天他都是可以选择休息。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=110;
int n;
int a[maxn];
int dp[maxn][3];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=0;i<=n;i++)
for(int j=0;j<=3;j++)
dp[i][j]=0x3f3f3f3f;
dp[0][0]=0;
for(int i=1;i<=n;i++)
{
dp[i][0]=dp[i-1][0]+1;
dp[i][0]=min(dp[i-1][1]+1,dp[i][0]);
dp[i][0]=min(dp[i-1][2]+1,dp[i][0]);
if(a[i]==1){
dp[i][1]=min(dp[i-1][0],dp[i-1][2]);
}else if(a[i]==2){
dp[i][2]=min(dp[i-1][0],dp[i-1][1]);
}else if(a[i]==3){
dp[i][1]=min(dp[i-1][0],dp[i-1][2]);
dp[i][2]=min(dp[i-1][0],dp[i-1][1]);
}
}
int ans=0x3f3f3f3f;
dp[n][1]=min(dp[n][1],dp[n][2]);
ans=min(dp[n][0],dp[n][1]);
printf("%d\n",ans);
return 0;
}
699D
题意:给出n个点的父节点,如果他的父节点为自己,那可以理解为他是根,问最少要改变几棵树的父节点可以使得他们之间形成一颗树。并且输出改变后每个点的父节点
思路:首先需要通过dfs染色找出图中的连通分量到底有多少个,图中每个连通分量有2种结构,一种是树结构,一种是存在环,如果它是树结构,我们找出它的根节点就可以了,如果它是环,我们找出环上的任意一点。如果存在树结构,那么就其他树或者环并到这颗树的根节点下,如果不存在树结构,那就改变某个环,使它成为树,其他环并到它的父节点下
#include<cstdio>
#define N 200005
int a[N],v[N],h[N],fa[N],ans,cnt,root;
int dfs(int u){
v[u]=cnt;//标记为当前访问
if(!v[a[u]])return a[u]=dfs(a[u])==-1?a[u]:a[a[u]];
if(v[a[u]]==cnt&&a[u]!=u)return a[u]=-1;//存在环,标记为-1说明其父节点需要更改
return a[u]=a[a[u]]==-1?a[u]:a[a[u]];
}
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
fa[i]=a[i];
if(a[i]==i)root=i;
}
cnt=0;
for(int i=1;i<=n;i++){
if(!v[i]){
cnt++;
dfs(i);
if(++h[a[i]]==1)
ans++;
}
}
printf("%d\n",ans-(root>0));
for(int i=1;i<=n;i++)
if(a[i]==-1||i==a[i]&&i!=root)printf("%d ",root?root:root=i);
else printf("%d ",fa[i]);
return 0;
}
Codeforces Round #363 (Div. 2)A-D的更多相关文章
- Codeforces Round 363 Div. 1 (A,B,C,D,E,F)
Codeforces Round 363 Div. 1 题目链接:## 点击打开链接 A. Vacations (1s, 256MB) 题目大意:给定连续 \(n\) 天,每天为如下四种状态之一: 不 ...
- Codeforces Round #363 (Div. 2)
A题 http://codeforces.com/problemset/problem/699/A 非常的水,两个相向而行,且间距最小的点,搜一遍就是答案了. #include <cstdio& ...
- Codeforces Round #363 (Div. 1) B. Fix a Tree 树的拆环
题目链接:http://codeforces.com/problemset/problem/698/B题意:告诉你n个节点当前的父节点,修改最少的点的父节点使之变成一棵有根树.思路:拆环.题解:htt ...
- Codeforces Round #363 (Div. 2) D. Fix a Tree —— 并查集
题目链接:http://codeforces.com/contest/699/problem/D D. Fix a Tree time limit per test 2 seconds memory ...
- Codeforces Round #363 (Div. 2) B. One Bomb —— 技巧
题目链接:http://codeforces.com/contest/699/problem/B 题解: 首先统计每行每列出现'*'的次数,以及'*'出现的总次数,得到r[n]和c[m]数组,以及su ...
- Codeforces Round #363 (Div. 2) C. Vacations —— DP
题目链接:http://codeforces.com/contest/699/problem/C 题解: 1.可知每天有三个状态:1.contest ,2.gym,3.rest. 2.所以设dp[i] ...
- Codeforces Round #363 Div.2[111110]
好久没做手生了,不然前四道都是能A的,当然,正常发挥也是菜. A:Launch of Collider 题意:20万个点排在一条直线上,其坐标均为偶数.从某一时刻开始向左或向右运动,速度为每秒1个单位 ...
- Codeforces Round #363 (Div. 2) One Bomb
One Bomb 题意: 只有一个炸弹,并且一个只能炸一行和一列的'*',问最后能否炸完所以'*',如果可以输出炸弹坐标 题解: 这题做的时候真的没什么好想法,明知道b题应该不难,但只会瞎写,最后越写 ...
- Codeforces Round #363 (Div. 2)->C. Vacations
C. Vacations time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
随机推荐
- UISprite(NGUI)扩展 图片镂空
NGUI 版本2.6.3 在做新手引导时,需要高亮特定UI元素,也就是加个黑色蒙板,然后在蒙版上显示这个UI元素,为了简单方便我扩展了下UISprite,来镂空指定空间. 分为2种,矩形和圆镂空,矩形 ...
- IP路由选择
当一个ip数据包准备好了,它是如何到达目标主机的? ?首先这个ip数据报文的生命周期即ttl值是否为0了,如果是0就丢弃了 ?搜索路由表中有没有完全匹配的主机地址 ?匹配主机失败后,搜索路由表中同子网 ...
- linux实践之ELF文件分析
linux实践之ELF文件分析 下面开始elf文件的分析. 我们首先编写一个简单的C代码. 编译链接生成可执行文件. 首先,查看scn15elf.o文件的详细信息. 以16进制形式查看scn15elf ...
- CentOS - FTP server
1. install vsftpd.(PS:procedure 1-4 under the circumstance that the firewall is closed and the iptab ...
- 【原创】JMeter学习(三十七)Jmeter录制手机app脚本
环境准备: 1.手机 2.wifi 3.Jmeter 具体步骤: 1.启动Jmeter: 2.“测试计划”中添加“线程组”: 3.“工作台”中添加“HTTP代理服务器”: 4.配置代理服务器:Gl ...
- html 以及JavaScript 转义
1.之前遇到一个问题,在用js给某个控件赋值时如果含有单引号'或者双引号"有可能导致赋值不成功,如document.getElementById("txtTestBox1" ...
- One of the best logo fonts "Klavika"
Download link: http://fontsgeek.com/search?q=Klavika
- leetcode pow(x,n)实现
题目描述: 自己实现pow(double x, int n)方法 实现思路: 考虑位运算.考虑n的二进制表示形式,以n=51(110011)为例,x^51 = x^1*x^2*x^16*x^32,因此 ...
- 建模分析之机器学习算法(附python&R代码)
0序 随着移动互联和大数据的拓展越发觉得算法以及模型在设计和开发中的重要性.不管是现在接触比较多的安全产品还是大互联网公司经常提到的人工智能产品(甚至人类2045的的智能拐点时代).都基于算法及建模来 ...
- c++减法高精度算法
c++高精度算法,对于新手来说还是一大挑战,只要克服它,你就开启了编程的新篇章,算法. 我发的这个代码并不是很好,占用内存很多而且运行时间很长(不超过0.02秒),但是很好理解,很适合新手 高精算法的 ...