比赛链接:ABC340
话不多说,看题。
Problem A:
签到。
#include <bits/stdc++.h>
using namespace std;
int main(){int a,b,d;cin>>a>>b>>d;for(int i=a;i<=b;i+=d)cout<<i<<endl;return 0;
}
Problem B:
还是签到题。一个vector就搞定了。
#include <bits/stdc++.h>
using namespace std;
int main(){int q;cin>>q;vector<int> a;while(q--){int tp,x;cin>>tp>>x;if(tp==1)a.push_back(x);elsecout<<a[a.size()-x]<<endl;}return 0;
}
Problem C:
记忆化搜索即可,直接拿个map维护就ok了,。
#include <bits/stdc++.h>
using namespace std;
map<int,int> mem;
int dfs(int x){if(x<2)return 0;if(mem.count(x))return mem[x];return mem[x]=dfs(x/2)+dfs(x/2+bool(x%2))+x;
}
int main(){int n;cin>>n;cout<<dfs(n)<<endl;return 0;
}
Problem D:
一道图论。题目没有保证不出现环,所以建图。所以题目变成1到n的最短路径。跑一边Dijkstra即可。
#include <bits/stdc++.h>
using namespace std;
const int maxn=200005;
long long dis[maxn];
bool vis[maxn];
vector<long long> graph[maxn],cost[maxn];
struct node{long long dist;long long p;friend bool operator < (node a,node b){return a.dist>b.dist;}
};
priority_queue<node> pq;
void dijkstra(int s){dis[s]=0;pq.push((node){0,s});while(pq.size()){node tmp=pq.top();pq.pop();int u=tmp.p;if(vis[u])continue;vis[u]=true;for(int i=0;i<graph[u].size();i++){long long v=graph[u][i];long long w=cost[u][i];if(dis[v]>dis[u]+w){dis[v]=dis[u]+w;if(!vis[v])pq.push((node){dis[v],v});}}}
}
int main(){int n;cin>>n;//记得初始化dis数组for(int i=1;i<n;i++){int a,b,x;cin>>a>>b>>x;graph[i].push_back(i+1);cost[i].push_back(a);graph[i].push_back(x);cost[i].push_back(b);}dijkstra(1);cout<<dis[n]<<endl;return 0;
}
OK,以上就是本期的全部内容了。下期更新ABC341的题解。
友情提示:本期的全部代码都有问题,请不要无脑Ctrl C+Ctrl V