好久没做手生了,不然前四道都是能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]的更多相关文章

  1. Codeforces Round 363 Div. 1 (A,B,C,D,E,F)

    Codeforces Round 363 Div. 1 题目链接:## 点击打开链接 A. Vacations (1s, 256MB) 题目大意:给定连续 \(n\) 天,每天为如下四种状态之一: 不 ...

  2. Codeforces Round #363 (Div. 2)

    A题 http://codeforces.com/problemset/problem/699/A 非常的水,两个相向而行,且间距最小的点,搜一遍就是答案了. #include <cstdio& ...

  3. Codeforces Round #363 (Div. 1) B. Fix a Tree 树的拆环

    题目链接:http://codeforces.com/problemset/problem/698/B题意:告诉你n个节点当前的父节点,修改最少的点的父节点使之变成一棵有根树.思路:拆环.题解:htt ...

  4. 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 ...

  5. Codeforces Round #363 (Div. 2) B. One Bomb —— 技巧

    题目链接:http://codeforces.com/contest/699/problem/B 题解: 首先统计每行每列出现'*'的次数,以及'*'出现的总次数,得到r[n]和c[m]数组,以及su ...

  6. 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] ...

  7. Codeforces Round #363 (Div. 2)A-D

    699A 题意:在一根数轴上有n个东西以相同的速率1m/s在运动,给出他们的坐标以及运动方向,问最快发生的碰撞在什么时候 思路:遍历一遍坐标,看那两个相邻的可能相撞,更新ans #include< ...

  8. Codeforces Round #363 (Div. 2) One Bomb

    One Bomb 题意: 只有一个炸弹,并且一个只能炸一行和一列的'*',问最后能否炸完所以'*',如果可以输出炸弹坐标 题解: 这题做的时候真的没什么好想法,明知道b题应该不难,但只会瞎写,最后越写 ...

  9. 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 ...

随机推荐

  1. finla变量,方法和类

    1.finla变量关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值,通常,有final定义的变量为常量 final关键字定义的变量必须在声明时对其进行赋值定义,final除了可以修饰基 ...

  2. NYOJ题目112指数运算

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAs0AAAIICAIAAAAaCETRAAAgAElEQVR4nO3drW7jWtwv4PcmwnMhxb ...

  3. Python 文件处理

    文件夹: 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir() 函数用来删除一个文件:os.remove() 删 ...

  4. kvm 下运行的 WINWS7磁盘空间不足 增加磁盘 实战(这个有问题,还未解决)

    创建一个新硬盘: [root@NB vhost]# qemu-img create -f qcow2 add_win_desk.img 5G Formatting encryption=off clu ...

  5. JS中级 - 01:DOM节点

    1元素属性   1.1childNodes 返回元素的一个子节点的数组 (不推荐,建议用非标准children代替) 提醒:只包含一级子节点,不包含后辈孙级别以下节点. children:返回元素的一 ...

  6. EF – 5.DbSet与DbContext,数据更新奥秘

    5.6.4 <DbSet与DbContext> 介绍DbSet与DbContext中的核心属性及重要方法. 5.6.5 <数据更新的奥秘>  这一讲极为重要,因为它揭示出了En ...

  7. 17.观察者模式(Observer Pattern)

    using System; using System.Collections.Generic; namespace ConsoleApplication10 { /// <summary> ...

  8. JAVA基础学习之XMLCDATA区、XML处理指令、XML约束概述、JavaBean、XML解析(8)

    1.CDATA区在编写XML文件时,有些内容可能不想让解析引擎解析执行,而是当作原始内容处理.遇到此种情况,可以把这些内容放在CDATA区里,对于CDATA区域内的内容,XML解析程序不会处理,而是直 ...

  9. ASP.NET Web Api 服务器端变了,客户端该如何修改请求(转载)

    转载地址:http://www.cnblogs.com/fzrain/p/3558765.html 前言 一旦我们将API发布之后,消费者就会开始使用并和其他的一些数据混在一起.然而,当新的需求出现时 ...

  10. 玩玩Excel下的Power View

    作为微软平台下的数据展示工具,Power View是一个不错的选择.而在Excel 2013下,即使你没有SharePoint的实例那么你也可以玩转它.此篇讲对Excel 2013下的Power Vi ...