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. PHP strtotime() 函数

    ------------恢复内容开始------------ 实例 将任何字符串的日期时间描述解析为 Unix 时间戳: <?php // 设置时区 date_default_timezone_ ...

  2. luogu P6087 [JSOI2015]送礼物 二分 单调队列 决策单调性

    LINK:送礼物 原本想了一个 \(nlog^2\)的做法 然后由于线段树常数过大 T到30. 以为这道题卡\(log^2\)没想到真的有神仙写\(log^2\)的过了 是我常数大了 抱歉. 能过的\ ...

  3. 5.20 省选模拟赛 T1 图 启发式合并 线段树合并 染色计数问题

    LINK:图 在说这道题之前吐槽一下今天的日子 520 = 1+1+4+514. /cy 这道题今天做的非常失败 一点分都没拿到手 关键是今天的T3 把我整个人给搞崩了. 先考虑 如果得到了这么一张图 ...

  4. PHP+Redis链表解决高并发下商品超卖问题

    目录 实现原理 实现步骤 上一篇文章聊了一下使用Redis事务来解决高并发商品超卖问题,今天我们来聊一下使用Redis链表来解决高并发商品超卖问题. 实现原理 使用redis链表来做,因为pop操作是 ...

  5. 8月1日起全部无版号游戏下架,ios手游想上架看这里!

      在苹果至中国游戏开发者的邮件中声明:如果开发者不能在7月31日前提交版号及相关文件,付费游戏将不可以在中国AppStore供应.也就是说:   从8月1日开始,苹果将正式下架全部.所有的ios付费 ...

  6. SeekBar滑动时,progress数值不连续

    问题描述 logcat 你是否也遇见过这样的情况,SeekBar的进度不连续 这是我在做一个编辑图片的APP时,观察我打印的log,发现progress不是连续的 这时候可能就有人问:是你代码写的不对 ...

  7. TF签名 外部测试 内部测试 TestFlight

    1.将release包传到iTunes connect 2. 绿线是内部测试 A.需要添加测试员 B.最多25个测试员 C.提交到iTunes connect不需要等待审核,即可测试 红线是外部测试( ...

  8. Flink中的window、watermark和ProcessFunction

    一.Flink中的window 1,window简述  window 是一种切割无限数据为有限块进行处理的手段.Window 是无限数据流处理的核心,Window 将一个无限的 stream 拆分成有 ...

  9. 18、Java中的 数据结构

    Java2中引入了新的数据结构 集合框架 Collection,下一节再谈论(非常重要,面试也常问). 1.枚举 (Enumeration) 1.1 Enumeration 源码: public in ...

  10. C#LeetCode刷题之#641-设计循环双端队列(Design Circular Deque)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4132 访问. 设计实现双端队列. 你的实现需要支持以下操作: M ...