🔥博客介绍`: 27dCnc
🎥系列专栏: <<数据结构与算法>> << 算法入门>> << C++项目>>
🎥 当前专栏: << 算法入门>>
专题 : 数据结构帮助小白快速入门算法
👍👍👍👍👍👍👍👍👍👍👍👍
☆*: .。. o(≧▽≦)o .。.:*☆
❤️感谢大家点赞👍收藏⭐评论✍️
学习目标:
今日学习打卡
- ACM题解
学习时间:
- 周一至周五晚上 7 点---晚上9点
- 周六上午 9 点-上午 11 点
- 周日下午 3 点-下午 6 点
赛题:
- 搭建 Java 开发环境
- 掌握 Java 基本语法
- 掌握条件语句
- 掌握循环语句
内容详细:
thanks,mom【算法赛】
题目考点: 语言题
解题思路: 直接输出
易错点,注意输出格式: thanks, 后面有个空格
代码
cpp
#include <iostream>
using namespace std;
int main()
{
std::cout << "thanks, mom";
return 0;
}
霓虹【算法赛】
题目考点: 思维
数组表示状态
思路:
用 0 和 1 表示每个数的开关状态,然后以没有变化前和变化后的数为下标去查询比较状态,最后得出答案
代码
cpp
#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()
中的自定义排序规则 - 根据题目要求偶数一定在奇数后面然后我们将元素区分奇偶,分别进行排序然后分别打印得到答案
代码
cpp
#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
暴力解法:超时
cpp
#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;
}
最终解法: 暂时没有理解
cpp
#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;
}
兽之泪【算法赛】
题目考点: 优先队列
解题思路:我尚未理解清楚
代码
cpp
#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【算法赛】
题目考点: 思维
队列
数组
滑动窗口
二维前缀和
代码
cpp
#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 个