2020牛客暑假多校集训第八场(补题)

I – Interesting Computer Game
题目大意:
• 给了两个数组a与b。
• 第i步可以从a和b中选择一个数。
• 求最后选出的数中,不同的数要最多。
思路:我开始用map来模拟a与b数字的选择,但答案总是错误,实际上应该把不同的数当成图中的点。二元数组a,b当成是一条边,最后构成图,如果转化成图之后有的地方形成了环的话,说明其中的点多次出现,每个都可以取到,对于没有构成环的部分,可能有个点只出现过一次。(利用并查集来解)

#include<iostream>
#include<map>
using namespace std;
const int maxn=1e5+10,maxe=2e5+10;
map<int,int> mp;
int a[maxn],b[maxn];
bool vis[maxe];
int f[maxe],n;

int findfather(int x){
    if(x!=f[x])  f[x]=findfather(f[x]);
    return f[x];
}
void bin()
{
int x,y;
     for(int i=1;i<=n;i++){
            x=findfather(mp[a[i]]),y=findfather(mp[b[i]]);
            if(x!=y){
                f[x]=y;
                if(vis[x]||vis[y])  vis[y]=1,vis[x]=1;
            }
            else  vis[y]=1;
        }
}
int main(){
    int T;
    cin>>T;
    for(int k=1;k<=T;k++){
        int num=1;
       cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i]>>b[i];
            if(!mp[a[i]])  mp[a[i]]=num++;
            if(!mp[b[i]])  mp[b[i]]=num++;
        }
        for(int i=1;i<=num;i++)  f[i]=i,vis[i]=0;
        bin();
        int ans=num-1;
        for(int i=1;i<num;i++){
            if(f[i]==i&&vis[i]==0)   ans--;
        }
         cout<<"Case #"<<k<<": "<<ans<<endl;
       mp.clear();
    }
}

I – Interesting Computer Game
题意:
• 有n种菜,每种菜的数量为bi, 每个菜的盈利为 ai。
• 每个顾客必须从第1种菜开始,连续地吃,每种吃一个。
• 保证顾客最多的情况下,盈利最大。
思路:
由题意可以,顾客最多的数量就是b1,而且将b数组处理,后面每一位都比前面的数小,之后就可以比较数组a的前缀和,取出最大的数,因为b数组处理后每一位都比前面的数小,我们从后往前枚举前缀和。因为long long会超出,使用long double。

#include<iostream>
using namespace std;
const int maxn=2e5+10;
typedef long long ll;
int t,n,a[maxn],b[maxn];
long double c[maxn];
int main(){
    cin>>t;
    for(int k=1;k<=t;k++){
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            c[i]=c[i-1]+a[i];
        }
        ll u=c[1];
        a[1]=1;
        for(int i=2;i<=n;i++){
            if(c[i]<=u)    a[i]=0;
            else{
                a[i]=1;
                u=c[i];
            }
        }
        b[0]=1e5+10;
        for(int i=1;i<=n;i++){
           cin>>b[i];
            b[i]=min(b[i-1],b[i]);
        }
        int l=0;
        long double ans=0;
        for(int i=n;i>=1;i--)
            if(a[i]!=0){
                ans+=c[i]*(b[i]-l);
                l=b[i];
            }
       printf("Case #%d: %d %.0Lf\n",k,b[1],ans);

    }
}
全部评论

相关推荐

10-19 10:28
已编辑
西南石油大学 后端工程师
团孝子已上线feeling:面了很多家公司,能感受到目前只有小公司+外包喜欢问八股。大厂虽然也问八股,但是是从实习、项目中进行提问,并且大厂会问很深,面试官也会对你的回答进行思考➕追问,所以准备大厂面试前一定要备好相关资料。对于算法,我做的是codetop前100+力扣hot100+力扣高频150,面试中实感hot100就足够,基本上只要是hot100就秒答。对于项目和八股,我做的也是烂大街的星球项目,八股则是看小林和问ai,自己也写了很多技术博客和画了很多思维导图,并且自己也尝试用嘴巴说出来,不只停留于纸面。运气也很重要,必须要让面试官/HR看到简历才行,所以建议投递时间是下午两点。tl:第一岗位9.9&nbsp;投递9.10&nbsp;一面(一面评价:最近见过最强的大三,结束五分钟后约二面,都晚上九点了不下班吗)9.11&nbsp;二面(三道算法a出两道,反问评价:经验不够等横向,我实习生要啥经验)9.21挂(实习时间过短+其他原因,想要一年实习的,为什么不招个正职)第二岗位10.10投递10.11约面(主管打电话,说看到我之前投递记录了想要我挂qa职进去干后端,同意)10.14&nbsp;一面(无八股,主动说确实很强,意愿很强)10.16&nbsp;oc其余,友邦,东软,东华,惠择,用友oc已拒京东测开一面挂(投后端被测开捞)腾讯测试已拒(投后端被测开捞)ps:表扬惠择的主管面,没怎么问技术(可能是一面面试官沟通过了),全程一起讲大道理,解答了心中很多疑惑,也告诉我以面试官角度来看怎么选候选人,如果可以下次一定选惠择
HeaoDng:美团好像可以触发一面通
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务