牛客算法周周练1题解

牛客算法周周练1题解
A:要最大的美丽

#include using namespace std; typedef long long ll; typedef pair pii; const int N=1e5+10; const int M=2e5+10; ll a[N],pre[N]; int main() { int t; scanf("%d",&t); while(t--){ int n,k; scanf("%d %d",&n,&k); for(int i=1; i<=n; i++)scanf("%lld",&a[i]); ll ans=0; ll sum=0; for(int i=1; i<=n; i++)sum+=i*a[i],pre[i]=pre[i-1]+a[i]; for(int i=k+1; i<=n; i++){ ll sum1=sum-a[i]*i+a[i]*(i-k)+pre[i-1]-pre[i-k-1]; ans=max(ans,sum1); } printf("%lld\n",ans); } return 0; }

B:首先要锻炼
#include using namespace std; typedef long long ll; typedef pair pii; const int N=1e3+10; const int M=2e5+10; double c[N],d[N]; int main() { int n; scanf("%d",&n); double v,u; scanf("%lf %lf",&v,&u); for(int i=1; i<=n; i++)scanf("%lf",&c[i]); for(int i=1; i<=n; i++)scanf("%lf",&d[i]); double ans=0; for(int i=0; i

C:其次要拦截成功
#include using namespace std; typedef long long ll; typedef pair pii; const int N=1e5+10; int head[N],cnt,n,q,dep[N],fa[N][17]; struct edge{ int next,to; }e[N<<1]; void add(int u,int v){ e[++cnt].next=head[u]; e[cnt].to=v; head[u]=cnt; } void dfs(int u,int f){ fa[u][0]=f; dep[u]=dep[f]+1; for(int i=head[u]; i; i=e[i].next){ int v=e[i].to; if(v==f)continue; dfs(v,u); } } void init(){ dfs(1,0); for(int j=0; (1<<(j+1))dep[v])swap(v,u); int temp=dep[v]-dep[u]; for(int i=0; (1<=0; i--) if(fa[u][i]!=fa[v][i]){ u=fa[u][i]; v=fa[v][i]; } return fa[u][0]; } int main() { int t; scanf("%d",&t); while(t--){ cnt=0; scanf("%d %d",&n,&q); for(int i=0; i<=n; i++)head[i]=0; for(int i=1; i

D:然后要和妹子去旅游
#include using namespace std; typedef long long ll; typedef pair pii; const int N=110; const int M=1e4+10; int head[N],cnt,n,m,k,c[N],h1[N],h2[N]; double dp[N][500]; bool vis[N][500]; struct edge{ int next,to,w; }e[M<<1]; void add(int u,int v,int w){ e[++cnt].next=head[u]; e[cnt].to=v; e[cnt].w=w; head[u]=cnt; } double dfs(int u,int t){ if(vis[u][t])return dp[u][t]; double ans=0; int num=0; for(int i=head[u]; i; i=e[i].next){ int v=e[i].to,w=e[i].w; if(c[v]+w<=t){ num++; ans+=dfs(v,t-w-c[v])+h1[v]; } } vis[u][t]=1; if(num)dp[u][t]=ans/num; else dp[u][t]=0; return dp[u][t]; } double dfs1(int u,int t){ if(vis[u][t])return dp[u][t]; double ans=0; int num=0; for(int i=head[u]; i; i=e[i].next){ int v=e[i].to,w=e[i].w; if(c[v]+w<=t){ num++; ans+=dfs1(v,t-w-c[v])+h2[v]; } } vis[u][t]=1; if(num)dp[u][t]=ans/num; else dp[u][t]=0; return dp[u][t]; } int main() { scanf("%d %d %d",&n,&m,&k); for(int i=1; i<=n; i++)scanf("%d %d %d",&c[i],&h1[i],&h2[i]); for(int i=1; i<=m; i++){ int a,b,c; scanf("%d %d %d",&a,&b,&c); add(a,b,c); add(b,a,c); } double ans1=0,ans2=0; for(int i=1; i<=n; i++)ans1+=dfs(i,k-c[i])+h1[i]; memset(vis,false,sizeof vis); for(int i=1; i<=n; i++)ans2+=dfs1(i,k-c[i])+h2[i]; printf("%.5f %.5f\n",ans1/n,ans2/n); return 0; }

【牛客算法周周练1题解】E:最后拿到一个幸运数字
#include using namespace std; typedef long long ll; typedef pair pii; const int N=1e5+10; const int M=2e5+10; vectorvt; void dfs(int pos,ll val){ if(pos==0){ vt.push_back(val); return ; } dfs(pos-1,val*10+4); dfs(pos-1,val*10+7); } int main() { for(int i=1; i<=10; i++)dfs(i,0); sort(vt.begin(),vt.end()); ll ans=0; int a,b; scanf("%d %d",&a,&b); int x=lower_bound(vt.begin(),vt.end(),a)-vt.begin(); int y=lower_bound(vt.begin(),vt.end(),b)-vt.begin(); y--; if(y

    推荐阅读