腾讯2018春招技术类编程题汇总 题解

https://www.nowcoder.com/test/10611931/summary

在这里插入图片描述思路:水题不解释,代码没有化简。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll n,m;

int main()
{
    cin>>n>>m;
    cout<<n/(2*m)*m*m<<endl;
    return 0;
}

在这里插入图片描述思路:水题,排完序后从大到小依次选取。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int maxn=1e5+5;

int a[maxn];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&a[i]);
    sort(a,a+n);
    ll sum1=0,sum2=0;
    for(int i=n-1,j=1;i>=0;i--,j++)
    {
        if(j&1)
            sum1+=a[i];
        else
            sum2+=a[i];
    }
    printf("%lld\n",sum1-sum2);
    return 0;
}

在这里插入图片描述
思路:二分第一天吃的巧克力块数。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    int l=1,r=m,mid;
    while(l<=r)
    {
        mid=(l+r)>>1;
        int sum=mid,tmp=mid;
        for(int i=1;i<n&&sum<=m;i++)
        {
            tmp=(tmp+1)>>1;
            sum+=tmp;
        }
        if(sum>m)
            r=mid-1;
        else
            l=mid+1;
    }
    printf("%d\n",r);
    return 0;
}

在这里插入图片描述思路: d p dp ,类似于背包问题,设 d p [ i ] dp[i] 表示总长度恰好为 i i 的歌单有多少种组成方法,那么对于一首长度为 j j 的歌,有: d p [ i ] = d p [ i ] + d p [ i j ] dp[i]=dp[i]+dp[i-j]

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;

const int mod=1e9+7;

int dp[1005];

int main()
{
    int k,a,b,x,y;
    scanf("%d%d%d%d%d",&k,&a,&x,&b,&y);
    dp[0]=1;
    for(int i=0;i<x;i++)
        for(int j=k;j>=a;j--)
                dp[j]=(dp[j]+dp[j-a])%mod;
    for(int i=0;i<y;i++)
        for(int j=k;j>=b;j--)
                dp[j]=(dp[j]+dp[j-b])%mod;
    printf("%d\n",dp[k]);
    return 0;
}


在这里插入图片描述思路:这题出错了。改题面改的相当失败, 200 x i + 3 y i 200*x_i+3*y_i 收益造成了贪心的错误,网上大部分题解都是错误的,即使正确也很难在这个数据范围下快速给出答案。不过还是给出 A C AC 代码。顺便给出一个 h a c k hack 数据:
1    2 1\ \ 2
2    80 2\ \ 80
2    0 2\ \ 0
1    80 1\ \ 80
显然最优解是 1    440 1\ \ 440 ,然而下面代码给出的答案是错误的。

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;

const int maxn=1e5+5;

int cnt[105];

struct node
{
    int x,y;
    node(){}
    node(int xx,int yy):x(xx),y(yy){}
    bool operator <(const node &a)const
    {
        return x>a.x;
    }
}a[maxn],b[maxn];

int main()
{
    int n,m,x,y;
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
    {
        scanf("%d%d",&x,&y);
        a[i]=node(x,y);
    }
    for(int i=0;i<m;i++)
    {
        scanf("%d%d",&x,&y);
        b[i]=node(x,y);
    }
    sort(a,a+n);
    sort(b,b+m);
    int ct=0;
    ll ans=0;
    for(int i=0,j=0;i<m;i++)
    {
        while(j<n&&a[j].x>=b[i].x)
            ++cnt[a[j].y],++j;
        for(int k=b[i].y;k<=100;k++)
        {
            if(cnt[k])
            {
                ++ct,ans+=200*b[i].x+3*b[i].y;
                --cnt[k];
                break;
            }
        }
    }
    printf("%d %lld\n",ct,ans);
    return 0;
}

在这里插入图片描述
在这里插入图片描述思路:模拟题,分两次考虑,第一次只考虑斜率为 1 1 的情况,第二次只考虑斜率为 1 -1 的情况。那么只要某个点的颜色和最终的颜色不一样,就一定要沿着这条线画下去,模拟就完事了。

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;

int n,m,ans;
char a[55][55],b[55][55];

void modify1(int x,int y)
{
    bool flag=0;
    while(x>=0&&x<n&&y>=0&&y<m)
    {
        if((a[x][y]=='B'||a[x][y]=='G')&&b[x][y]=='X')
        {
            flag=1;
            b[x][y]='B';
            x++,y--;
        }
        else
            break;
    }
    ans+=flag;
}

void modify2(int x,int y)
{
    bool flag=0;
    while(x>=0&&x<n&&y>=0&&y<m)
    {
        if(a[x][y]=='B'||a[x][y]=='X'||a[x][y]==b[x][y])
            break;
        flag=1;
        if(b[x][y]=='X')
            b[x][y]='Y';
        else if(b[x][y]=='B')
            b[x][y]='G';
        x++,y++;
    }
    ans+=flag;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;i++)
        scanf("%s",a[i]);
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            b[i][j]='X';
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            modify1(i,j);
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
            modify2(i,j);
    printf("%d\n",ans);
    return 0;
}

发布了677 篇原创文章 · 获赞 30 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/xiji333/article/details/104544505