21天好习惯第一期-3

牛客算法周周练1 【题解】
牛客算法周周练1 【题解】
小结:
这个比赛最有意思了,对小白来说很友好,都是一些基础的算法,第一题就是我在学习前缀和的时候写过的,当时非常高兴直接秒提交了,E题打表简直不要太爽,就是题目长了点,还是不够冷静读题。

题解部分
A、Maximize The Beautiful Value
题意:
输入t组数据,每组数据给定n个递增的数,选择任意一个数(必须在第k个数后面)向前移动k步,美丽值f就是每个数与下标之积的和,求最大的美丽值f是多少

难度:
前缀和的基础题。
题目类型:前缀和

思路:
解法是前缀和。
对比移动前和移动后美丽值f的表达式:
5 3
1 1 3 4 5
f=a1 * 1 + a2 * 2 + a3 * 3 + a4 * 4 + a5 * 5,f '=a1 * 1 + a2 * 2 + a3 * 3 + a4 * 4 + a5 * 5 - a4 * 3 + (a1+a2+a3)
我们可以先得到最初的美丽值f,然后前k个数相加得到最初的前缀和h,那么f=f-k*a(k+1)+h,从k+1接着往后遍历,同时维护前缀和h=h-a[i-1]+a[i+k-1],然后再记录下最大的美丽值就是答案了

复杂度:
O(n)

#include <stdio.h>
#include <string.h>
long long z, ans, a[100005], sum, m, h;
int n, k, num, t,i;
long long max(long long a,long long b){
    return a>b?a:b;
}
int main(){
    scanf("%d",&t);
    while(t--){
        ans=sum=h=0;
        scanf("%d%d",&n,&k);
        for(i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            sum+=a[i]*i;
        }
        for(i=1;i<=k;i++)
            h+=a[i];
        num=n-k;
        for(i=1;i<=num;i++){
            m=sum-a[i+k]*k;
            if(i>=2)
                h=h-a[i-1]+a[i+k-1];
            m=m+h;
            ans=max(ans,m);
        }
        printf("%lld\n",ans);
    }
}

B、身体训练
题目大意:
n个人排成一队以相同的速度跑步,最后一个人相对第一个人而言向前跑nu米到排头后,此时的最后一名也这样做,但是第i个人是第j个排尾时跑到排头的速度会减少(j-1)d[i],而且每个人都可能是排头,求每个人都跑到过排头的期望

难度:
模拟就可以了
题目类型:模拟,暴力枚举

思路:
枚举每一个人的花的时间,因为每个人的位置都是随机的,所以对第i个人他可能是第j\in∈ (1,n)个跑的,每个人的时间就是:\sum_{j=1}^{n}∑
j=1
n

(n * u/(c[i]-(j-1)*d[i]-v))/n =(n∗u/(c[i]−(j−1)∗d[i]−v))/n= \sum_{j=1}^{n}∑
j=1
n

u/(c[i]-(j-1)*d[i]-v)u/(c[i]−(j−1)∗d[i]−v)
最后加上每一个人的时间就是答案了

复杂度:
O(n^2)

#include<bits/stdc++.h>
#define ll long long 
#define  js  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
int n;
double v,u,d,sum=0;
double c[1001];
int main() {
    js;
    cin>>n>>v>>u;
    for(int i=1;i<=n;++i)    cin>>c[i];
    for(int i=1;i<=n;++i) {
        cin>>d;
        for(int j=1;j<=n;++j) {
            sum+=u/(c[i]-(j-1)*d-v);
        }
    }
    cout<<fixed<<setprecision(3)<<sum<<endl;
}

C、Borrow Classroom
题目大意:
全部的点在一颗根为1的树上,同学从B到C然后再到1,老师要从A出发在同学从B走到C时拦截他或者在在他从C出发到1之前拦截他,如果能成功拦截输出Yes,反之No。

前导知识:
LCA最近公共祖先,因为每个结点的距离都是1,所以不需要dis[]–距离数组,dp[i][j]表示节点i的2^j2
j
级祖先,只需要dep[]—深度数组。这里用的是倍增+dfs在线算法实现的,Tarjan ,离线算法目前还不会
别的大佬的博客:

难度:
LCA的简单应用

思路:
每个位置到根结点1的距离就是它的深度,老师到教务处的距离ans1=dep[A],
同学到C再到教务处的距离ans2=dep[B]+2*dep[C]-2 * dep[LCA(B,C)]。
如果ans1<an2,一定能拦截成功;
如果ans1==ans2,表示老师和同学能同时到教务处,如果老师和同学在还没到教务处就相遇了LCA(A,C)!=1那么拦截成功,否则失败;
如果ans1>ans2一定失败。

先看key 1,这里的代码是尝试将a与b调制统一高度,而这里出现的位运算有些巧妙,其实就是利用二进制的特性实现逐渐加上一个二进制数。比如5=101_{2}5=101
2

,那么只要加2{0}、222
0
、2
2
就可以了。

再来看key 2,因为这两个节点到LCA的深度差可以被分解成多个2的幂之和,因此我们有办法逐步将它们上移至LCA的位置。但是为了方便判断是否跳的太远,我们不让它们最后跳到LCA的位置,而是跳到LCA的儿子节点处。

复杂度:
预处理复杂度 \thetaθ (VlogV),每次查询 \thetaθ(logV)

#include<bits/stdc++.h>
#define  js  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
int t,n,m,a,b,c;
vector<int> e[100005];//保存边信息 
int dep[100005];//存该点在新建的树中的深度,也就是第几层 
//遍历图, 求出各节点到根节点的路径长度和各节点的深度,并将每个点的父节点保存下来 
int dp[100005][20];
void dfs(int root,int pre) {
    dp[root][0]=pre;
    dep[root]=dep[pre]+1;
    for(int i=1;i<20;++i) if(dp[root][i-1]!=-1)
        dp[root][i]=dp[dp[root][i-1]][i-1];
    for(int i=0;i<e[root].size();++i) {
        int v=e[root][i]; 
        if(v==pre)//避免回到父节点上
            continue;
        dfs(v,root);
    }
}
//查询函数
int LCA(int a,int b) {
    if(dep[a]<dep[b])
        swap(a,b);//始终保持a所处的深度较深
    int dist = dep[a] - dep[b];//将a上调dist个距离,使得a、b深度相同
    for(int i=19;i>=0;i--) {
        if((1<<i)&dist)//key 1
            a=dp[a][i];
    }
    if(a==b)
        return a;
    //将a、b同时上调
    for(int i=19;i>=0;i--) {
        if(dp[a][i]!=dp[b][i]) {
            a=dp[a][i];
            b=dp[b][i];
        }//key 2
    }
    //最后a、b会变成lca的子节点
    return dp[a][0];
}
int ans1,ans2;
int main() {
    js; 
    cin>>t;
    while(t--) {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            e[i].clear();
        for(int i=1;i<n;i++) {
            cin>>a>>b;
            e[a].push_back(b);
            e[b].push_back(a);
        }
        dep[0]=-1;
        dfs(1,0);
        while(m--) {
            cin>>a>>b>>c;
            ans1=dep[a];
            ans2=dep[b]+(dep[c]<<1)-(dep[LCA(b,c)]<<1);
            if(ans1<ans2||ans1==ans2&&LCA(a,c)!=1) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
    }
    return 0;
}

D、景区路线规划
题意:
游客只能游玩k分钟,游览每个景点要花对应的时间同时会得到一定的满意度–男女获得的满足度不同,从一个景点到另一个景点也要花时间,游览路线是一个无向有权图,一男一女随机选择一个景点开始游览同时随机走向另一个景点(可能是已经看过的),问男士和女士在游玩结束后满意度的期望。

难度:
看题解的话还是很好懂的,就是不好想到。
题目类型:记忆化搜索,概率

思路:
用dfs先求出游览最后一个景点的期望,在求出游览上一个景点的期望。
枚举现在景点能到的所有景点作为游客下一步可能参观的地方,同时统计有几种可能的方案,算出不同方案的总满足度ans后ans/cnt求得这个从最后一个景点游览到现在游客满意度的期望。因为男女不同,所以要dfs两次。因为起点随机同时参观过的还可以再参观,会有不少已经处理过的状态,所以要记忆化搜索。

复杂度:
目测\thetaθ (n^2)

#include<bits/stdc++.h>
#define  js  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
struct node{
    int h1,h2,c;
}a[105];
int n,m,k,e[105][105];
double f1[105][500],f2[150][500];
double dfs1(int u,int t) {
    if(f1[u][t])    return f1[u][t];
    int cnt=0;
    double ans=0.0;
    for(int i=1;i<=n;++i) if(e[u][i]&&t>=e[u][i]+a[i].c) {
        ++cnt;
        ans+=dfs1(i,t-e[u][i]-a[i].c);
    }
    if(cnt) ans/=cnt;
    ans+=a[u].h1;
    f1[u][t]=ans;
    return ans;
}
double dfs2(int u,int t) {
    if(f2[u][t])    return f2[u][t];
    int cnt=0;
    double ans=0.0;
    for(int i=1;i<=n;++i) if(e[u][i]&&t>=e[u][i]+a[i].c) {
        ++cnt;
        ans+=dfs2(i,t-e[u][i]-a[i].c);
    }
    if(cnt)    ans/=cnt;
    ans+=a[u].h2;
    f2[u][t]=ans;
    return ans;
}
int u,v,w;
double ans1=0,ans2=0;
int main() {
    js;
    cin>>n>>m>>k;
    for(int i=1;i<=n;++i) cin>>a[i].c>>a[i].h1>>a[i].h2;
    for(int i=1;i<=m;++i) {
        cin>>u>>v>>w;
        e[u][v]=e[v][u]=w;
    }
    for(int i=1;i<=n;++i) if(k>=a[i].c) {
        ans1+=dfs1(i,k-a[i].c);
        ans2+=dfs2(i,k-a[i].c);
    }
    ans1/=n;
    ans2/=n;
    cout<<fixed<<setprecision(5)<<ans1<<" "<<ans2<<endl;
    return 0;
}

E、幸运数字Ⅱ
题目大意:
只有4,7的数字叫幸运数字,对于区间[L,r]的每一个数找出第一个大于它的幸运数字,对这些幸运数字求和

难度:
本场比赛的签到题。
题目类型:暴力枚举,贪心

思路:
打表出所有的幸运数字,然后找到第一个不小于L的幸运数字。
打表代码如下,记得要手动加上4444444444,打表要用ll,不然会死循环:

#include<bits/stdc++.h>
#define ll long long
#define  js  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
ll a[1000000];
void dfs(int x) {
    if((a[x]<<3)+(a[x]<<1)+4>1000000000) return;
    a[x<<1]=(a[x]<<3)+(a[x]<<1)+4;
    a[x<<1|1]=a[x<<1]+3;
    dfs(x<<1);
    dfs(x<<1|1);
}
int main() {
    a[1]=0;
    dfs(1);
    for(int i=2;i<=1023;++i) printf("%lld,",a[i]);
}
#include<bits/stdc++.h>
#define ll long long 
#define  js  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
ll dp[1023]={4,7,44,47,74,77,444,447,474,477,744,747,774,777,4444,4447,4474,4477,4744,4747,4774,
4777,7444,7447,7474,7477,7744,7747,7774,7777,44444,44447,44474,44477,44744,44747,44774,44777,47444,
47447,47474,47477,47744,47747,47774,47777,74444,74447,74474,74477,74744,74747,74774,74777,77444,77447,
77474,77477,77744,77747,77774,77777,444444,444447,444474,444477,444744,444747,444774,444777,447444,
447447,447474,447477,447744,447747,447774,447777,474444,474447,474474,474477,474744,474747,474774,
474777,477444,477447,477474,477477,477744,477747,477774,477777,744444,744447,744474,744477,744744,
744747,744774,744777,747444,747447,747474,747477,747744,747747,747774,747777,774444,774447,774474,
774477,774744,774747,774774,774777,777444,777447,777474,777477,777744,777747,777774,777777,4444444,
4444447,4444474,4444477,4444744,4444747,4444774,4444777,4447444,4447447,4447474,4447477,4447744,4447747,
4447774,4447777,4474444,4474447,4474474,4474477,4474744,4474747,4474774,4474777,4477444,4477447,4477474,
4477477,4477744,4477747,4477774,4477777,4744444,4744447,4744474,4744477,4744744,4744747,4744774,4744777,
4747444,4747447,4747474,4747477,4747744,4747747,4747774,4747777,4774444,4774447,4774474,4774477,4774744,
4774747,4774774,4774777,4777444,4777447,4777474,4777477,4777744,4777747,4777774,4777777,7444444,7444447,
7444474,7444477,7444744,7444747,7444774,7444777,7447444,7447447,7447474,7447477,7447744,7447747,7447774,
7447777,7474444,7474447,7474474,7474477,7474744,7474747,7474774,7474777,7477444,7477447,7477474,7477477,
7477744,7477747,7477774,7477777,7744444,7744447,7744474,7744477,7744744,7744747,7744774,7744777,7747444,
7747447,7747474,7747477,7747744,7747747,7747774,7747777,7774444,7774447,7774474,7774477,7774744,7774747,
7774774,7774777,7777444,7777447,7777474,7777477,7777744,7777747,7777774,7777777,44444444,44444447,44444474,
44444477,44444744,44444747,44444774,44444777,44447444,44447447,44447474,44447477,44447744,44447747,44447774,
44447777,44474444,44474447,44474474,44474477,44474744,44474747,44474774,44474777,44477444,44477447,44477474,
44477477,44477744,44477747,44477774,44477777,44744444,44744447,44744474,44744477,44744744,44744747,44744774,
44744777,44747444,44747447,44747474,44747477,44747744,44747747,44747774,44747777,44774444,44774447,44774474,
44774477,44774744,44774747,44774774,44774777,44777444,44777447,44777474,44777477,44777744,44777747,44777774,
44777777,47444444,47444447,47444474,47444477,47444744,47444747,47444774,47444777,47447444,47447447,47447474,
47447477,47447744,47447747,47447774,47447777,47474444,47474447,47474474,47474477,47474744,47474747,47474774,
47474777,47477444,47477447,47477474,47477477,47477744,47477747,47477774,47477777,47744444,47744447,47744474,
47744477,47744744,47744747,47744774,47744777,47747444,47747447,47747474,47747477,47747744,47747747,47747774,
47747777,47774444,47774447,47774474,47774477,47774744,47774747,47774774,47774777,47777444,47777447,47777474,
47777477,47777744,47777747,47777774,47777777,74444444,74444447,74444474,74444477,74444744,74444747,74444774,
74444777,74447444,74447447,74447474,74447477,74447744,74447747,74447774,74447777,74474444,74474447,74474474,
74474477,74474744,74474747,74474774,74474777,74477444,74477447,74477474,74477477,74477744,74477747,74477774,
74477777,74744444,74744447,74744474,74744477,74744744,74744747,74744774,74744777,74747444,74747447,74747474,
74747477,74747744,74747747,74747774,74747777,74774444,74774447,74774474,74774477,74774744,74774747,74774774,
74774777,74777444,74777447,74777474,74777477,74777744,74777747,74777774,74777777,77444444,77444447,77444474,
77444477,77444744,77444747,77444774,77444777,77447444,77447447,77447474,77447477,77447744,77447747,77447774,
77447777,77474444,77474447,77474474,77474477,77474744,77474747,77474774,77474777,77477444,77477447,77477474,
77477477,77477744,77477747,77477774,77477777,77744444,77744447,77744474,77744477,77744744,77744747,77744774,
77744777,77747444,77747447,77747474,77747477,77747744,77747747,77747774,77747777,77774444,77774447,77774474,
77774477,77774744,77774747,77774774,77774777,77777444,77777447,77777474,77777477,77777744,77777747,77777774,
77777777,444444444,444444447,444444474,444444477,444444744,444444747,444444774,444444777,444447444,444447447,
444447474,444447477,444447744,444447747,444447774,444447777,444474444,444474447,444474474,444474477,444474744,
444474747,444474774,444474777,444477444,444477447,444477474,444477477,444477744,444477747,444477774,444477777,
444744444,444744447,444744474,444744477,444744744,444744747,444744774,444744777,444747444,444747447,444747474,
444747477,444747744,444747747,444747774,444747777,444774444,444774447,444774474,444774477,444774744,444774747,
444774774,444774777,444777444,444777447,444777474,444777477,444777744,444777747,444777774,444777777,447444444,
447444447,447444474,447444477,447444744,447444747,447444774,447444777,447447444,447447447,447447474,447447477,
447447744,447447747,447447774,447447777,447474444,447474447,447474474,447474477,447474744,447474747,447474774,
447474777,447477444,447477447,447477474,447477477,447477744,447477747,447477774,447477777,447744444,447744447,
447744474,447744477,447744744,447744747,447744774,447744777,447747444,447747447,447747474,447747477,447747744,
447747747,447747774,447747777,447774444,447774447,447774474,447774477,447774744,447774747,447774774,447774777,
447777444,447777447,447777474,447777477,447777744,447777747,447777774,447777777,474444444,474444447,474444474,
474444477,474444744,474444747,474444774,474444777,474447444,474447447,474447474,474447477,474447744,474447747,
474447774,474447777,474474444,474474447,474474474,474474477,474474744,474474747,474474774,474474777,474477444,474477447,474477474,474477477,474477744,474477747,474477774,474477777,474744444,474744447,474744474,474744477,474744744,474744747,474744774,474744777,474747444,474747447,474747474,474747477,474747744,474747747,474747774,474747777,474774444,474774447,474774474,474774477,474774744,474774747,474774774,474774777,474777444,474777447,474777474,474777477,474777744,474777747,474777774,474777777,477444444,477444447,477444474,477444477,477444744,477444747,477444774,477444777,477447444,477447447,477447474,477447477,477447744,477447747,477447774,477447777,477474444,477474447,477474474,477474477,477474744,477474747,477474774,477474777,477477444,477477447,477477474,477477477,477477744,477477747,477477774,477477777,477744444,477744447,477744474,477744477,477744744,477744747,477744774,477744777,477747444,477747447,477747474,477747477,477747744,477747747,477747774,477747777,477774444,477774447,477774474,477774477,477774744,477774747,477774774,477774777,477777444,477777447,477777474,477777477,477777744,477777747,477777774,477777777,744444444,744444447,744444474,744444477,744444744,744444747,744444774,744444777,744447444,744447447,744447474,744447477,744447744,744447747,744447774,744447777,744474444,744474447,744474474,744474477,744474744,744474747,744474774,744474777,744477444,744477447,744477474,744477477,744477744,744477747,744477774,744477777,744744444,744744447,744744474,744744477,744744744,744744747,744744774,744744777,744747444,744747447,744747474,744747477,744747744,744747747,744747774,744747777,744774444,744774447,744774474,744774477,744774744,744774747,744774774,744774777,744777444,744777447,744777474,744777477,744777744,744777747,744777774,744777777,747444444,747444447,747444474,747444477,747444744,747444747,747444774,747444777,747447444,747447447,747447474,747447477,747447744,747447747,747447774,747447777,747474444,747474447,747474474,747474477,747474744,747474747,747474774,747474777,747477444,747477447,747477474,747477477,747477744,747477747,747477774,747477777,747744444,747744447,747744474,747744477,747744744,747744747,747744774,747744777,747747444,747747447,747747474,747747477,747747744,747747747,747747774,747747777,747774444,747774447,747774474,747774477,747774744,747774747,747774774,747774777,747777444,747777447,747777474,747777477,747777744,747777747,747777774,747777777,774444444,774444447,774444474,774444477,774444744,774444747,774444774,774444777,774447444,774447447,774447474,774447477,774447744,774447747,774447774,774447777,774474444,774474447,774474474,774474477,774474744,774474747,774474774,774474777,774477444,774477447,774477474,774477477,774477744,774477747,774477774,774477777,774744444,774744447,774744474,774744477,774744744,774744747,774744774,774744777,774747444,774747447,774747474,774747477,774747744,774747747,774747774,774747777,774774444,774774447,774774474,774774477,774774744,774774747,774774774,774774777,774777444,774777447,774777474,774777477,774777744,774777747,774777774,774777777,777444444,777444447,777444474,777444477,777444744,777444747,777444774,777444777,777447444,777447447,777447474,777447477,777447744,777447747,777447774,777447777,777474444,777474447,777474474,777474477,777474744,777474747,777474774,777474777,777477444,777477447,777477474,777477477,777477744,777477747,777477774,777477777,777744444,777744447,777744474,777744477,777744744,777744747,777744774,777744777,777747444,777747447,777747474,777747477,777747744,777747747,777747774,777747777,777774444,777774447,777774474,777774477,777774744,777774747,777774774,777774777,777777444,
777777447,777777474,777777477,777777744,777777747,777777774,777777777,4444444444};
int main() {
    js;
    ll ans=0;
    int l,r,mid,a,b;
    cin>>l>>r;
    a=lower_bound(dp,dp+1023,l)-dp;
    for(int i=l;i<=r;++i) {
        if(dp[a]<i)    ++a;
        ans+=dp[a];
    }
    printf("%lld\n",ans);
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值