day1二分
比较难的一道二分题,我们可以设x为一共扔出的次数,也就是说进行了x次扔出k个球的操作,那么扔出的球就是k*x个
接下来,假设每一种球有n中,那我们最多扔出的该颜色球就是min(x,n)个,只用检查扔出所有球的个数和kx的大小关系即可
123456789101112131415161718192021222324252627282930#include<bits/stdc++.h>using i64=long long;#define rep(i,a,n) for(i64 i=(a);i<=(n);i++)#define per(i,a,n) for(i64 i=(n);i>=(a);i--)#define mst(a,x) memset(a,x,sizeof(a))using namespace std;const int N = 2e5 + 9;i64 a[N], n, k, nw;bool check(i64 x){ nw = 0; rep(i, 1, n) nw += min(x, a[i]); if(nw / k >= x) { ...
cf_920_div3
昨天就睡了三个小时,没打这次的cf,今早来补题了
这次比较简单,觉得前两题没什么好写的
C
在关机开机和一直开机里取最优,然后贪心模拟,如果小于等于0就不可以,反之OK
123456789101112131415161718192021222324252627282930#include<bits/stdc++.h>using i64=long long;#define rep(a,n) for(i64 i=(a);i<=(n);i++)#define per(a,n) for(i64 i=(n);i>=(a);i--)#define mst(a,x) memset(a,x,sizeof(a))const int INF=0x3f3f3f3f,N=12;using namespace std;void solve(){ i64 n,f,a,b;cin>>n>>f>>a>>b; vector<i64>v(n+1); for(int i=1;i<=n;i++)cin>>v[i]; ...
cf-916-div3
A
模拟
1234567891011121314151617181920212223242526#include<bits/stdc++.h>using namespace std;using i64=long long;const int N=2e5+10;void solve(){ int cnt[27]={0}; int n;cin>>n; string s;cin>>s; for(int i=0;i<s.size();i++){ cnt[s[i]-'A'+1]++; } int ans=0; for(int i=1;i<=26;i++){{ if(cnt[i]>=i)ans++; } }cout<<ans<<'\n';}int main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); int _; ...
cf-915-div2
A
两者取大
12345678910111213#include<bits/stdc++.h>using namespace std;using i64=long long;void solve(){ int n,m;cin>>n>>m; int mx=max(n,m); cout<<mx<<'\n';}int main(){ int _;cin>>_; while(_--)solve(); return 0;}
B
发现每次可以消去两个叶子结点,如果只剩一个需要多一次操作,记录叶子结点个数然后分奇偶
123456789101112131415161718192021222324252627282930313233#include<bits/stdc++.h>using namespace std;using i64=long long;const int N=2e5+10;vector<int>g[N];void solve() ...
ABC333
A
12345678910111213141516#include<bits/stdc++.h>using namespace std;using i64=long long;void solve(){ int n;cin>>n; string s=""; for(int i=1;i<=n;i++){ s+=to_string(n); } cout<<s;}int main(){ int _=1; while(_--)solve(); return 0;}
B
12345678910111213141516171819202122#include <iostream>using namespace std;int sa (char x,char y){ if(x > y) swap(x, y); if(y-x == 1 || y-x == 4){ return 1; } else return 2;& ...
day3
今天做这道题唯一的感觉就是,条件真的多。第一次读了假题,没注意到邮票不能旋转,还说这道题为什么这么难。
其实就是一道很简单的二位前缀和以及差分题
先求一个前缀和可以O(1)查询所有的邮票能不能放下,在所有可以放邮票的位置都放邮票,diff相当于是放邮票的次数的前缀和,最后再用一个前缀和求哪些地方是没有放过邮票的,如果这个点同时不是被占据的那么就不可以。反之返回true。
1234567891011121314151617181920212223242526272829303132333435class Solution {public: bool possibleToStamp(vector<vector<int>>& grid, int h, int w) { int m=grid.size(); int n=grid[0].size(); vector<vector<int>>diff(m+2,vector<int>(n+2,0)); ...
day2
今天leetcode题实在太简单,所以就做一道蓝桥题吧
先看数据范围-1e5
先杜绝一切暴力想法。开始分解问题。很明显可以转化为前缀和的差值为k的倍数。
得到pre[i]-pre[j-1]%k==0寻找所有的i和j,O(n2)很明显会超时。
转化一下问题,我们知道一个数%k最多有0~k-1一共k种可能。
得到pre[i]%k==pre[j-1]%k,也就是说这两者的前缀和%k得到的余数相同,那我们很容易想到用一个哈希去存然后计数(记得开ll!)
是非成败转头空,不开long long见祖宗!
余数为零的第一次只要自己一个数就可以作为答案区间,剩下都需要至少两个,所以>=2才第一次++
除余数为0以外都需要两个数组合,所以从第二个开始计数,并且每次新找到一个余数为k的数都可以和原来找到的cnt[k]个元素组合,所以ans加上上一次cnt[k]里面的个数就可以
123456789101112131415161718192021222324#include<iostream>using namespace std;usin ...
day1
今日开始,更新每日一题系列
主要是leetcode上的每日一题,如果某天闲时间多会有洛谷或者cf/atcoder的题
当然如果有比赛的话,题解还是会正常发布的
今天这道题可以说是一道很经典的具有单调栈特征的题
我们都很清楚如何找一个数的下一个比他大的元素,这时一道很经典的单调栈题目,但这道题升级到了找第二个比自身大的元素。
很显而易见,我们还是使用单调栈的思想解决这个问题。
假如只有一个单调栈,我们找到了某个元素的第一个比他大的元素,不妨回忆一下这个过程。我们维护一个单调递减的栈,当遍历到当前元素大于栈顶,我们会一直出栈直到栈顶元素大于等于当前元素,这时遍历到的元素就是被出栈元素的下一个比出栈元素大的元素。
接下来我们要找这些已出栈元素的第一个更大元素就好了,也就是把第二个更大元素转化为下一个的下一个,出栈的直接再进入另一个栈同样操作就好了。要明确的是对st2的操作在st1之前,否则前面的数可能被同一个数处理。
1234567891011121314151617181920212223class Solution { vector<int>st1 ...
leetcode119
这周leetcode的题还是比较简单的,最近期末了可能更新会变慢,祝大家期末都能考好
希望我期末不挂科!这样我假期就可以好好打cf了,上大分!
A
map,水水水
123456789101112131415161718class Solution { map<int,int>mp1; map<int,int>mp2;public: vector<int> findIntersectionValues(vector<int>& nums1, vector<int>& nums2) { vector<int>ans(2,0); for(auto &i:nums1)mp1[i]=1; for(auto &i:nums2)mp2[i]=1; for(auto &i:nums1){ if(mp2[i])ans[0]+=mp2[i]; } for(auto & ...
蓝桥杯小白入门赛第一场
昨天也是理完发赶回来打的这场比赛,可惜头发剪毁了,但是打的还不错,算是因祸得福(?
这是我第一次在八千多人参赛的情况下获得137名的成绩,虽然不是特别好,但是对我来说很开心了
A题
很简单的思想,移项得到差分数组,维护并更新答案就可以
123456789101112131415161718192021#include <iostream>using namespace std;using ll=long long;const int N=1e5+20;ll a[N],d[N];int main(){ // 请在此输入您的代码 ll n;cin>>n; for(ll i=1;i<=n;i++){ cin>>a[i]; d[i]=a[i]-a[i-1]; } ll ans=0; for(int i=2;i<=n-1;i++){ if((a[i+1]<=d[i]))ans++; } cout<<ans; return 0;} ...