好久没做手生了,不然前四道都是能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. Linux定时任务设定

    使用crontab 命令进行设定. 详情可参见:http://blog.csdn.net/xiyuan1999/article/details/8160977. 共有6项构成,前5项为时间:分 时 天 ...

  2. DLog的使用

    DLog本质上就是个宏替换.DLog具体代码如下: #ifdef DEBUG #define DLog(fmt, ...) NSLog((@"%s [Line %d] " fmt) ...

  3. JAVA基础学习之流的简述及演示案例、用缓冲区方法buffer读写文件、File类对象的使用、Serializable标记接口(6)

    1.流的简述及演示案例输入流和输出流相对于内存设备而言.将外设中的数据读取到内存中:输入将内存的数写入到外设中:输出.字符流的由来:其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表. ...

  4. Bootstrap简介

    接下来的一段时间,想研究一下现有的网页框架,第一个不容错过的就是Bootstrap,Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CS ...

  5. 初识SQL Server Integration Service

    SSIS(SQL Server Integration Service)是Microsoft 从SQL Server2005 以后发布的,现在一直跟随每个SQL server版本.它是Microsof ...

  6. html5移动Web开发实战

    1.解决横竖屏字体大小变化 html{ -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; text-size-adjust:100 ...

  7. zoj 3888 线段树 ***

    卡n^2,用线段树降到nlogn 记录每个点上所覆盖线段的次小值,保证能有两条路径能走 #include<cstdio> #include<iostream> #include ...

  8. Windows Phone中获取UserAgent

    进入WP8时代后,通过DeviceExtendedProperties获取到的DeviceName不再是手机型号了,这对于需要获得手机型号做一些事情的应用(如新浪微博的小尾巴)来说,影响是比较大的. ...

  9. 关于UltraISO打开iso文件后只有部分文件问题

    背景:在安装CentOS 7的时候,用UltraISO打开之后,只有一个EFI文件,刻完U盘,却无法引导. 之前还以为偶没下载全,就又下了一遍,还好偶搞得的NetInstall,要不然就呵呵了. 解决 ...

  10. 搜索 录音功能 Android api

    搜索 录音功能 Android api http://www.oschina.net/android/47/ http://m.blog.csdn.net/blog/u011309801/406523 ...