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 ...
随机推荐
- 苹果应用 Windows 申请 普通证书 和Push 证书 Hbuilder 个推(2)
s上一篇 讲述了android 如何打包,这一篇 看一下如何IOS下打包 在苹果上申请证书,及其麻烦,我写下来,有需要的直接拿走即可: 首先 苹果的证书分两种 一种是 development 证书,另 ...
- web页面记住密码存在安全问题 - 处理方式
现在一般安全网站都不会做记住密码功能,因为记住密码存在安全缺陷. 不考虑网络拦截问题,如果是登录页面记住密码,第二次登录,直接进入开发者模式修改类型为text即可看到密码. 处理方式: 1.把auto ...
- NYOJ题目111分数加减法
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsEAAAKBCAIAAAA5i+FPAAAgAElEQVR4nO3dPXLbugMv7LsJ916Iay ...
- Android Programming: Pushing the Limits -- Chapter 7:Android IPC -- ApiWrapper
前面两片文章讲解了通过AIDL和Messenger两种方式实现Android IPC.而本文所讲的并不是第三种IPC方式,而是对前面两种方式进行封装,这样我们就不用直接把Aidl文件,java文件拷贝 ...
- 一般处理程序获取session值
1.要在一般处理程序中获取其他页面的session值,需要引用名空间: using System.Web.SessionState; 2.然后继承一个接口:IRequiresSessionState, ...
- DOM – 7.动态创建DOM + 8.innerText innerHTML value
7.动态创建DOM 8.innerText innerHTML value 7+8 练习:案例:点击按钮动态增加网站列表,分两列,第一列为网站的名字,第二列为带网站超链接的网站名.增加三行常见网站 ...
- MySql中delimiter的作用是什么?
这个命令与存储过程没什么关系吧.其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了.默认情况下,delimiter是分号;.在命令行客户端中,如果有一行命令以分号结束,那么 ...
- android 入门-控件 测量状态栏高度
private ViewTreeObserver viewTreeObserver; /** 获取可見区域高度 **/ WindowManager manager = getWindowManager ...
- PHP日期操作类代码-农历-阳历转换、闰年、计算天数等
<?php class Lunar { var $MIN_YEAR = 1891; var $MAX_YEAR = 2100; var $lunarInfo = array( array(0,2 ...
- PMP 第七章 项目成本管理
估算成本 制定预算 控制成本 1.成本管理计划的内容和目的是什么? 包括对成本进行估算 预算和控制的各过程,从而确保项目在批准的预算内完工. 2.直接成本.间接成本.可变成本.固定成本.质量成 ...