8.23贝壳找房开发岗笔试(c++)

第一题,卡路里,排序后顺序减就行了
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
int n,s;
int main()
{
    scanf("%d %d",&n,&s);
    int c[n];
    for(int i=0;i<n;i++)
        scanf("%d",&c[i]);
    sort(c,c+n);
    int ans=0;
    for(int i=0;i<n;i++)
    {
        if(s>=c[i])
        {
            s-=c[i];
            ans++;
        }
        else
            break;
    }
    printf("%d\n",ans);
}
第二题,让字符串出现k次的最小字符串长度
实际上就是问字符串的前x个和后x个完全一样,数据范围很小,直接暴力就行了
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;
int n,k;
char s[55];
int ans;
int main()
{
    scanf("%d %d",&n,&k);
    scanf("%s",s);
    for(int i=1;i<=n-1;i++)
    {
        int flag=1;
        for(int j=0;j<i;j++)
        {
            if(s[j]!=s[n-i+j])
            {
                flag=0;
                break;
            }
        }
        if(flag)
            ans=i;
    }
    printf("%s",s);
    for(int i=1;i<k;i++)
        printf("%s",s+ans);
    printf("\n");
}

第三题,买的最多的贝壳数量,实际上就是模拟那个过程就行了,注意一下,最后贝壳的总数量可能超过int上限,所以说中间部分变量需要使用long long
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>

using namespace std;
int n;
int num[111];
int dp[11111];
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d %d",&x,&y);
        long long num=m/y;
        if(num>x)
        {
            ans+=x;
            m-=(long long)y*x;
        }
        else
        {
            ans+=num;
            m-=(long long)y*num;
        }
    }

    cout<<ans<<endl;
}

第四题,背包的综合运用,第一步实际上是问一个容量为sum/2的背包最多能装多少东西,每个物品价值=体积
接下来第二步,对于sum分成的差值最小的两个部分,分别再做一次背包,这时候令每个物品的价值等于1,同时dp转移的时候判断一下状态是不是合法就行了
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>

using namespace std;
int n;
int num[111];
int dp[11111];
int sum,sum1,sum2;
int main()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&num[i]);
        sum+=num[i];
    }
    sum1=sum/2;
    for(int i=0;i<n;i++)
    {
        for(int j=sum1;j>=num[i];j--)
        {
            dp[j]=max(dp[j],dp[j-num[i]]+num[i]);
        }
    }
    sum2=sum-dp[sum1];
    printf("%d ",sum2-dp[sum1]);
    memset(dp,-1,sizeof(dp));
    dp[0]=0;
    for(int i=0;i<n;i++)
    {
        for(int j=sum2;j>=num[i];j--)
        {
            if(dp[j-num[i]]!=-1)
            {
                if(dp[j]==-1)
                {
                    dp[j]=dp[j-num[i]]+1;
                }
                else
                {
                    dp[j]=max(dp[j],dp[j-num[i]]+1);
                }
            }
        }
    }
    int ans=abs(n-dp[sum2]-dp[sum2]);
    memset(dp,-1,sizeof(dp));
    dp[0]=0;
    for(int i=0;i<n;i++)
    {
        for(int j=sum-sum2;j>=num[i];j--)
        {
            if(dp[j-num[i]]!=-1)
            {
                if(dp[j]==-1)
                {
                    dp[j]=dp[j-num[i]]+1;
                }
                else
                {
                    dp[j]=max(dp[j],dp[j-num[i]]+1);
                }
            }
        }
    }
    ans=max(ans,abs(n-dp[sum-sum2]-dp[sum-sum2]));
    printf("%d\n",ans);
}



#笔试题目##贝壳找房##C++工程师##校招#
全部评论
学***佬思路 #include <iostream> // #include <cstring> #include <memory.h> using namespace std; const int N = 1e5 + 10; int nums[N], dp[N]; int n, sum, sum1, sum2, res;   int main(){     cin >> n;     for(int i=1; i<=n; ++i){         cin >> nums[i];         sum += nums[i];     }           for(int i=1; i<=n; ++i)         for(int j=sum/2; j-nums[i]>=0; --j)             dp[j] = max(dp[j], dp[j-nums[i]] + nums[i]);           sum1 = dp[sum/2];     memset(dp, -1, sizeof dp);     dp[0] = 0;           for(int i=1; i<=n; ++i)         for(int j=sum1; j-nums[i]>=0; --j)             if(dp[j-nums[i]] != -1)                 dp[j] = max(dp[j], dp[j-nums[i]] + 1);                       res = abs(dp[sum1] - (n - dp[sum1]));           sum2 = sum - sum1;     memset(dp, -1, sizeof dp);     dp[0] = 0;     for(int i=1; i<=n; ++i)         for(int j=sum2; j-nums[i]>=0; --j)             if(dp[j-nums[i]] != -1)                 dp[j] = max(dp[j], dp[j-nums[i]] + 1);           res = max(res, abs(dp[sum2] - (n - dp[sum2])));     cout << abs(sum1 - sum2) << ' ' << res << endl;           return 0; }
点赞 回复
分享
发布于 2019-09-08 09:48
刚做完测评结果编程题目我都忘了。。。大佬能提示一下吗😂
点赞 回复
分享
发布于 2019-08-23 22:29
小红书
校招火热招聘中
官网直投

相关推荐

3 40 评论
分享
牛客网
牛客企业服务