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;
}