牛客练习赛43

牛客练习赛43

A题:水题,看清"YE5"和"N0"而不是"YES"、"NO";

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,a[110],b[110];
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i]>>b[i];
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            if(i==j) continue;
            if(a[i]+b[i]==a[j]&&a[j]+b[j]==a[i]){
                cout<<"YE5"<<endl;
                return 0;
            }
        }
    }
    cout<<"N0"<<endl;
    return 0;
}
View Code

B题:快速幂取模+快速除

#include<bits/stdc++.h>
using namespace std;
long long m,n,k1,k2;
long long powerMod(int a,long long b){
    long long ans=m;
    a=a%n;
    while(b>0){
        if(b&1) ans=(long long)ans*a%n;
        a=(long long)a*a%n;
        b/=2;
    }
    return ans;
}
int main(){
    std::ios::sync_with_stdio(false);
    int t;
    cin>>t;
    while(t--){
        cin>>m>>n>>k1>>k2;
        
        long long p,q;
        p=powerMod(10,k1-1);
        for(int i=k1;i<=k2;i++)
        {
            cout<<p*10/n; 
            p=p*10%n;
        }
        cout<<endl;
        
    }
}
View Code

C题:最小生成树

#include<bits/stdc++.h>
using namespace std;
const int N=1e6 + 10;
const int M=7e6 + 10;//一共有m+n条边 不知道为什么6e6+10 就会超时 

int n,m,k;
long long t,sum=0;
int T;

struct Edge {
    int form,to,w;
    bool  operator < (const Edge x)const{
        return w<x.w;
    }
}e[M];
int cnt=0;

void addEdge(int u,int v,int w){
    e[++cnt].to=v;
    e[cnt].w=w;
    e[cnt].form=u;
}

int f[N];
int find(int x){
    return f[x]==x? x: f[x]=find(f[x]);
}

inline int read(){//快读 
    long long x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*f;
}
int main(){
    
    n=read();m=read();k=read();t=read();
    //printf("%d %d %d %lld\n",n,m,k,t);
    f[0]=0;
    for(int i=1;i<=n;i++){
        f[i]=i;
        T=read();
        addEdge(0,i,T);//每个节点和虚拟节点0创建边 边权为点代价
    }
    int tmp;
    for(int i=1;i<=k;i++)
    {
        tmp=read();
        //printf("%d\n",tmp);
        f[tmp]=0;//已有节点和虚拟节点0连接 
    }
    int x,y,h;
    for(int i=0;i<m;i++){
        x=read();y=read();h=read();
        //printf("%d %d %d\n",x,y,h);
        addEdge(x,y,h);
    }
    
    sort(e+1,e+cnt+1);
    int ans=k;
    for(int i=1;i<=cnt;i++){
        x=find(e[i].form),y=find(e[i].to),h=e[i].w;
        if(x!=y){
            f[x]=y;
            sum+=h;
            ans++;
        }
        else continue;
        if(ans==n-1||sum>t) break;
    }
    //cout<<sum;
    if(sum>t)printf("No\n");
    else printf("Yes\n");
    return 0;
}
View Code

猜你喜欢

转载自www.cnblogs.com/YJing814/p/10661773.html