A - 369

题意:

给定A和B,求有多少个x可以和A,B构成等差数列

思路:

分三种情况讨论

  1. A == B

    则x不得不与A和B想等
  2. x位于A和B中间

    只有B - A 为偶数才有这种情况存在
  3. x位于A和B两边

    可以在左边也可以在右边,只要A!=B这种情况总会存在
void solve()
{
int a = read(), b = read(); if(a == b){
cout<<1<<endl;
}else {
if((b-a)&1){
cout<<2<<endl;
}else {
cout<<3<<endl;
}
}
}

B - Piano 3

题意:

高桥有一架钢琴,上面有 \(100\) 个排成一行的琴键。从左边开始的 \(i\) 个键叫做 \(i\) 个键。

他会逐个按下 \(N\) 个键来弹奏音乐。在按下 \(i\) /th键时,如果 \(S_i=\) L,他会用左手按下 \(A_i\) 键,如果 \(S_i=\) R,则用右手按下 \(A_i\) 键。

开始演奏前,他可以将双手放在任何他喜欢的键上,此时他的疲劳度为 0。在演奏过程中,如果他将一只手从键 \(x\) 移到键 \(y\) 上,疲劳度会增加 \(|y-x|\) (反之,除了移动手以外,疲劳度不会增加)。用手按下某个键时,该手必须放在该键上。

找出表演结束时可能的最低疲劳度。

思路:

考虑到

  • \(1 \leq N \leq 100\)
  • \(1 \leq A_i \leq 100\)

直接暴力枚举每个按键为初始按键,左右手各枚举100个键,再遍历n遍,最高1e6

代码:

void solve()
{
int n = read();
vector<pair<int,char> > v;
for(int i=0;i<n;i++){
int a = read();
char c; cin>>c;
v.push_back({a,c});
} int ans = INF;
for(int i=1;i<=100;i++) for(int j=1;j<=100;j++){
int ret = 0, l = i, r = j;
for(auto it:v){
if(it.se == 'L'){
ret += abs(l - it.fi);
l = it.fi;
}else {
ret += abs(r - it.fi);
r = it.fi;
}
}
ans = min(ret,ans);
} cout<<ans<<endl; }

C - Count Arithmetic Subarrays

题意:

给一个长度为n的序列,求能构成等差数列的子序列的个数

思路:

  • 显然每个长度为1和长度为2的子序列都能构成等差数列,所以答案至少是 \(n+(n-1)\)
  • 再去找每个长度大于等于3并且能构成等差数列的子序列,长度为n的等差数列子序列能拆分成 \(1+2+3+...+n\) 个等差子序列,去除已经计算的长度为1和2的子序列,能拆分成 \(1+2+3+...+(n-2)\)个
  • 找等差子序列的过程类似于滑动窗口,维护 \(l\) 和 \(r\) 两个指针即可

代码:

void solve()
{
int n = read();
vector<int> v;
for(int i=0;i<n;++i) v.emplace_back(read()); int ans = n + n - 1;
if(n <= 2){
cout<<ans<<endl;
return;
}
int l = 0 , r = 1 , d = v[r] - v[l];
bool flag = 0;
while(r < n && l < n){
int dt = v[r] - v[r-1];
if(dt == d){
flag = 1;
}else {
flag = 0;
if(r - l > 2){
int t = r - l - 2;
ans += (t+1)*t/2;
}
l = r - 1;
d = v[r] - v[l];
}
r++;
}
if(r - l > 2 && flag){
int t = r - l - 2;
ans += (t+1)*t/2;
}
cout<<ans<<endl;
}

D - Bonus EXP

题意:

给一个长度为n的序列,在序列中从前往后取数。对于序列中的每个数,可以取也可以不取。对于所有取了的数,将所有第偶数次取的数乘2,再将所有取了的数求和,求该如何取数使这个和最大

思路:

线性dp

  • 对于序列中每个数和上一个数之间的关系,只有取的次序是奇数还是偶数对该数有影响
  • 所以只需要维护取到每个数的两种状态值,即到奇数次还是偶数次
    • 奇数次:

      1. 上一个数是偶数次,本次取这个数
      2. 上一个数是奇数次,本次不取
    • 偶数次:
      1. 上一个数是奇数次,本次取这个数
      2. 上一个数是偶数次,本次不取
  • 状态转移方程:

    dp[i][0] = max(dp[i-1][1] + 2*v[i], dp[i-1][0]); //偶数次

    dp[i][1] = max(dp[i-1][0] + v[i], dp[i-1][1]); //奇数次

代码:

void solve()
{
int n = read();
vector<int> v;
for(int i=0;i<n;++i) v.emplace_back(read()); vector<vector<int> > dp(n,vector<int>(2));
dp[0][1] = v[0];
dp[0][0] = 0;
for(int i=1;i<n;i++){
dp[i][0] = max(dp[i-1][1] + 2*v[i], dp[i-1][0]);
dp[i][1] = max(dp[i-1][0] + v[i], dp[i-1][1]);
} int ans = max(dp[n-1][1],dp[n-1][0]); cout<<ans<<endl;
}

E - Sightseeing Tour

题意:

给 \(N\) 个顶点和 \(M\) 条边,在给 \(Q\) 次询问,每次询问从1到n的最短距离,且必须经过 \(k\) 个指定的边

思路:

floyd + 全排列

  • 用邻接矩阵存图,floyd预处理每个顶点之间的距离
  • next_permutation()全排列给出的 \(k\) 个边,这样遍历每个边的经过顺序
  • 再遍历每个边的入度出度的方向,有 \(k\) 个边,则有 \(2^k\) 种情况,所以我们用一个num的二进制的每一位来存每个边的方向,num从 \(0\) 遍历到 \(2^k - 1\)
struct node{
int u,v,t;
};
int dis[N][N]; void solve()
{
int n = read(), m = read();
memset(dis,0x3f,sizeof(dis)); //dis无穷大
vector<node> edge(m+1); for(int i=1;i<=n;i++) dis[i][i] = 0; for(int i=1;i<=m;i++){
int u = read(), v = read(), t = read();
edge[i] = {u,v,t};
dis[u][v] = min(dis[u][v],t); //两个岛屿有可能被不止一座桥直接连接起来
dis[v][u] = min(dis[v][u],t);
} for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){
dis[i][j] = min(dis[i][j],dis[i][k] + dis[k][j]);
} int q = read();
while(q--){
int k = read();
vector<int> B;
for(int i=0;i<k;i++) B.push_back(read());
int ans = MAX;
do{ //全排列岛屿顺序
for(int num=0;num<(1<<k);num++){ //全排列岛屿方向
int cur = 1, tot = 0;
for(int i=0;i<k;i++){
int u = edge[B[i]].u, v = edge[B[i]].v, t = edge[B[i]].t;
if((num>>i) & 1) swap(u,v);
tot += dis[cur][u] + t;
cur = v;
}
tot += dis[cur][n];
ans = min(ans,tot);
}
}while(next_permutation(B.begin(),B.end()));
cout<<ans<<endl;
}
}

F - Gather Coins

思路:

  • 第一维排序,第二维度LIS
  • 用二分或树状数组优化LIS,达到 \(O(nlogn)\) 复杂度

G - As far as possible

思路:

  • 行走的长度 为 \(根到顶点的每个路径的集合的总权值*2\)
  • 树剖-长链剖分,每个顶点指向最深的叶子顶点

AtCoder Beginner Contest 369 补题记录的更多相关文章

  1. AtCoder Beginner Contest 068 ABCD题

    A - ABCxxx Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement This contes ...

  2. AtCoder Beginner Contest 053 ABCD题

    A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...

  3. AtCoder Regular Contest 151补题

    AtCoder Regular Contest 151 A. Equal Hamming Distances 简单题,注意下答案需要字典序最小即可 #include<bits/stdc++.h& ...

  4. Yahoo Programming Contest 2019 补题记录(DEF)

    D - Ears 题目链接:D - Ears 大意:你在一个\(0-L\)的数轴上行走,从整数格出发,在整数格结束,可以在整数格转弯.每当你经过坐标为\(i-0.5\)的位置时(\(i\)是整数),在 ...

  5. AtCoder Beginner Contest 069 ABCD题

    题目链接:http://abc069.contest.atcoder.jp/assignments A - K-City Time limit : 2sec / Memory limit : 256M ...

  6. AtCoder Beginner Contest 050 ABC题

    A - Addition and Subtraction Easy Time limit : 2sec / Memory limit : 256MB Score : 100 points Proble ...

  7. AtCoder Beginner Contest 070 ABCD题

    题目链接:http://abc070.contest.atcoder.jp/assignments A - Palindromic Number Time limit : 2sec / Memory ...

  8. AtCoder Beginner Contest 051 ABCD题

    A - Haiku Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement As a New Yea ...

  9. AtCoder Beginner Contest 057 ABCD题

    A - Remaining Time Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Dol ...

  10. AtCoder Beginner Contest 220部分题(G,H)题解

    刚开始的时候被E题卡住了,不过发现是个数学题后就开始使劲推式子,幸运的是推出来了,之后的F题更是树形DP换根的模板吧,就草草的过了,看了一眼G,随便口胡了一下,赶紧打代码,毕竟时间不多了,最后也没打完 ...

随机推荐

  1. 从汇编层解读Golang的闭包实现:逃逸分析与性能影响

    本文精心梳理了一系列面试中具有一定难度的高频Golang问题,其中部分知识点可能你之前未曾深入探究,然而它们却在面试和实际工作中至关重要. 包括:Golang的基础语法.并发模型.内存管理等核心知识点 ...

  2. LCP 06. 拿硬币

    地址:https://leetcode-cn.com/problems/na-ying-bi/ <?php /** * Class Solution * 桌上有 n 堆力扣币,每堆的数量保存在数 ...

  3. 晶振测试仪GDS-80系列参数

    晶振测试仪GDS-80系列 一.产品简介 晶振测试仪GDS-80系列是高性价比的晶振测试系统,采用网络分析技术,实现智能化测量,符合IEC-444标准.测量频率范围10KHz-200KHz,1MHz- ...

  4. MSBuild属性

    MSBuild 属性 MSBuild属性是键值对的集合,提前声明好这些属性之后,整个项目的生成都可以引用这些属性. 属性名不区分大小写. 属性都是写在 PropertyGroup 标签中. 1.声明属 ...

  5. 三分钟掌握音视频处理 | 在 Rust 中优雅地使用 FFmpeg

    前言 音视频处理看似高深莫测,但在开发中,我们或多或少都会遇到相关需求,比如视频格式转换.剪辑.添加水印.音频提取等. FFmpeg 作为行业标准,几乎无所不能,很多流行的软件(如 VLC.YouTu ...

  6. Laravel11 从0开发 Swoole-Reverb 扩展包(二) - Pusher 协议介绍

    Pusher 协议概述 Pusher 协议 是一种用于实时 Web 通信的协议,它基于 WebSocket 技术,并提供了一套 发布-订阅(Pub/Sub)模式,用于让客户端(如浏览器.移动端.后端服 ...

  7. linux tmux 使用教程

    前言 Tmux 是一个终端复用器(terminal multiplexer),非常有用,属于常用的开发工具. 本文介绍如何使用 Tmux. 一.Tmux 是什么? 1.1 会话与进程 命令行的典型使用 ...

  8. selenium自动化测试入门

    Selenium是一个基于浏览器的自动化测试工具,它提供了一种跨平台.跨浏览器的端到端的web自动化解决方案. Selenium是用于自动化控制浏览器做各种操作,打开网页,点击按钮,输入表单等等,可以 ...

  9. 哈希表(实现 Python 中的集合 set)

    博客地址:https://www.cnblogs.com/zylyehuo/ # -*- coding: utf-8 -*- class LinkList: class Node: def __ini ...

  10. 从上下文切换谈thread_local工作原理

    从上下文切换谈thread_local工作原理 thread_local是什么 熟悉多线程编程的小伙伴一定对thread_local不陌生,thread_local 是 C++11 引入的一种存储类说 ...