Codeforces Round #363 Div.2[111110]
好久没做手生了,不然前四道都是能A的,当然,正常发挥也是菜。

A:Launch of Collider
题意:20万个点排在一条直线上,其坐标均为偶数。从某一时刻开始向左或向右运动,速度为每秒1个单位长度。输入给出每个点的坐标及其移动的方向,求发生第一次碰撞的时间,若不会碰撞,则输出-1
最先发生碰撞的是一定是初始时相邻的两个点,因此只需对每个点循环一边,判断其是否会与下一个点碰撞,并求出其时间即可。
#include<stdio.h>
#include<stdlib.h>
int N;
int pos[];
char ch[];
char st[];
int main()
{
scanf ( "%d", &N );
getchar();
for ( int i = ; i <= N; i++ ) scanf ( "%c", &ch[i] );
for ( int i = ; i <= N; i++ ) scanf ( "%d", &pos[i] );
int ans = 0x7FFFFFFF, p = ;
for ( int i = ; i <= N; i++ )
{
if ( ch[i] == 'R' )
{
p = i;
continue;
}
if ( p == ) continue;
if ( ( pos[i] - pos[p] ) / < ans ) ans = ( pos[i] - pos[p] ) / ;
}
if ( ans == 0x7FFFFFFF ) printf ( "-1\n" );
else printf ( "%d\n", ans );
return ;
}
B:One Bomb
题意:1000*1000的矩阵,‘.’表示空地,‘*’表示围墙。可以在任意位置按一颗炸弹,摧毁位于同一行和同一列的所有墙。问对于给定的地图,能否只用一颗炸弹炸掉所有墙。
首先随意指定一个墙点,将其坐标与其他所有墙点比较,如果其他墙点与这个点要么在同一行,要么在同一列,则可以完成,否则能找到一个与第一个点既不在同一行也不在同一列的墙点。根据这两个点可以确定两个位置,炸弹如果要摧毁所有的墙,只能在这两个点中选择一个,分别尝试并确认即可。
#include<stdio.h>
int p[][];
char str[][];
int main()
{
int N, M;
scanf ( "%d%d", &N, &M );
for ( int i = ; i <= N; i++ ) scanf ( "%s", &str[i][] );
int T = ;
for ( int i = ; i <= N; i++ )
for ( int j = ; j <= M; j++ )
if ( str[i][j] == '*' )
{
p[++T][] = i;
p[T][] = j;
}
if ( T == )
{
printf ( "YES\n1 1\n" );
return ;
}
bool find = false;
int x, y;
for ( int i = ; i <= T; i++ )
if ( p[i][] != p[][] && p[i][] != p[][] )
{
find = true;
x = p[i][];
y = p[i][];
break;
}
if ( !find )
{
printf ( "YES\n" );
printf ( "%d %d\n", p[][], p[][] );
return ;
}
else
{
bool planA = true, planB = true;
int x1 = x, y1 = p[][];
for ( int i = ; i <= T; i++ )
if ( p[i][] != x1 && p[i][] != y1 )
{
planA = false;
break;
}
int x2 = p[][], y2 = y;
for ( int i = ; i <= T; i++ )
if ( p[i][] != x2 && p[i][] != y2 )
{
planB = false;
break;
}
if ( !planA && !planB )
{
printf ( "NO\n" );
return ;
}
printf ( "YES\n" );
printf ( "%d %d\n", planA ? x1 : x2, planA ? y1 : y2 );
}
return ;
}
C:Vacations
题意:每天可以有3种选择,发呆,锻炼身体或者打比赛,连着两天如果不发呆则做的事不能相同。求发呆的最少天数。
f[i][0]表示到第i天位置且当天发呆的最小发呆天数,f[i][1]表示当天锻炼身体,f[i][2]表示当天打比赛。
#include<stdio.h>
int MIN2 ( int a, int b )
{
return a < b ? a : b;
}
int MIN3 ( int a, int b, int c )
{
int t = ;
if ( t > a ) t = a;
if ( t > b ) t = b;
if ( t > c ) t = c;
return t;
}
int f[][];
int d[];
int main()
{
int N;
scanf ( "%d", &N );
for ( int i = ; i <= N; i++ ) scanf ( "%d", &d[i] );
f[][] = ;
f[][] = ;
f[][] = ;
for ( int i = ; i <= N; i++ )
{
if ( d[i] == )
{
f[i][] = MIN3 ( f[i - ][], f[i - ][], f[i - ][] ) + ;
f[i][] = ;
f[i][] = ;
}
if ( d[i] == )
{
f[i][] = MIN3 ( f[i - ][], f[i - ][], f[i - ][] ) + ;
f[i][] = MIN2 ( f[i - ][], f[i - ][] );
f[i][] = ;
}
if ( d[i] == )
{
f[i][] = MIN3 ( f[i - ][], f[i - ][], f[i - ][] ) + ;
f[i][] = ;
f[i][] = MIN2 ( f[i - ][], f[i - ][] );
}
if ( d[i] == )
{
f[i][] = MIN3 ( f[i - ][], f[i - ][], f[i - ][] ) + ;
f[i][] = MIN2 ( f[i - ][], f[i - ][] );
f[i][] = MIN2 ( f[i - ][], f[i - ][] );
}
}
printf ( "%d\n", MIN3 ( f[N][], f[N][], f[N][] ) );
return ;
}
/*
8
1 1 1 1 1 1 1 2
0 0 1 1 2 2 3 3 4 4
1 x 0 1 1 2 2 3 3 x
2 x x x x x x x x 3
1->0,1
2->0,2
3->0,1,2
*/
D:Fix a Tree
题意:给定n个点各自的父亲,得到一个n个点n条边的有向图。每次可以修改一个点的父亲,求最少修改多少次才能得到一棵树(树的根节点的父亲是其自身)。
首先在给出的点里找到一个父亲是自身的点作为根节点,然后从图中搜索环,并把环上任意一点的父亲改为根节点。若找不到父亲为自身的点,则任意找到图中的一个环,从环上断开,并将断点的父亲修改为自身,作为根节点,并重复之前的步骤。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int fa[];
bool v[], u[];
int main()
{
int N, Root = -, cnt;
scanf ( "%d", &N );
for ( int i = ; i <= N; i++ ) scanf ( "%d", &fa[i] );
memset ( v, false, sizeof ( v ) );
for ( int i = ; i <= N; i++ )
if ( fa[i] == i )
{
Root = i;
v[i] = true;
break;
}
if ( Root != - )
{
cnt = ;
for ( int i = ; i <= N; i++ )
if ( !v[i] )
{
memset ( u, false, sizeof ( u ) );
int x = i;
v[x] = true;
u[x] = true;
while ( !v[fa[x]] )
{
v[fa[x]] = true;
u[fa[x]] = true;
x = fa[x];
}
if ( u[fa[x]] )
{
cnt++;
fa[x] = Root;
}
}
}
else
{
Root = ;
v[] = true;
while ( !v[fa[Root]] )
{
v[fa[Root]] = true;
Root = fa[Root];
}
cnt = ;
fa[Root] = Root;
for ( int i = ; i <= N; i++ )
if ( !v[i] )
{
memset ( u, false, sizeof ( u ) );
int x = i;
v[x] = true;
u[x] = true;
while ( !v[fa[x]] )
{
v[fa[x]] = true;
u[fa[x]] = true;
x = fa[x];
}
if ( u[fa[x]] )
{
cnt++;
fa[x] = Root;
}
}
}
printf ( "%d\n", cnt );
for ( int i = ; i < N; i++ ) printf ( "%d ", fa[i] );
printf ( "%d\n", fa[N] );
return ;
}
E:LRU
题意:自己读吧,懒得写了。
题目里问1e100次后的概率,显然不用真的算到1e100,它只是表示一个“足够多”的概念。由于每种目标或者有或者没有只有两种状态,而目标的数目最多20个,因此可以用一个20位的二进制数表示所有可能的状态。经过足够多的次数后,槽位全部被填满,此后的状态转移并不影响概率。因此对于每一种状态,只需计算刚刚好达到这种状态的概率即可,也就是说,不用考虑弹出之前的某个目标的情况。
#include<stdio.h>
int N, K;
double p[];
double ans[];
double dp[ << + ];
int main()
{
int k;
double sp;
scanf ( "%d%d", &N, &K );
for ( int i = ; i < N; i++ )
{
scanf ( "%lf", &p[i] );
}
dp[] = ;
for ( int i = ; i < ( << N ); i++ )
{
sp = ;
k = ;
for ( int j = ; j < N; j++ )
{
if ( ( ( << j ) &i ) == )
{
sp += p[j];
k++;
}
}
if ( N - k > K ) continue;
for ( int j = ; j < N; j++ )
{
if ( p[j] < 0.000000001 ) continue;
if ( ( ( << j ) &i ) != )
{
dp[i] += dp[i - ( << j )] * p[j] / ( sp + p[j] );
ans[j] += dp[i - ( << j )] * p[j] / ( sp + p[j] );
}
}
}
for ( int i = ; i < N; i++ )
{
printf ( "%.10lf ", ans[i] );
}
return ;
}
Codeforces Round #363 Div.2[111110]的更多相关文章
- 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)A-D
699A 题意:在一根数轴上有n个东西以相同的速率1m/s在运动,给出他们的坐标以及运动方向,问最快发生的碰撞在什么时候 思路:遍历一遍坐标,看那两个相邻的可能相撞,更新ans #include< ...
- 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 ...
随机推荐
- Mysql之取消主从复制
Mysql5.7 Mysql取消主从复制很简单.只需在其要终止同步的Server上[一般是Slave]执行下面语句即可: stop slave; reset slave; 如图: .
- http协议之request
一.请求的基本格式 请求的基本格式包括请求行,请求头,请求实体三部分.例如:GET /img/bd_logo1.png HTTP/1.1Accept: */*Referer: http://www.b ...
- 昨天在公司加班,上午好像就是弄一个ftp的linux服务问题
在网上找了一些方法,可是其中有通过匿名方式登陆,但是在root的权限下才能存放文件,可是把匿名用户登陆取消之后又不能登陆,就是没有列出怎么来添加一个ftp的用户,今天打算直接装一个linux系统在虚拟 ...
- elk安装(这个是初级的可以把这个套件安上)
http://udn.yyuap.com/doc/logstash-best-practice-cn/index.html ELK其实并不是一款软件,而是一整套解决方案,是三个开源软件Elastics ...
- 数据结构和算法 – 5.模式匹配和文本处理
了使用正则表达式,需要把 RegEx 类引入程序.大家可以在 System.Text.RegularExpression 名字域中找到这种类.一旦把这种类导入了程序,就需要决定想要用 RegEx 类来 ...
- ss + pac
浅析PAC,教你动手修改你的PAC文件及user-rule文件实现自动代理 - 推酷http://www.tuicool.com/articles/V77jyu shadowsocks自定义代理规则u ...
- 7z命令行工具
7z (中文)是优秀开源的压缩解压缩软件(wiki: en 中文),有windows版本与linux版本,最新的9.32版本支持的格式包括: 压缩与解压缩均支持:7z, XZ, BZIP2, GZI ...
- ASP.NET 自定义URL重写 分类: ASP.NET 2014-10-31 16:05 175人阅读 评论(0) 收藏
一.功能说明: 可以解决类似 http://****/news 情形,Url路径支持正则匹配. 二.操作步骤: 1.增加URL重写模块: using System; using System.IO; ...
- hdu 4731 2013成都赛区网络赛 找规律
题意:找字串中最长回文串的最小值的串 m=2的时候暴力打表找规律,打表可以用二进制枚举
- APP交互
交互设计基本功!5个值得学习的APP交互方式http://www.uisdc.com/5-interactive-design-worth-learning 移动App交互设计10大趋势–你用到了吗? ...