2021 RoboCom 世界机器人开发者大赛-本科组(初赛)day24

呃呃 明天就考试了 今天就vp了一场 

好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊好难啊

 

 

 A

暴力

不能整除就continue else 那就存进set


#include <bits/stdc++.h>
using namespace std;
const int N = 210;
const int M = 1e4+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
int n,k,a[N];
signed main(){
    fast
    cin>>n>>k;
    for(int i=1;i<=n;i++)cin>>a[i];
    set<int>s;
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            for(int r=j+1;r<=n;r++){
                for(int m=r+1;m<=n;m++){
                    if((a[i]+a[j]+a[r]+a[m])%4)continue;
                    else s.insert((a[i]+a[j]+a[r]+a[m])/4);
                }
            }
        }
    }
    while(k--){
        int b[N];
        int r;cin>>r;
        for(int i=1;i<=r;i++){
            cin>>b[i];
        }
        for(int i=1;i<=r;i++){
            if(s.count(b[i])==0){cout<<"No"<<endl;goto out;}
        }
        cout<<"Yes"<<endl;
        out:1;
    }
    return 0^0;
}

B

感觉写的很稀里糊涂的

但是一下就过了

大概就是其tan是唯一的

我们用tan存 然后dist排序

然后有连续1就可以一起击倒 思维吗?感觉这个思维难度还不如div2 a

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
const int M = 1e4+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
struct G{
    double tan;
    int dist;
    int w;
    bool operator < (const G &W)const{
        return dist<W.dist;
    }
}g[N];
signed main(){
    fast
    int n;cin>>n;
    int sum=0;
    map<double,vector<int>>mp;
    for(int i=1;i<=n;i++){
        double a,b;int c;cin>>a>>b>>c;
        sum+=c;
        g[i]={b/a,(int)(a+b),c};
        mp[b/a].push_back(i);
    }
    int cnt=0;
    for(auto i:mp){
        vector<G>v;
        for(auto j:i.second)v.push_back(g[j]);
        sort(v.begin(),v.end());
        for(int i=0;i<v.size()-1;i++){
            if(v[i].w==1&&v[i+1].w==1)cnt++;
        }
    }
    cout<<sum<<' '<<n-cnt<<endl;
    return 0^0;
}

C

第一个floyd跑最短路 然后遍历看谁最长 这个没话说

第二个就是dijkstra 维护最短路的同时维护一个 w2的最大就可以了

很多人说不能堆优化啊

边数最多N^2 点N  nlog随便过啊??? 

路径打印很神秘啊(不过我用string来存也能过 没有MLE

今天算是学到了!

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3+10;
const int M = 1e6+10;
const int mod = 1e9+7;
#define int long long
#define endl '\n'
#define Endl '\n'
#define inf 0x3f3f3f3f3f3f3f3f
#define fast ios::sync_with_stdio(false);cin.tie(nullptr);
typedef pair<int,int> PII;
int n,m,g[N][N],k,t[M],h[N],e[M],ne[M],w1[M],w2[M],idx,dist[M],dist1[M],pre[M];
bool st[M];
void add(int a,int b,int c,int d){
    e[idx]=b;
    w1[idx]=c;
    w2[idx]=d;
    ne[idx]=h[a];
    h[a]=idx++;
}
void print(int x){
    if(pre[x]==-1)return;
    print(pre[x]);
    cout<<"->"<<x;
}
signed main(){
    fast
    cin>>n>>m;
    memset(h,-1,sizeof h);
    memset(g,0x3f3f,sizeof g);
    for(int i=1;i<=m;i++){
        int a,b,c,d;cin>>a>>b>>c>>d;
        g[a][b]=c,g[b][a]=c;
        add(a,b,c,d),add(b,a,c,d);
    }
    cin>>k;
    for(int i=1;i<=k;i++)cin>>t[i];
    for(int k=1;k<=n;k++){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
            }
        }
    }
    int ans=2e9,cnt=0;
    for(int i=1;i<=n;i++){
        int mx=-2e9;
        for(int j=1;j<=n;j++){
            mx=max(mx,g[i][j]);
        }
        if(ans>mx)ans=mx,cnt=i;
    }
    cout<<cnt<<endl;
    memset(dist,0x3f3f,sizeof dist);
    memset(pre,-1,sizeof pre);
    priority_queue<PII,vector<PII>,greater<>>q;
    q.push({0,cnt});
    dist[cnt]=0;
    while(q.size()){
        auto [dis,ver]=q.top();q.pop();
        if(st[ver])continue;st[ver]=1;
        for(int i=h[ver];~i;i=ne[i]){
            int j=e[i];
            if(dist[j]>dist[ver]+w1[i]){
                dist[j]=dist[ver]+w1[i];
                dist1[j]=dist1[ver]+w2[i];
                pre[j]=ver;
                q.push({dist[j],j});
            }else if(dist[j]==dist[ver]+w1[i]&&dist1[j]<dist1[ver]+w2[i]){
                dist1[j]=dist1[ver]+w2[i];
                pre[j]=ver;
                q.push({dist[j],j});
            }
        }
    }
    for(int i=1;i<=k;i++){
        cout<<cnt;
        print(t[i]);
        cout<<endl;
        cout<<dist[t[i]]<<' '<<dist1[t[i]]<<endl;
    }
    return 0^0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值