牛客练习赛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; }
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; } }
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; }