7-1 懂的都懂 - 2021 RoboCom 世界机器人开发者大赛-本科组(初赛) (pintia.cn)
7-2 芬兰木棋 - 2021 RoboCom 世界机器人开发者大赛-本科组(初赛) (pintia.cn)
7-3 打怪升级 - 2021 RoboCom 世界机器人开发者大赛-本科组(初赛) (pintia.cn)
7-4 疫情防控 - 2021 RoboCom 世界机器人开发者大赛-本科组(初赛) (pintia.cn)
有些代码是看佬的
第一题:暴力
#include <bits/stdc++.h>
using namespace std;
const int N = 55;
map<double, int> mp;
int n, k;
double a[N];
int main()
{
cin >> n >> k;
for(int i = 1; i <= n; i ++) cin >> a[i];
for(int i = 1; i <= n; i ++)
{
for(int j = i + 1; j <= n; j ++)
{
for(int l = j + 1; l <= n; l ++)
{
for(int r = l + 1; r <= n; r ++)
{
double aver = (a[i] + a[j] + a[l] + a[r]);
mp[aver] = 1;
}
}
}
}
while(k --)
{
int m; cin >> m;
bool f = 1;
for(int i = 1; i <= m; i ++)
{
int x; cin >> x;
if(mp[x*4] != 1)
{
f = 0;
}
}
if(f) cout << "Yes";
else cout << "No";
if(k != 0) cout << endl;
}
}
第二题:暴力
#include <bits/stdc++.h>
using namespace std;
#define int long long
typedef pair<int, int> PII;
const int N = 1e5 + 10;
struct node{
double x, y, w;
};
vector<node> a1;//x>0 y>0
vector<node> a2;//x>0 y<0
vector<node> a3;//x<0 y>0
vector<node> a4;//x<0 y<0
vector<node> b1,b2,b3,b4;
bool cmp(node a, node b)
{
return a.x * a.x + a.y * a.y < b.x * b.x + b.y * b.y;
}
int cnt(vector<node> &a)
{
map<double, int> mp;//斜率下扔多少个 最多
map<double, int> pre;//斜率下前面的那个的价值
sort(a.begin(), a.end(), cmp);
set<double> st;
int k = 0;
for(auto &[x, y, w] : a)
{
// cout << x << " " << y << " " << w << endl;
if(pre[x/y]==1&&w == 1)//前面那个不是1
{
continue;
// cout << "pre" << w << " " << mp[x/y] << endl;
}
else
{
mp[x/y] ++;
}
pre[x/y] = w;
st.insert(x/y);
}
for(auto i : st)
{
// cout << "hudeh" << i << endl;
k += mp[i];
}
//cout << k << endl;
return k;
}
int cnt1(vector<node> &b)
{
int pre = 0;
sort(b.begin(), b.end(),cmp);
int k = 0;
for(auto &[x, y, w] : b)
{
if(pre==1&&w == 1)//前面那个不是1
{
continue;
}
else
{
k ++;
}
pre = w;
}
return k;
}
signed main()
{
int n; cin >> n;
int res = 0, k = 0;
for(int i = 1; i <= n; i ++)
{
double x, y, w; cin >> x >> y >> w;
if(x > 0 && y > 0) a1.push_back({x, y, w});
else if(x > 0 && y < 0) a2.push_back({x, y, w});
else if(x < 0 && y > 0) a3.push_back({x, y, w});
else if(x < 0 && y < 0) a4.push_back({x, y, w});
else if(x == 0 && y > 0) b1.push_back({x, y, w});
else if(x == 0 && y < 0) b2.push_back({x, y, w});
else if(x > 0 && y == 0) b3.push_back({x, y, w});
else b4.push_back({x, y, w});;
res += w;
}
int k1 = cnt(a1);
k += k1;
k1 = cnt(a2);
k += k1;
k1 = cnt(a3);
k += k1;
k1 = cnt(a4);
k += k1;
k1 = cnt1(b1);
k += k1;
k1 = cnt1(b2);
k += k1;
k1 = cnt1(b3);
k += k1;
k1 = cnt1(b4);
k += k1;
cout << res << " " << k;
return 0;
}
第三题:Dijkstra
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1010, INF = 0x3f3f3f3f;
int n, m, k, x, pre[N], start;
int dis[N], done[N], sum[N];
void print(int s, int t)
{
if(s == t){
printf("%d", s);
return;
}
print(s, pre[t]);
printf("->%d", t);
}
struct edge
{
int to, v, w;
};
vector<edge> e[N];
struct node
{
int id, dis;
bool operator<(const node& a)const{
return dis > a.dis;
}
};
int Dijkstra(int s)
{
int dis[N], done[N];
for(int i = 1; i <= n; i ++) dis[i] = INF, done[i] = 0;
priority_queue<node> q;
q.push({s, 0});
dis[s] = 0;
while(q.size()){
node u = q.top(); q.pop();
if(done[u.id]) continue;
done[u.id] = 1;
for(int i = 0; i < e[u.id].size(); i ++){
edge x = e[u.id][i];
if(done[x.to]) continue;
if(dis[x.to] > dis[u.id] + x.v){
dis[x.to] = dis[u.id] + x.v;
q.push({x.to, dis[x.to]});
}
}
}
int mx = 0;
for(int i = 1; i<= n; i ++) mx = max(mx, dis[i]);
return mx;
}
void solve()
{
for(int i = 1; i <= n; i ++) dis[i] = INF, done[i] = 0, sum[i] = 0;
priority_queue<node> q;
q.push({start, 0});
dis[start] = 0;
while(q.size()){
node u = q.top(); q.pop();
if(done[u.id]) continue;
done[u.id] = 1;
for(int i = 0; i < e[u.id].size(); i ++){
edge x = e[u.id][i];
if(done[x.to]) continue;
if(dis[x.to] > dis[u.id] + x.v){
dis[x.to] = dis[u.id] + x.v;
sum[x.to] = sum[u.id] + x.w;
q.push({x.to, dis[x.to]});
pre[x.to] = u.id;
}
else if(dis[x.to] == dis[u.id] + x.v){
if(sum[u.id] + x.w > sum[x.to]){
sum[x.to] = sum[u.id] + x.w;
pre[x.to] = u.id;
q.push({x.to, dis[x.to]});
}
}
}
}
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= m; i ++)
{
int a, b, c, d; scanf("%d%d%d%d", &a, &b, &c, &d);
e[a].push_back({b, c, d});
e[b].push_back({a, c, d});
}
int minn = INF;
for(int i = 1; i <= n; i ++)
{
int t = Dijkstra(i);
if(t < minn) start = i, minn = t;
}
cout << start << '\n';
cin >> k;
solve();
for(int i = 0; i < k; i ++){
cin >> x;
print(start, x);
printf("\n%d %d\n", dis[x], sum[x]);
}
return 0;
}
第四题:从最后一天开始连并查集实现删除操作
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e4+5;
int n,m,d;
int c[N],q[N];
int p[N];
set<int>s;
vector<int>e[N];
map<int,vector<pair<int,int>>>mp;
int find(int x){
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
int main(){
scanf("%d%d%d",&n,&m,&d);
for(int i=1;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
e[a].push_back(b);
e[b].push_back(a);
}
for(int i=1;i<=d;i++){
scanf("%d%d",&c[i],&q[i]);
s.insert(c[i]);
for(int j=0;j<q[i];j++){
int a,b;
scanf("%d%d",&a,&b);
mp[i].push_back({a,b});
}
}
for(int i=1;i<=n;i++) p[i]=i;
for(int i=1;i<=n;i++){
if(s.count(i)) continue;
for(int j=0;j<e[i].size();j++){
int to=e[i][j];
if(s.count(to)==0){
int a=find(i);
int b=find(to);
if(a!=b) p[b]=a;
}
}
}
int res[N];
for(int i=d;i>0;i--){
vector<pair<int,int>>v=mp[i];
for(int j=0;j<v.size();j++){
int a=find(v[j].first);
int b=find(v[j].second);
if(a!=b) res[i]++;
}
int r=c[i];
for(int j=0;j<e[r].size();j++){
if(s.count(e[r][j])) continue;
int a=find(e[r][j]);
int b=find(r);
if(a!=b) p[a]=b;
}
s.erase(c[i]);
}
for(int i=1;i<=d;i++) printf("%d\n",res[i]);
return 0;
}