🔥博客介绍`: 27dCnc
🎥系列专栏: <<数据结构与算法>> << 算法入门>> << C++项目>>
🎥 当前专栏: << 算法入门>>
专题 : 数据结构帮助小白快速入门算法
👍👍👍👍👍👍👍👍👍👍👍👍
☆*: .。. o(≧▽≦)o .。.:*☆
❤️感谢大家点赞👍收藏⭐评论✍️
学习目标:
今日学习打卡
- ACM题解
学习时间:
- 周一至周五晚上 7 点—晚上9点
- 周六上午 9 点-上午 11 点
- 周日下午 3 点-下午 6 点
赛题:
内容详细:
thanks,mom【算法赛】
题目考点: 语言题
解题思路: 直接输出
易错点,注意输出格式: thanks, 后面有个空格
代码
#include <iostream>
using namespace std;
int main()
{std::cout << "thanks, mom";return 0;
}
霓虹【算法赛】
题目考点: 思维
数组表示状态
思路:
用 0 和 1 表示每个数的开关状态,然后以没有变化前和变化后的数为下标去查询比较状态,最后得出答案
代码
#include <iostream>
using namespace std;
using ll = long long;void solve(string s,string t) {int a[7][10] = {{1,0,1,1,0,1,1,1,1,1},{1,1,1,1,1,0,0,1,1,1},{1,1,0,1,1,1,1,1,1,1},{1,0,1,1,0,1,1,0,1,1},{1,0,1,0,0,0,1,0,1,0},{1,0,0,0,1,1,1,0,1,1},{0,0,1,1,1,1,1,0,1,1}};ll ans = 0;for (int i = 0; i < s.size(); i++) {if(s[i] != t[i]) {for (int j = 0; j < 7; j++) {if (a[j][s[i] - '0'] != a[j][t[i] - '0']) ans++;}}}std::cout << ans << endl;
}int main()
{string s,T;std::cin >> s >> T;solve(s,T);return 0;
}
奇偶排序【算法赛】
题目考点: 自定义排序
思维
解题思路
- 用
sort()
中的自定义排序规则 - 根据题目要求偶数一定在奇数后面然后我们将元素区分奇偶,分别进行排序然后分别打印得到答案
代码
#include<bits/stdc++.h>
using namespace std;bool cmp(int a,int b) {if ((a % 2 == 0 && b % 2 == 0) || (a % 2 != 0 && b % 2 != 0)) {return a < b;} else {if (a % 2 == 0) {return false;} else {return true;}}
}int main()
{int n; std::cin >> n;std::vector<int>ans(n);for (int i = 0; i < n; i++) {std::cin >> ans[i];}sort(ans.begin(),ans.end(),cmp);for (int i = 0; i < n; i++) {std::cout << ans[i] << " ";}return 0;
}
可结合的元素对【算法赛】
题目考点: lowbit
暴力解法:超时
#include <bits/stdc++.h>
using namespace std;
using ll = long long;int lowbit(int a) {return (a) & -(a);
}int main()
{int n; std::cin >> n;std::vector<int>ans(n + 10);for (int i = 1; i <= n; i++) {std::cin >> ans[i];}ll ANS = 0;for (int i = 1; i <= n; i++) {for (int j = i + 1; j <= n; j++) { if ((lowbit(ans[i] + ans[j])) == (ans[i] + ans[j])) ANS++;}}std::cout << ANS << std::endl;return 0;
}
最终解法: 暂时没有理解
#include<bits/stdc++.h>
#define int long long
using namespace std;int a[100010];
unordered_map<int,int> h;signed main()
{int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+n+1);int res=0;for(int i=1;i<=n;i++){for(int k=1;k<=30;k++)//枚举所有可能的k{int aj=(1<<k)-a[i];//aj为能与a[i]配对的数if(h.find(aj)!=h.end())res+=h[aj];//能找到aj}h[a[i]]++;}cout<<res;return 0;
}
兽之泪【算法赛】
题目考点: 优先队列
解题思路:我尚未理解清楚
代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
using Pair=pair<int,int>;
const int N=2e5+9;
int a[N];
int b[N];
set<int>s;
priority_queue<Pair,vector<Pair>,greater<Pair>>pq;signed main()
{int n,k;cin>>n>>k;int t=k;for(int i=1;i<=n;i++){cin>>a[i]>>b[i];if(i<=n-1)pq.push({a[i],i});}int ans=0,id;while(t--){if(s.size()==n-1)pq.push({a[n],n});ans+=pq.top().first;id=pq.top().second;int t=id;s.insert(id);pq.pop();pq.push({b[id],id});}int res=0;int mn=INT_MAX;for(int i=1;i<=n;i++){res+=a[i];mn=min(mn,b[i]);}res+=(k-n)*mn;cout<<min(ans,res);return 0;
}
矩阵X【算法赛】
题目考点: 思维
队列
数组
滑动窗口
二维前缀和
代码
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int n,m;
int np,mp;
long long ans;
int main()
{cin>>n>>m;cin>>np>>mp;bool flag=false;if(n>m)swap(n,m),swap(np,mp),flag=true;vector<vector<int>> v(n+1,vector<int>(m+1));vector<vector<long long>> sum(n+1,vector<long long>(m+1));vector<vector<int>> maxn(n+1,vector<int>(m+1));vector<vector<int>> minn(n+1,vector<int>(m+1));if(flag==false){for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)cin>>v[i][j];}else{for(int i=1;i<=m;++i)for(int j=1;j<=n;++j)cin>>v[j][i];}for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+v[i][j];}}queue<int> q;for(int i=1;i<=n;++i){while(!q.empty())q.pop();for(int j=1;j<=m;++j){while(!q.empty()&&q.front()+mp<=j)q.pop();while(!q.empty()&&v[i][j]>v[i][q.front()])q.pop();q.push(j);if(j-mp+1>=1)maxn[i][j-mp+1]=v[i][q.front()];}}for(int i=1;i<=n;++i){while(!q.empty())q.pop();for(int j=1;j<=m;++j){while(!q.empty()&&q.front()+mp<=j)q.pop();while(!q.empty()&&v[i][j]<v[i][q.front()])q.pop();q.push(j);if(j-mp+1>=1)minn[i][j-mp+1]=v[i][q.front()];//cout<<minn[i][j-mp+1]<<' ';}//cout<<endl;}for(int i=1;i<=n-np+1;++i){for(int j=1;j<=m-mp+1;++j){for(int k=i;k<=i+np-1;++k){maxn[i][j]=max(maxn[i][j],maxn[k][j]);minn[i][j]=min(minn[i][j],minn[k][j]);}//cout<<maxn[i][j]<<' '<<minn[i][j]<<' ';long long temp=sum[i+np-1][j+mp-1]-sum[i-1][j+mp-1]-sum[i+np-1][j-1]+sum[i-1][j-1];ans=max(ans,temp*(maxn[i][j]-minn[i][j]));}//cout<<endl;}cout<<ans<<endl;
}
学习产出:
- 技术笔记 2 遍
- CSDN 技术博客 3 篇
- 习的 vlog 视频 1 个