“范式杯”2023牛客暑期多校训练营10

K.First Last

一共有n个人,然后每一局拿到第一名或者最后一名的概率为2/n,然后连续m局拿到第一名或者最后一名的概率为pow(2/n,m)

特判一下当n为1时,拿第一名或者最后一名的概率为1

注意,输出1时要写1.0,写1的话就wa了

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#include<vector>
#include<cstdio>
#define endl '\n'
using namespace std;
typedef long long ll;
int n,m;
void solve() {
    cin>>n>>m;
    if(n==1) printf("%.10f\n",1.0);
    else printf("%.10f\n",pow((double)2/n,m));
}
int main() {
//    ios::sync_with_stdio(false);
//    cin.tie(0);
//    cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--)
        solve();
    return 0;
}

M.Fair Equation 

给定一个加法等式,如果本身就成立,那么就输出Yes,并且把这个式子输出来

如果不成立,问能否在等式的任意一个位置添加一个数字,使得该等式成立,如果成立,那么输出Yes,并把正确的式子输出,否则输出No

暴力枚举,在a中任意位置插入0到9,判断等式是否成立,在b中任意位置插入0到9,判断等式是否成立,在c中任意位置插入0到9,判断等式是否成立

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
#include<vector>
#include<cstdio>
#define endl '\n'
using namespace std;
typedef long long ll;
int a,b,c;
char ch1,ch2;
void output(int a,int b,int c){
    cout<<a<<" + "<<b<<" = "<<c<<endl;
}
void solve() {
    cin>>a>>ch1>>b>>ch2>>c;
    if(a+b==c){
        cout<<"Yes"<<endl;
        output(a,b,c);
        return;
    }
    int lena=to_string(a).size();
    int lenb=to_string(b).size();
    int lenc=to_string(c).size();
    //如果a+b<c,那么就在a中插入数字或者在b中插入数字
    if(a+b<c) {
        //在a中插入数字
        int aa;
        int t=1;
        for(int i=0; i<=lena; i++) {
            for(int j=0; j<10; j++) {
                aa=a/t*t*10+j*t+a%t;
                if(aa+b==c){
                    cout<<"Yes"<<endl;
                    output(aa,b,c);
                    return;
                }
            }
            t*=10;
        }
        int bb;
        t=1;
        for(int i=0; i<=lenb; i++) {
            for(int j=0; j<10; j++) {
                bb=b/t*t*10+j*t+b%t;
                if(a+bb==c){
                    cout<<"Yes"<<endl;
                    output(a,bb,c);
                    return;
                }
            }
            t*=10;
        }
    } else {
        //在c中插入数字
        int cc;
        int t=1;
        for(int i=0; i<=lenc; i++) {
            for(int j=0; j<10; j++) {
                cc=c/t*t*10+j*t+c%t;
                if(a+b==cc){
                    cout<<"Yes"<<endl;
                    output(a,b,cc);
                    return;
                }
            }
            t*=10;
        }
    }
    cout<<"No"<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--)
        solve();
    return 0;
}

L.Grayscale Confusion

一个三维向量(r,g,b),如果满足r<r1,g<g1,b<b1,那么(r,g,b)和(r1,g1,b1)具有严格的偏序关系,我们需要将所有的(r,g,b)映射成一个值,满足所有具有严格偏序关系的三维向量映射成的值也具有同样的严格的大小关系

其中第一个和第二个不能有严格的偏序关系,它们映射成的值是相等的

利用拓扑排序,具有严格偏序关系的,小的映射成的值小,大的映射成的值大

AC代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
#define endl '\n'
//#define int long long
using namespace std;
typedef long long ll;
const int N=1010;
int d[N];
int n;
struct node {
    int r,g,b;
    bool operator<(const node &W)const {
        return r<W.r&&g<W.g&&b<W.b;
    }
};
void solve() {
    cin>>n;
    vector<vector<int>>e(n+1);//建图
    vector<node>v(n+1);
    vector<int>ans(n,-1);//存答案,个数为n,每个元素初值为-1
    for(int i=0; i<n; i++) cin>>v[i].r>>v[i].g>>v[i].b;
    //当第一个和第二个具有严格的偏序关系时,那么直接输出-1
    //这里只能用小于号,不能用大于号,因为结构体将小于号重载,但是并没有将大于号重载
    if(v[0]<v[1]||v[1]<v[0]) {
        cout<<-1<<endl;
        return;
    }
    queue<int>q;
    //找出严格偏序的点对,建立有向无环图,小的指向大的,为拓扑排序做准备,拓扑排序先输出偏序关系小的,再输出大的
    //但是要单独处理第一个点和第二个点和其它点的偏序关系,因为我们把第一个点和第二个点的映射值看成是一样的,那么将0和1看成是一个点
    for(int i=2; i<n; i++) {
        for(int j=2; j<n; j++) {
            if(v[i]<v[j]) {
                e[i].push_back(j);
                d[j]++;//入度++
            }
        }
        if(v[i]<v[0]||v[i]<v[1]) {
            e[i].push_back(1);
            d[1]++;
        }
        if(v[0]<v[i]||v[1]<v[i]) {
            e[1].push_back(i);
            d[i]++;
        }
    }
    for(int i=1; i<n; i++) {
        if(d[i]==0) {
            q.push(i);//入度为0的点入队列
            ans[i]=0;
        }
    }
    while(q.size()) {
        int t=q.front();
        q.pop();
        for(auto v:e[t]) {
            d[v]--;
            if(d[v]==0) q.push(v);
            ans[v]=max(ans[v],ans[t]+1);
        }
    }
    //验证映射的值是否在合法范围内
    ans[0]=ans[1];
    for(int i=0;i<ans[i];i++){
        if(ans[i]<0||ans[i]>255){
            cout<<-1<<endl;
            return;
        }
    }
    for(int i=0;i<n;i++) cout<<ans[i]<<endl;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t=1;
//    cin>>t;
    while(t--) {
        solve();
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值