A. Three Friends

  题目链接

  题目意思:有三个好朋友a,b,c。他们在一个坐标轴上,他们的位置分别是x和xb ,xc,他们三个人都可以往前或者往后走一步,只能走一步。问你他们走了(也可能不走)之后的abs(x -  xb) + abs(xb - xc) + abs(xc - xa )的最小值是多少?

  题目分析:我们可以假定朋友a的坐标最小,朋友b比朋友a更大,但是又比朋友c更小,所以朋友c的位置坐标最大。所以我们可以知道,上面那个式子就是两倍的(最大坐标-最小的坐标),所以我们使得它们的距离最小就可以了。所以怎么使得它们的距离最小呢,那肯定是朋友a向朋友c走一步,朋友c向朋友a走一步,这样就会使得距离最小,真的吗??不不不,肯定不是,如果三个朋友都在相同的位置,a走一步,c走一步,那距离不久变大了,所以我们就可以是ans的初值为0;然后将最大的距离减去最小的距离的值 - 2,得到minn,然后去max(minn,ans),如果minn是负数,那就说明它们肯定可以走到一块,所以距离就是0,如果是正数,那就很遗憾了,它们走不到一块,所以就取那个最小值就可以了。

下面看代码:$i + a_i \le n $

 #include <iostream>
#include <algorithm>
#include <cstdio> using namespace std;
int num[]; int main()
{
int t;
scanf("%d",&t);
while(t--)
{
for(int i = ; i <= ; i++)
scanf("%d",&num[i]);
sort(num+,num+);
int ans = ;
ans = max(,num[] - num[] - );
printf("%d\n",*ans);
}
return ;
}

看我

  B. Snow Walking Robot

  题目链接:http://codeforces.com/contest/1272/problem/B

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring> using namespace std;
const int ma = 1e5 + ;
char s[ma];
int n,q,num[];
int main()
{
scanf("%d",&q);
int ans,len;
int minn1,minn2;
while(q--)
{
scanf(" %s",&s);
len = strlen(s);
for(int i = ; i < ; i++)
num[i] = ;
for(int i = ; i < len; i++)
{
if(s[i] == 'L')
num[]++;
else if(s[i] == 'R')
num[]++;
else if(s[i] == 'U')
num[]++;
else if(s[i] == 'D')
num[]++;
}
minn1 = min(num[],num[]);
minn2 = min(num[],num[]);
if(!minn1 && !minn2)
printf("0\n\n");
else
{
if(!minn1)
minn2 = ;
if(!minn2)
minn1 = ;
printf("%d\n",*minn1 + *minn2);
for(int i = ; i <= minn1; i++)
printf("%c",'L');
for(int i = ; i <= minn2; i++)
printf("%c",'U');
for(int i = ; i <= minn1 - ; i++)
printf("%c",'R');
for(int i = ; i <= minn2 - ; i++)
printf("%c",'D');
if(minn1)
printf("%c",'R');
if(minn2)
printf("%c",'D');
printf("\n");
}
}
return ;
}

  我觉得英语不好的人打cf的比赛很吃亏,题目都看不懂怎么写,要哭了······

  这里要注意这句话:visits no cell other than (0,0) two or more times and ends the path in the cell (0,0).它的意思就是除了(0,0)坐标以外只能visit一次。题目字符串合法的标准是,以坐标(0,0)开始,并且以坐标(0,0)结束,在行走的过程中每个坐标只能走一次,问你将不合法的字符串改为合法的字符串所需要的最小值是多少?,当然也有可能无论怎么改都不合法的,那就输出0;

  题目分析:我们来分情况讨论一下,第一种是只有一个方向的,那肯定不合法的,怎么走也走不回原点:

  第二种:有两个方向。这里又可以分类,一是正反方向,比如左右方向,如果是这样的话,那只能是左右(上下)各走一步;二是竖直方向,比如左上,那肯定也是不合法的。

  第三种:有三个方向,那肯定也不能回到原点。

  第四种:就是有四个方向。因为要回到原点,所以说往左走了多少步,就要往右走多少步,所以要取一个正反的最小值,l = min(num_l,num_r),h = min(num_u,num_d),这样数量上就满足了,然后我们要满足那两个要求了,那我们肯定不能往左走了,然后就往右边走,所以我们可以L,U,R,D这样样,走一个矩形,这样一下子就解决了两个要求。

     代码在上面。

  C. Yet Another Broken Keyboard

  题目链接:http://codeforces.com/contest/1272/problem/C

  c题算是给出了公式,但是要对题意加以理解(我感觉我没理解),根据我所理解的就是还可以用的字母连续的用题目所给的公式n*(n+1)/2,计算字母的个数然后带入公式,将其加起来就可以。这让我明白看不懂的题目猜一下题目意思也行。

  看代码:

 #include <iostream>
#include <algorithm>
#include <cstdio>
#include <set> using namespace std;
typedef long long ll;
const int ma = 2e5 + ;
char c[ma];
int s[];
int n,k;
ll ans; int main()
{
scanf("%d%d",&n,&k);
scanf(" %s",c);
getchar();
char ss;
for(int i = ; i <= k; i++)
{
scanf("%c",&ss);
getchar();
s[ss-'a'] = ;
}
ll a;
ans = ;
a = ;
for(int i = ; i < n; i++)
{
if(s[c[i] - 'a'])
{
a++;
if(i == n-)
ans += (a+)*a/;
}
else
ans += (a+)*a/,a = ;
}
printf("%lld",ans);
return ;
}

  D. Remove One Element

  这是最有意思的一道题了,dp题,因为本人不太会dp思想,所以我是左思右想还是不会写,然后就看了一下题解,发现题解讲的简单,实现的也简单,我太菜了,要好好学习dp,多写几道题。

  根据题目意思题解是这样定义状态的 Li代表着以位置i开始的最大长度,Ri代表着以i开始的最大增加长度。那怎么实现呢,怎么实现呢。首先这两个数组肯定都有初始值,并且都是1,代表着它们本身,L数组所求的以位置i开始的最大长度所以L要从数组的右边开始,如果num[i] < num[i+1],那么就代表着可以延续下去,所以L[i] = L[i+1] + 1,如果不满足就不延续,遍历一遍数组就可以得到了;那么同样的也可以这样求R数组,但是它要从第二个数开始。然后我们就可以得到这两个数组了,因为题目讲可以将一个数字忽略,所以以i结束的最大长度加上i+2开始的最大长度,历经一边去最大值,如果这样交,你会发现还是过不了,太难过了,怎么老是过不了····,因为少了一种情况就是,数组本身就是递增数组。

  下面是代码:

 #include <iostream>
#include <algorithm>
#include <cstdio> using namespace std;
const int ma = 2e5 + ;
int n,l_len[ma],r_len[ma],num[ma]; int main()
{
scanf("%d",&n);
for(int i = ;i <= n;i++)
scanf("%d",&num[i]);
for(int i = ;i <= n;i++)
l_len[i] = r_len[i] = ;
int ans = ;
for(int i = n-;i >= ;i--)
{
if(num[i] < num[i+])
l_len[i] = l_len[i+] + ;
ans = max(ans,l_len[i]);
}
for(int i = ;i <= n;i++)
{
if(num[i-] < num[i])
r_len[i] = r_len[i-] + ;
ans = max(ans,r_len[i]);
}
for(int i = ;i < n;i++)
{
if(num[i] < num[i+])
ans = max(ans,r_len[i] + l_len[i+]);
}
printf("%d",ans);
return ;
}

 E. Nearest Opposite Parity

题目意思: 这题的题目意思比较简单,主要是给你一组数组,每个数字可以往两个方向走,就如下标 i ,如果 i + num[i] <= n 的话,那么就可以判断 num[i+num[i]]  的奇偶性是不是一样的,如果是的话话,就可以终止了,但是我们需要求每个数找到不同奇偶性的最小数就可以了。

题目分析: 这题分析下去就是一个道搜索题,当你在数字 num[i] 时,你可以往两个方向走,如果可以走的话,一是往 i + num[i] 的方向走,二是往 i - num[i] 的方向走,因为要往两个方向走,并且要找最优解,防止超时,所以选bfs来进行搜索是比较好的。我一开始按照正常的思路,模拟题目所讲的进行搜索,循环遍历数组,每个数再搜索,但很遗憾超时了,虽然我也觉得会超时。后来问了一个大佬,在经过几分钟的讲解之后,我终于知道怎么做了。这里可以反向建边,我们假设每个数字走 i + num[i] 和 i - num[i],如果可以走的话,并且所走的那个数字与num[i] 的奇偶性不一样才有效,将可以立马找到的点作为起点,就是将下标放进队列里。这里我们用vector存边,也就是说  v[i] 里面存的是下标 i 可以到的边,因为这里建立的是反向边,所以就是所有 v[i] 里面的数可以到达 i。解决了这些问题,我们就可以来看一下怎么搜索了。

这上面的分析中,我们可以知道队列里面已经放进去了路径为 1的下标,这也意味着说,剩下的下标肯定是路径超过了 1,所以我们可以从队列中的起点出发,向外面延伸,就比如下标1属于起点,那么如果在v[1]中有数字的话,比如有下标5,也就是说下标 5 可以到达下标 1,如果ans[5] == -1( ans数组是存储答案的数组,并且赋初值为-1),那就说明 num[5] 与 num[1] 的奇偶性肯定是一样的,因为如果不是相同的话,那他们之间的路径肯定是1了,但是这与 ans[5] = -1 相矛盾,所以奇偶性相同,又因为下标1可以一步找到奇偶性不一样的数字,所以ans[5] = ans[1] + 1了,所以相类似的了。

所以这样就保证了奇偶性。

下面看代码:

 #include <iostream>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <queue> using namespace std;
const int ma = 2e5 + ;
int n,num[ma],dep[ma];
vector<int> v[ma];
queue<int> q; void bfs()
{
int a;
while(!q.empty())
{
a = q.front(),q.pop();
for(int i = ;i < v[a].size();i++)
if(dep[v[a][i]] == -)
dep[v[a][i]] = dep[a] + ,q.push(v[a][i]);
}
}
int main()
{
scanf("%d",&n);
for(int i = ;i <= n;i++)
scanf("%d",&num[i]);
int next1,next2;
for(int i = ;i <= n;i++)
{
next1 = next2 = ;
dep[i] = -;
if(i + num[i] <= n)
next1 = i + num[i];
if(i - num[i] >= )
next2 = i - num[i];
if(next1)
v[next1].push_back(i);
if(next2)
v[next2].push_back(i);
if((next1 && num[i]% != num[next1]%) || (next2 && num[i]% != num[next2]%))
dep[i] = ,q.push(i);
}
bfs();
for(int i = ;i <= n;i++)
printf("%d ",dep[i]);
return ;
}

  

codeforce Round #605(Div.3)的更多相关文章

  1. codeforce round #467(div.2)

    A. Olympiad 给出n个数,让你找出有几个非零并且不重复的数 所以用stl的set //#define debug #include<stdio.h> #include<ma ...

  2. codeforce round#466(div.2)C. Phone Numbers

    C. Phone Numbers time limit per test2 seconds memory limit per test256 megabytes inputstandard input ...

  3. codeforce round#466(div.2) B. Our Tanya is Crying Out Loud

    B. Our Tanya is Crying Out Loud time limit per test1 second memory limit per test256 megabytes input ...

  4. Codeforce Round #555 Div.3 D - N Problems During K Days

    构造题 话说挺水的题..当时怎么就WA到自闭呢.. 先把每个位置按照最低要求填满,也就是相差1..然后从最后一位开始把剩下的数加上,直到不能加为止. #include <bits/stdc++. ...

  5. Codeforce Round #554 Div.2 C - Neko does Maths

    数论 gcd 看到这个题其实知道应该是和(a+k)(b+k)/gcd(a+k,b+k)有关,但是之后推了半天,思路全无. 然而..有一个引理: gcd(a, b) = gcd(a, b - a) = ...

  6. Codeforce Round #554 Div.2 D - Neko and Aki's Prank

    dp 找规律 我好菜啊好菜啊,完全没有思路. 在合法的括号序列中,左括号数一定大于等于右括号数的,所以我们可以先定义平衡度为左括号数-右括号数. 然后可以发现一个惊人的规律..就是在trie同一深度上 ...

  7. 「日常训练」Skills(Codeforce Round #339 Div.2 D)

    题意(CodeForces 614D) 每个人有\(n(n\le 10^5)\)个技能,技能等级都在\([0,10^9]\)的范围,每个技能有一个当前等级,所有技能的最高等级都为A.一个人的力量被记做 ...

  8. 「知识学习&日常训练」莫队算法(一)(Codeforce Round #340 Div.2 E)

    题意 (CodeForces 617E) 已知一个长度为\(n\)的整数数列\(a[1],a[2],-,a[n]\),给定查询参数\(l,r\),问\([l,r]\)内,有多少连续子段满足异或和等于\ ...

  9. Codeforce Round #574(Div.2)

                                                                                                        ...

随机推荐

  1. LFM oversea投资笔记、思摩尔、移卡、建业新生活、鑫苑物业

    LFM oversea 1.公司简介 2.业务展望 3. 投资策略 LFM oversea介绍 LFM oversea是在开曼成立的投资基金, 专注于中国优质企业在香港和美国IPO过程中的 基石.锚定 ...

  2. luogu P2183 [国家集训队]礼物

    LINK:礼物 n个物品 m个人 每个人要分得wi 个物品 每个物品互异 分给每个人的物品不分顺序 求方案数. \(n,p\leq 1e9 m\leq 5\) 方案数 那显然是 第一个人拿了w1件物品 ...

  3. 海华大赛第一名团队聊比赛经验和心得:AI在垃圾分类中的应用

    摘要:为了探究垃圾的智能分类等问题,由中关村海华信息研究院.清华大学交叉信息研究院以及Biendata举办的2020海华AI垃圾分类大赛吸引了大量工程师以及高校学生的参与 01赛题介绍 随着我国经济的 ...

  4. 一个轻量级的基于RateLimiter的分布式限流实现

    上篇文章(限流算法与Guava RateLimiter解析)对常用的限流算法及Google Guava基于令牌桶算法的实现RateLimiter进行了介绍.RateLimiter通过线程锁控制同步,只 ...

  5. 关于c/c++指针,指针的指针

    伪军迷祝:建军节快乐! 当调用一个函数时,实际上入参使用的都是副本(除非是引用),指针也不例外.举个例子如: void func(int a, int * p); 当调用func时无论是a还是p其实传 ...

  6. 【Canal】互联网背景下有哪些数据同步需求和解决方案?看完我知道了!!

    写在前面 在当今互联网行业,尤其是现在分布式.微服务开发环境下,为了提高搜索效率,以及搜索的精准度,会大量使用Redis.Memcached等NoSQL数据库,也会使用大量的Solr.Elastics ...

  7. 【FZYZOJ】下片 题解(最短路+超级源点)

    题目描述 为了提高服务器的耐受能力,很多流量大的网站都会架设多台服务器,而互联网的路由能找到线路最短的一台服务器. 现在UOI想要下片,他有好多台电脑,又有好多服务器可以提供下载.UOI将给你一个网络 ...

  8. 25-Object类的使用

    1.java.lang.Object类的说明: * 1.Object类是所Java类的根父类 * 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object ...

  9. 005_go语言中的for循环

    代码演示 package main import "fmt" func main() { i := 1 for i <= 3 { fmt.Println(i) i = i + ...

  10. ElasticSearch 7.8.1 从入门到精通

    学前导读 ElasticSearch对电脑配置要求较高,内存至少4G以上,空闲2G内存,线程数4018+ 学习的时候,推荐将ElasticSearch安装到Linux或者mac上,极度不推荐装Wind ...