A
https://www.nowcoder.com/acm/contest/96/A
检测输入字符串是否是”lovelive“ (出题人是拉拉银)
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; int main() { char s[110]; while(gets(s)) { int len=strlen(s); if(len!=8) { cout<<"no"<<endl; continue; } int cmp=0; if(s[0]=='l'||s[0]=='L') cmp++; if(s[1]=='o'||s[1]=='O') cmp++; if(s[2]=='v'||s[2]=='V') cmp++; if(s[3]=='e'||s[3]=='E') cmp++; if(s[4]=='l'||s[4]=='L') cmp++; if(s[5]=='i'||s[5]=='I') cmp++; if(s[6]=='v'||s[6]=='V') cmp++; if(s[7]=='e'||s[7]=='E') cmp++; if(cmp==8) { cout<<"yes"<<endl; } else cout<<"no"<<endl; } return 0; }
B
https://www.nowcoder.com/acm/contest/96/B
2个数相加不考虑进位即 ci=(ai+bi)%10
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; int main() { char a[11]; char b[11]; int res[11]; while(cin>>a>>b) { memset(res,0,sizeof(res)); int lena=strlen(a); int lenb=strlen(b); int lenmin=min(lena,lenb); int lenmax=max(lena,lenb); for(int i=0;i<lenmin;i++) { res[i]=(a[lena-1-i]-'0')+(b[lenb-1-i]-'0'); } if(lena>lenb) { for(int i=lenmin;i<lenmax;i++) { res[i]=(a[lena-1-i]-'0'); } } if(lenb>lena) { for(int i=lenmin;i<lenmax;i++) { res[i]=(b[lenb-1-i]-'0'); } } for(int i=0;i<lenmax;i++) { res[i]%=10; } bool cmp=0; for(int i=lenmax-1;i>=0;i--) { if(res[i]||cmp) { cout<<res[i]; cmp++; } } if(!cmp) cout<<"0"; cout<<endl; } return 0; }
C
https://www.nowcoder.com/acm/contest/96/C
打表发现规律就是b/(a+b)
#include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #include<iomanip> using namespace std; int main() { int T; double a,b,k; cin>>T; while(T--) { cin>>a>>b>>k; double res=b/(a+b); cout<<fixed<<setprecision(3)<<res<<endl; } return 0; }
D
https://www.nowcoder.com/acm/contest/96/D
求l-r中的数对于整除的偏序关系来组成哈斯图,求哈斯图的边数
#include<bits/stdc++.h> using namespace std; bool check[1111111]; int prime[1111111]; int main() { memset(check, 0, sizeof(check)); int count = 0; for (long long int i = 2; i <= 1000000; i++) { if (!check[i]) prime[count++] = i; for (int j = 0; j < count; j++) { if (i*prime[j] >1000000) break; check[i*prime[j]] = 1; if ((i%prime[j]) == 0) break; } } int l,r; while(~scanf("%d%d",&l,&r)) { //cout<<"1"<<endl; long long ans=0; int zz=0; for(int i=r/2;i>=l;i--) { if(i*prime[zz+1]>r&&i*prime[zz]<=r) { ans+=zz+1; } else{ while(i*prime[zz+1]<=r&&zz+1<=count-1) { zz++; } //if(l==1) //cout<<zz<<endl; ans+=zz+1; } //int p=upper_bound(prime,prime+rrr,fid)-prime; //cout<<p<<endl; } printf("%lld\n",ans); } return 0; }
E
https://www.nowcoder.com/acm/contest/96/E
最短路裸题
#include<bits/stdc++.h> using namespace std; const int inf=0x3f3f3f3f; const int N=200000+10; struct node { int x,y; }; int n,m; vector<node>e[N]; long long dis[N]; bool vis[N]; void disk() { memset(vis,false,sizeof(vis)); for(int i=1;i<=n;i++)dis[i]=inf; vis[1]=true; dis[1]=0; queue<int>q; q.push(1); while(!q.empty()) { int u=q.front(); q.pop(); vis[u]=false; for(int i=0;i<e[u].size();i++) { int v=e[u][i].x; if(dis[v]>dis[u]+e[u][i].y) { dis[v]=dis[u]+e[u][i].y; if(!vis[v]) { vis[v]=true; q.push(v); } } } } if(dis[n]==inf) { printf("qwb baka\n"); } else printf("%lld\n",dis[n]); } int main() { while(scanf("%d%d",&n,&m)!=EOF) { for(int i=0;i<=n;i++) { e[i].clear(); } int u,v,w; for(int i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&w); node q; q.x=v; q.y=w; e[u].push_back(q); q.x=u; q.y=w; e[v].push_back(q); } disk(); } return 0; }
G
https://www.nowcoder.com/acm/contest/96/G
在起点和终点之间加了个钥匙,先找起点到所有钥匙的最短距离,再从钥匙出发找到终点的最短距离;
#include<bits/stdc++.h> using namespace std; const int inf=0x3f3f3f3f; const int N=550; int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}}; int n,m; struct node { int x,y; }; char mm[N][N]; int dis[N][N]; int dis1[N][N]; bool vis[N][N]; int sx,sy,ex,ey; int xx[N*N],yy[N*N]; int k; bool check(int x,int y) { if(x<0||x>=n||y<0||y>=m||mm[x][y]=='#')return true; return false; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=0;i<n;i++) { scanf("%s",mm[i]); } k=0; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(mm[i][j]=='P')sx=i,sy=j; if(mm[i][j]=='E')ex=i,ey=j; if(mm[i][j]=='K')xx[k]=i,yy[k++]=j; dis[i][j]=dis[j][i]=inf; dis1[i][j]=dis1[j][i]=inf; } } memset(vis,false,sizeof(vis)); vis[sx][sy]=true; dis[sx][sy]=0; node q,p; q.x=sx; q.y=sy; queue<node>Q; Q.push(q); while(!Q.empty()) { p=Q.front(); Q.pop(); vis[p.x][p.y]=false; for(int i=0;i<4;i++) { q.x=p.x+dir[i][0]; q.y=p.y+dir[i][1]; if(check(q.x,q.y))continue; if(mm[q.x][q.y]=='E')continue; if(dis[q.x][q.y]>dis[p.x][p.y]+1) { dis[q.x][q.y]=dis[p.x][p.y]+1; if(!vis[q.x][q.y]){ Q.push(q); vis[q.x][q.y]=true; } } } } memset(vis,false,sizeof(vis)); vis[ex][ey]=true; dis1[ex][ey]=0; q.x=ex; q.y=ey; Q.push(q); while(!Q.empty()) { p=Q.front(); Q.pop(); vis[p.x][p.y]=false; for(int i=0;i<4;i++) { q.x=p.x+dir[i][0]; q.y=p.y+dir[i][1]; if(check(q.x,q.y))continue; if(dis1[q.x][q.y]>dis1[p.x][p.y]+1) { dis1[q.x][q.y]=dis1[p.x][p.y]+1; if(!vis[q.x][q.y]){ Q.push(q); vis[q.x][q.y]=true; } } } } int flag=0; int minn=inf; for(int i=0;i<k;i++) { if(dis[xx[i]][yy[i]]!=inf&&dis1[xx[i]][yy[i]]!=inf) { flag=1; minn=min(minn,dis[xx[i]][yy[i]]+dis1[xx[i]][yy[i]]); } } if(!flag) { cout<<"No solution"<<endl; } else cout<<minn<<endl; } return 0; }
H
https://www.nowcoder.com/acm/contest/96/H
前后处理一下前后缀和,再处理一下前后缀的最大值,都是n的效率,最后遍历每一个长度的子串,就可以用O(1)的效率找到当前子串和另一个最大子串的和最大值,扫一遍比比就可以了
#include<bits/stdc++.h> using namespace std; long long a[222222]; long long sq[222222]; long long sh[222222]; long long mq[222222]; long long mh[222222]; int main(){ int t; cin>>t; while(t--) { int n,k; cin>>n>>k; for(int i=0;i<n;i++) { scanf("%lld",&a[i]); } memset(sq,0,sizeof(sq)); for(int i=0;i<k;i++) { sq[0]+=a[i]; } for(int i=1;i<=n-k;i++) { sq[i]=sq[i-1]-a[i-1]+a[i+k-1]; } memset(sh,0,sizeof(sh)); for(int i=n-1;i>=n-k;i--) { sh[n-1]+=a[i]; } for(int i=n-2;i>=k-1;i--) { sh[i]=sh[i+1]-a[i+1]+a[i-k+1]; } for(int i=0;i<=n-k;i++) mq[i]=-999999999999; mq[n-k]=sq[n-k]; for(int i=n-k-1;i>=0;i--) { mq[i]=max(sq[i],mq[i+1]); } for(int i=k-1;i<=n-1;i++) mh[i]=-999999999999; mh[k-1]=sh[k-1]; for(int i=k;i<=n-1;i++) { mh[i]=max(sh[i],mh[i-1]); } long long ans=-999999999999; for(int i=0;i<=n-k;i++) { long long maaaa=-999999999999; if(i>=k) { maaaa=max(maaaa,mh[i-1]); } if(n-i-k>=k) { maaaa=max(maaaa,mq[i+k]); } //cout<<sq[i]<<" "<<maaaa<<endl; ans=max(ans,sq[i]+maaaa); } cout<<ans<<endl; } return 0; }
L
https://www.nowcoder.com/acm/contest/96/L
模拟..小小的贪心
#include<bits/stdc++.h> using namespace std; int main(){ int t; cin>>t; int p[111]; while(t--) { int a,b,n; cin>>a>>b>>n; int sum=0; for(int i=0;i<n;i++) cin>>p[i],sum+=p[i]; sort(p,p+n); int zj=n-1; int da=0; for(int i=0;i<n;i++) { da+=p[i]/2; } if(b>=da) { b-=da; a+=b; sum-=da*2; if(a>=sum) cout<<"Yes"<<endl; else cout<<"No"<<endl; } else{ sum-=b*2; if(a>=sum)cout<<"Yes"<<endl; else cout<<"No"<<endl; } } return 0; }