acwing----春季每日一题2022篇(五)
春季每日一题2022篇(五)
- 牛奶桶(完全背包)
- 钻石收藏家(树状数组)
- 方法一:树状数组
- 方法二:双指针
- 马拉松(枚举)
- 奶牛线路
- 删减(字符串操作)
- 哞加密
牛奶桶(完全背包)
题目链接:牛奶桶
解题思路
这题我们可以将容积最大的桶看成是容积为M的一个背包。另外两个桶我们可以看成是价值和花费相同的两个物品,由于没有物品数量的限制,因此这题就抽像为了一个有两个物品无限次数取,放入容积为M的背包的最大价值。
代码
#include<iostream>
using namespace std;const int N = 1010;int f[N] , v[2] , c[2];int main(){int a ,b,m;cin>>a>>b>>m;v[0] = c[0] = a , v[1] = c[1] = b;for(int i = 0 ; i < 2 ; ++i){for(int j = c[i] ; j <= m; ++j)f[j] = max(f[j] , f[j-c[i]] + v[i]);}cout<<f[m]<<endl;return 0;
}
钻石收藏家(树状数组)
题目链接:钻石收藏家
方法一:树状数组
解题思路
我们以砖石的尺寸来建立树状数组,也就是我们树状数组的作用是记录该值出现的个数。所以我们通过数组数组得到的是 1 ~n 范围内的值有多少个?那么我们只需在建立完之后,遍历一遍所有取值范围取max即可得到答案、
代码
#include<iostream>
#include<cstring>
using namespace std;const int N = 2e4 + 10 , M = 1e4 ;int n , k ,ans;
int t[N];
int lowbit(int x){ return x & -x;}int get(int n){int ans = 0;for( ; n ; n -= lowbit(n)) ans += t[n];return ans ;
}void add(int n , int val){for( ; n < N ; n += lowbit(n) ) t[n] += val;
}int main(){cin>>n>>k;for(int i = 1 ; i <= n ; ++i){int x;cin>>x , add(x , 1);}for(int i = 1 ; i <= M ; ++i)ans = max(ans , get(i + k) - get(i-1));cout<<ans<<endl;return 0;
}
方法二:双指针
解题思路
双指针类似于维护一个满足条件的窗口,我们所要求的就是这个窗口的最大长度是多少?
对于一般的双指针问题,我们都需要数据是单调的因此我们要对存的值排一个序,同时我们要证明指针具有单调性, 我们 j = f [ i ] j = f[i] j=f[i]的含义是i定之后,最靠左的一个位置,也就是 q [ i ] − q [ j ] < = k q[i] - q[j] <=k q[i]−q[j]<=k
我们利用反证法证明一下,如下图
如果i‘对应的左端为j’ ,那么我们得到,j - j’ 也是小于k的,那么i 的左端明显是j’更优,那么这就与i的左端是j矛盾了。
代码
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;const int N = 2e4 + 10 , M = 1e4 ;int n , m , ans;
int q[N];int main(){cin>>n>>m;for(int i = 0 ; i < n ; ++i)cin>>q[i];sort(q , q + n);for(int i = 0 , j = 0 ; i < n ; ++i){while(q[i] - q[j] > m )j++;ans = max(ans , i - j + 1);}cout<<ans<<endl;return 0;
}
马拉松(枚举)
题目链接:马拉松
解题思路
我们在输入的时候先求出总的花费,之后我们枚举去掉的点的情况,也就是O(n)的复杂度来枚举我们跳过的点是哪一个?如果我们跳过,花费会如何变化呢?
如上图,我们如果跳过圈出来的点,那么我们就会减去前一个点到其的距离 和其跳到后一个点的距离,同时加上 前一个点到后一个的距离。
代码
#include<iostream>
#include<set>
#include<cmath>
using namespace std;
typedef pair<int,int>PII;
typedef long long LL;
#define x first
#define y second
const int N = 1e5 + 10 , INF = 0x3f3f3f3f;
int n ;PII bar[N] ;LL getd(PII a , PII b){return abs(a.x - b.x) + abs(a.y - b.y);
}int main(){cin>>n;LL sum = 0 , mix = INF;for(int i = 0 ; i < n ; ++i){ cin>>bar[i].x>>bar[i].y ;if(i)sum += getd(bar[i] , bar[i-1]);}for(int i = 1 ; i < n - 1 ; ++i)mix = min(mix , sum - getd(bar[i-1] ,bar[i]) - getd(bar[i] ,bar[i+1]) + getd(bar[i-1] ,bar[i+1]));cout<<mix <<endl;return 0;
}
奶牛线路
题目链接:奶牛路线
解题思路
由于限制了只能是单条路线,因此我们记录如果在一个航线中出现了起点之后如果还出现了终点我们就更新花费取最小值。如果最终没有单单通过一条能到达的,那么ans 值为是INF。
代码
#include<iostream>using namespace std;const int N = 510 , INF = 0x3f3f3f3f;int A ,B,n;
int ans = INF;int main(){cin>>A>>B>>n;for(int i = 0 ; i < n ; ++i){int c , m , flag = 0;cin>>c>>m;while(m--){int x;cin>>x;if(x == A) flag ++ ;if(flag && x == B) ans = min(ans , c);}}if(ans == INF)ans = -1;cout<<ans<<endl;return 0;
}
删减(字符串操作)
题目链接:删减
解题思路
暴力的话就不讲了,这里讲下字符串操作中的优化操作。
- 首先如果我们直接按题意来,每一次删完又从头开始由于find和 erase操作的复杂度是0(n)会导致超时,那么我们可以用一个字符串res来存s中的字符,我们知道只有当res长度>= sub子串的长度时才可能有子串出现,并且由于我们是一边存的,所以出现相同的子串只可能在res的尾部,因此我们知道子串可能出现的位置后,就可以将找子串的函数从find 变成 substr ,
- 同时由于循环中多次需要字符串的长度因此对于定长的两个字符串我们先将其长度记录下来。
代码
#include<iostream>
#include<string>
using namespace std;string s , sub , res;int main(){cin>>s>>sub;int lens = s.size() , lsb = sub.size();for(int i = 0 ; i < lens ; ++i){res += s[i];int ln = res.size();if(ln >= lsb &&res.substr(ln - lsb) == sub ){res.erase(res.end() - lsb , res.end());}}cout<<res<<endl;return 0;
}
哞加密
题目链接:哞加密
解题思路’
- 题意转化:一般来说我们都要将题意抽象出来才能更好的解决问题。这题因为映射关系是随机的且不重复的。因此只要出现形如:ABB型的字符串,我们都能将其转化为MOO , 因此这题就转化成了统计出现次数最多的形如ABB的字符串数量,因为到时候我们将这个字符串与MOO建立映射关系就可以了。
- 限制:由于题目中说了,自己不能映射到自己,所以如果ABB型的字符串是MOO就是不可以的。
- 实现:由于有八个方向,所以我们枚举每一个点,之后以这个点,沿着八个方向得到三个字符,然后如果满足ABB型和限制条件就用哈希表存储起来。
技巧
- 八个方向的数组变量:
如果图的原点是在左下角则是:int dx[8] = {-1,-1,-1,0,1,1,1,0} , dy[8] = {1,0,-1,-1,-1,0,1,1};
如果是左上角,则是:int dx[8] = {-1, -1, -1, 0, 1, 1, 1, 0}; int dy[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
- 对于字符变量转化为string类型的时候,可以直接利用:
string s(1,g[x][y]);
:表示长度为1,字符全是g[x][y]的字符串,这不就转化了嘛! - 对于hash表的遍历:
for(auto [k,v] : hs)mx = max(mx , v);
acwing----春季每日一题2022篇(五)相关推荐
- acwing----春季每日一题2022篇(二)
春季每日一题2022篇(二) 三角形(枚举) 社交距离 I (分类讨论 + 贪心) 混合牛奶(模拟) 果壳游戏(模拟 + 技巧) 困牛放牧(分类 + 数学知识) 三角形(枚举) 题目链接 题目大意 题 ...
- acwing----春季每日一题2022篇(一)
春季每日一题第一周题解 你知道你的ABC吗(推理) 放养但没有完全放养(贪心) 牛年(模拟) 牛的学术圈 I(前缀和 + 技巧) 奶牛体操(思维 + 图论) 你知道你的ABC吗(推理) 题目链接 解题 ...
- AcWing春季每日一题 Week1
文章目录 1.AcWing 3346. 你知道你的ABC吗 2.AcWing 3358. 放养但没有完全放养 3.AcWing 3370. 牛年 4.AcWing 3745. 牛的学术圈 I 5.Ac ...
- 春季每日一题2022 Week 2 【完结】
目录 1671. 三角形[暴力] 1659. 社交距离 I[二分] 1714. 混合牛奶[模拟] 1695. 果壳游戏[枚举] 1671. 三角形[暴力] #include<bits/stdc+ ...
- 春季每日一题2022 Week 1 【完结】
目录 3346. 你知道你的ABC吗[排序] 3358. 放养但没有完全放养[贪心] 3370. 牛年[模拟] 3745. 牛的学术圈 I[二分] 1459. 奶牛体操[暴力] 1442. 单词处理器 ...
- Acwing春季每日一题 混合牛奶(朴素做法和优化做法)
感谢大佬们的点赞Orz\color{purple}{感谢大佬们的点赞~Orz}感谢大佬们的点赞 Orz 题目描述 农业,尤其是生产牛奶,是一个竞争激烈的行业. Farmer John 发现如果他不在牛 ...
- AcWing寒假每日一题2058. 笨拙的手指
AcWing寒假每日一题2058. 笨拙的手指 题目描述 奶牛贝茜正在学习如何在不同进制之间转换数字. 但是她总是犯错误,因为她无法轻易的用两个前蹄握住笔. 每当贝茜将数字转换为一个新的进制并写下结果 ...
- AcWing寒假每日一题
**此文章持续更新,直至寒假没有每日一题!!!! 习题目录 Week 1: 货仓选址 数字三角形 Week 2 蛇形矩阵 红与黑 回文平方 剪绳子 分巧克力 校门外的树(简单暴力法) 奖学金 十三号星 ...
- 每日一题 —— Java篇
目录 1.在线编程网站 2.每日一题 - 俩数之和 在这个不断发展的信息化时代,各个领域各个专业的人才越来越拔尖,如何做 到在人群之中凸显出来就变得尤为重要,作为一名程序员对于算法要精通,尤 其想要入 ...
最新文章
- kubeasz_使用kubeasz安装K8S集群,不受国内网络环境影响
- java夯实基础:final脑图
- wpf每隔一小时_包河区徐河排涝站24小时不间断运作 11座区管泵站全面应战保安澜...
- 如何出色的研究 RGSS3 (三) 形式的调整的细节
- 第八天2017/04/17(1、拷贝构造、❤临时对象)
- c++STL容器的priority_queue
- Java知识点详解 4 泛型
- 使用vSphere Power Cli初始化数据中心
- 面试题-JQuery里Ajax的原理是怎样的?
- 输入1-53周,输出1-53周的开始时间和结束时间
- 背景色渐变html代码,求html文字背景色渐变的代码
- 在浏览器上打开swf文件时变成了下载swf文件解决方式
- 在linux下如何修改DNS地址
- 阿里云RDS的内存一直增加
- vue2/vue3详细知识点
- 京东数科前端岗位面历
- CUDA——Python基础与实现
- 迅雷向链享云售让部分区块链业务:包括链克与链克商城
- mathcad入门一
- Python爬虫基础入门