CodeForces 591A

题意:在距离为L的两端A,B,相向发射魔法,a(以P1的速度)-->B,A<--b(以P2的速度)。假设a-->B,途中相遇,则返回到原点A<--a. 后又继续,a-->B,速度不变。

b亦是如此。求第二次相遇时a的位移。

思路:因为速度不变,所以第二次相遇地点与第一次相遇地点一样。

res= n/(Va+Vb)*Va

代码:

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; int main()
{
double n,a,b;
while(cin>>n>>a>>b)
cout<<n/(a+b)*a<<endl;
return ;
}

CodeForces 591B

题意:给一个长度为n的字符串s,进行m (1 ≤ n, m ≤ 200 000)次操作。即:s: aba  操作m1:a b 则s变成:bab.求m次变换后的s.

思路:首先想到的是暴力模拟,但是n,m都是1e5,O(n*m)=1e10,会超时。

所以需要有技巧的暴力。

字符串由26个字母组成,每次操作我们只需将字母数组进行操作,保存下字母变换后的字母。最后扫一遍根据字母数组将s改过来就ok了

注意:处理字母变换后的字母时,每次需先找要变化的值,记录下标,最后再进行交换。

代码:

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; char c[],s[];
int n,m; int main()
{
for(int i=;i<;i++)
c[i]=char('a'+i);
while(~scanf("%d%d",&n,&m))
{ scanf("%s",s);
char x[],y[];
int p1,p2;
for(int i=;i<m;i++)
{
scanf("%s%s",x,y);
for(int i=;i<;i++)
{
if(c[i]==x[])
p1=i;
if(c[i]==y[])
p2=i;
}
c[p1]=y[];
c[p2]=x[];
}
for(int i=;i<n;i++)
s[i]=c[s[i]-'a'];
printf("%s\n",s);
}
return ;
}

CodeForces 590A

题意:n个数字,只由0、1组成。数字进行0\1变换。

变换规则:1、首末数字保持不变B[1]=A[1],B[n]=A[n]

2、从左至右,第二个数A[i]开始,B[i]变成(A[i-1],A[i],A[i+1])的中位数

A->B一直变换,求达到稳定状态,即不能再变的变换次数,并输出最终变换后的B[]数字。

案例解释:

Case 1: 4

         0 0 1 1
A[1-4]={0,0,1,1}
B[1]=A[1],B[4]=A[4]
A[1]:0 A[2]:0 A[3]:1 中位数为0,所以B[2]=0
A[2]:0 A[3]:1 A[4]:1 中位数为!,所以B[3]=1
B[1-4]={0,0,1,1}
A==B,所以无法变换

思路:每次都变换成中位数,最终要求是不变。

我们可发现连续两个0 0时第二个0不管右边为0还是1,该位都不会改变。1,1同理。

所以会发现:连续的0 或 连续的1 都是肯定不会变的。

那么我们可以找到所有连续的0、1,在剩下的数字中进行变换。并且剩下的数字中每个数一定会变,0->1,1->0。

再仔细一点会发现:最接近连续部分的数进行一次变换后一定会与相邻连续数一样。每个不连续数区间每次变换后不连续数分别从两端各减1;

因此我们可以根据不连续数长度求变换次数。

变换次数=max{不连续区间长度}/2+max{不连续区间长度}%2;

例如:1 1 0 1 0 1 1 不连续区间长度为3    1 1 0 1 0 1 1 0 1 0 0  最大不连续区间长度=max(3,2)=3

变更后,可以根据数字所在区间的长度及位置计算变换次数,奇变偶不变。

因此可转换成一般的模拟题。

注意:在进行变换的时候要多加注意。

代码:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn=*1e5+; int b[maxn],c[maxn],n; int deal()
{
int maxlen=,maxx=-;
int s,e,k;
c[]=b[];c[n-]=b[n-];
b[n+]=b[n]=b[n-];
for(int i=;i<=n;)
{
if(b[i]==b[i-])
{
c[i-]=b[i];k=;
e=i-;s=e-maxlen+;
while(s<e)
{
c[s]=abs(b[s]-(k%));
c[e]=abs(b[e]-(k%));
s++;e--,k++;
}
if(s==e)
c[s]=abs(b[s]-(k%));
}
while(i<=n&&b[i]==b[i-])
{
c[i]=b[i];
i++;
maxx=max(maxx,maxlen/+maxlen%);
maxlen=;
}
if(i<=n&&b[i]!=b[i+])
maxlen++;
i++;
}
return maxx;
} int main()
{
while(~scanf("%d",&n))
{
int g=;
for(int i=;i<n;i++)
scanf("%d",&b[i]);
printf("%d\n",deal());
for(int i=;i<n;i++)
if(g++)
printf(" %d",c[i]);
else
printf("%d",c[i]);
printf("\n");
}
return ;
}

CodeForces 590B

题意:一个飞船从起始点(x1,y1)飞向目标点(x2,y2),最大速度为V,方向不定,但是会刮风,风的速度向量在t前为(vx,vy),之后变为(Vx,Vy).现给定相应坐标以及速度大           小,求从起始点飞向目标点最少需要多长时间。

思路:二分时间。枚举时间tt,求出在tt时间内,风力单独在起始点作用产生的新位置,作为新的起点,再单独求飞船在tt时间内是否能从新起点至目标点。直到找到精度范围内最小         的tt.

代码:

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std; double x1,y1,x2,y2,t,v,p1,q1,p2,q2;
const double d=0.000001; double dis(double x1,double y1,double x2,double y2)
{
return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
} bool solve(double tt)
{
double stx,sty;
if(tt<=t)
{
stx=x1+p1*tt;
sty=y1+q1*tt;
}
else
{
stx=x1+p1*t+p2*(tt-t);
sty=y1+q1*t+q2*(tt-t);
}
double distance=dis(stx,sty,x2,y2);
if(distance<=tt*tt*v*v)
return ;
return ;
} int main()
{
while(~scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2))
{
scanf("%lf%lf%lf%lf%lf%lf",&v,&t,&p1,&q1,&p2,&q2);
double L=,R=1e8,m;
while((R-L)>d)
{
m=(R+L)/;
if(solve(m))
R=m;
else
L=m;
}
printf("%.18lf\n",m);
}
return ;
}

CodeForces 590C

题意:在n*m的地图上,有三个州“1”,“2”,“3”,每个州是一个整体。除了州,“#”不可开拓道路,“."可开拓道路。求使三个州连通(任一州可到达另一州)最少需要多少个.“

思路:三个州之间的道路,一定会有一个公共点。所以只需要求每个州到该点的最短路径,进行相加。

BFS,记录每个州到每个点的最短路径。

技巧:把所有“1”放入队列后开始搜,同理对“2”,“3”进行一样的操作。

注意:记录路径的时候,到当位置的路径=到前一位置路径+(前一位置=='.')    最后ans=min(ans,f[0][i][j]+f[1][i][j]+f[2][i][j]+(mp[i][j]=='.'))

或者按平常的记录方法,ans=min(ans,f[0][i][j]+f[1][i][j]+f[2][i][j]+(mp[i][j]=='.')-2)

代码:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn=+;
const int inf=1e7; int n,m,pre[][]={,,,,,-,-,};
int f[][maxn][maxn];
char mp[maxn][maxn]; struct node
{
int x,y;
}pos[maxn*maxn]; void init()
{
for(int i=;i<;i++)
for(int j=;j<n;j++)
for(int k=;k<m;k++)
f[i][j][k]=inf;
} bool judge(int xx,int yy)
{
if(xx<||xx>=n||yy<||yy>=m)
return ;
return ;
} queue<node> q;
void bfs(int c)
{
char ch=c+'';
while(!q.empty())
q.pop(); node a,b;
for(int i=;i<n;i++)
for(int j=;j<m;j++)
if(mp[i][j]==ch)
{
a.x=i;a.y=j;
q.push(a);
f[c][i][j]=;
}
while(!q.empty())
{
a=q.front();
q.pop();
for(int i=;i<;i++)
{
int xx=a.x+pre[i][];
int yy=a.y+pre[i][];
if(!judge(xx,yy)||mp[xx][yy]=='#')
continue ;
if(f[c][xx][yy]>f[c][a.x][a.y]+(mp[a.x][a.y]=='.'))
{
f[c][xx][yy]=f[c][a.x][a.y]+(mp[a.x][a.y]=='.');
b.x=xx,b.y=yy;q.push(b);
}
}
}
} int deal()
{
int minn=inf;
for(int i=;i<n;i++)
for(int j=;j<m;j++)
minn=min(minn,f[][i][j]+f[][i][j]+f[][i][j]+(mp[i][j]=='.'));
return minn;
} int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=;i<n;i++)
scanf("%s",mp[i]);
init();
for(int i=;i<;i++)
bfs(i);
int mm=deal();
printf("%d\n",(mm>=inf)?-:mm);
}
return ;
}

Codeforces Round #327 (Div2) A~E的更多相关文章

  1. Codeforces Round #327 div2

    Problem_A(591A): 题意: 有一段长度为l的路,两个人分别在两个端点,1, l. 现在已知每个人的速度为p,q. 求第一个人(初始位置在1)在他们第二次相遇的时候的位置. 当他们相遇的时 ...

  2. Codeforces Round #539 div2

    Codeforces Round #539 div2 abstract I 离散化三连 sort(pos.begin(), pos.end()); pos.erase(unique(pos.begin ...

  3. 【前行】◇第3站◇ Codeforces Round #512 Div2

    [第3站]Codeforces Round #512 Div2 第三题莫名卡半天……一堆细节没处理,改一个发现还有一个……然后就炸了,罚了一啪啦时间 Rating又掉了……但是没什么,比上一次好多了: ...

  4. Codeforces Round#320 Div2 解题报告

    Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Fin ...

  5. Codeforces Round #564(div2)

    Codeforces Round #564(div2) 本来以为是送分场,结果成了送命场. 菜是原罪 A SB题,上来读不懂题就交WA了一发,代码就不粘了 B 简单构造 很明显,\(n*n\)的矩阵可 ...

  6. Codeforces Round #361 div2

    ProblemA(Codeforces Round 689A): 题意: 给一个手势, 问这个手势是否是唯一. 思路: 暴力, 模拟将这个手势上下左右移动一次看是否还在键盘上即可. 代码: #incl ...

  7. Codeforces Round #626 Div2 D,E

    比赛链接: Codeforces Round #626 (Div. 2, based on Moscow Open Olympiad in Informatics) D.Present 题意: 给定大 ...

  8. CodeForces Round 192 Div2

    This is the first time I took part in Codeforces Competition.The only felt is that my IQ was contemp ...

  9. Codeforces Round #327 (Div. 2) A. Wizards' Duel 水题

    A. Wizards' Duel Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/591/prob ...

随机推荐

  1. maven没有servlet(创建servlet后报错)

    maven不能创建servlet 解决方案 方案一 在项目的iml进行指定根目录 <sourceRoots> <root url="file://$MODULE_DIR$/ ...

  2. mongodb基础环境部署(windows系统下)

    Normal 0 false 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNorma ...

  3. CentOS使用yum安装drbd

    CentOS 6.x系统要升级到最新的内核才支持 CentOS 6.x rpm -ivh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noa ...

  4. Apache Maven(二):构建生命周期

    Maven 约定的目录结构 我要遵循Maven已经约定好的目录结构,才能让maven在自动构建过程中找到对应的资源进行构建处理.以下是maven约定的目录结构: 项目名称 |-- pom.xml :M ...

  5. 22.1 高级函数【JavaScript高级程序设计第三版】

    函数是JavaScript 中最有趣的部分之一.它们本质上是十分简单和过程化的,但也可以是非常复杂和动态的.一些额外的功能可以通过使用闭包来实现.此外,由于所有的函数都是对象,所以使用函数指针非常简单 ...

  6. strak组件(3):URL别名的优化

    将生成URL别名的功能进行解耦.效果和上一节的一样. 效果图: 新增函数 get_url_name(self, param) # 生成url别名,需要一个参数(list/add/edit/delete ...

  7. Mybatis中updateByPrimaryKeySelective和updateByPrimaryKey区别

    int updateByPrimaryKeySelective(TbItem record); int updateByPrimaryKey(TbItem record); 上面的是逆转工程生成的Ma ...

  8. 代码review的流程

    以前我们一直都是如果要进行代码review的时候,要不我们就直接用idea来进行查看,根据不同的来查看 但是我们都是看代码的不同来进行来实现的,其实我们不需要这样,我们可以使用工具Phabricato ...

  9. gcc常用命令

    1简介 2简单编译 2.1预处理 2.2编译为汇编代码(Compilation) 2.3汇编(Assembly) 2.4连接(Linking) 3多个程序文件的编译 4检错 5库文件连接 5.1编译成 ...

  10. Android 本应用数据清除管理器DataCleanManager

    1.整体分析 1.1.源代码先给出了,可以直接Copy. /** * 本应用数据清除管理器 */ public class DataCleanManager { /** * * 清除本应用内部缓存(/ ...