記第一次正式線上筆試(Tencent——正式考-技術研發類-綜合-2018實習生招聘)

選擇題作的跟傻逼同樣,很少說了。。大學只打了ACM還不是計算機科班出身的我,連好多名詞都不認識。。。。。node

三道編程題很簡單,下面給出三道題的大體題意以及題解。ios

1.給出n和m,知足(2m)能夠整除n。求a1~an的和,m表示每m個數變一次符號,ai知足|ai|=i。c++

例如n=8,m=2,則數列爲 -1 -2 3 4 -5 -6 7 8算法

題解:規律是顯然的,每2m個數分別求一下部分和,顯然是m*m,而後把全部的部分和累加起來,爲n/(2m)*m*m=n*m/2編程

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;

int main()
{
    LL n,m;
    while(cin>>n>>m)
        cout<<n*m/2<<'\n';
}

2.給出X個長爲A的小棍和Y個長爲B的小棍,恰拼出一個長爲K的小棍,其中全部小棍兩兩顏色不一樣,拼接時不考慮順序,求問共有多少種合法方案。spa

題解:答案就是下面的這個公式code

#include<cstdio>
#include<iostream>
using namespace std;
typedef long long LL;

const int N=1000+5;
const int mod=1e9+7;

LL qpow(LL x,LL n)
{
    LL ret=1;
    for(;n;n>>=1)
    {
        if(n&1) ret=ret*x%mod;
        x=x*x%mod;
    }
    return ret;
}

LL fac[N],inv_of_fac[N];

void init()
{
    fac[0]=1;
    for(int i=1;i<N;i++) fac[i]=fac[i-1]*i%mod;
    inv_of_fac[N-1]=qpow(fac[N-1],mod-2);
    for(int i=N-2;i>=0;i--) inv_of_fac[i]=inv_of_fac[i+1]*(i+1)%mod;
}

LL C(LL a,LL b)
{
    if(a<b||b<0) return 0;
    return fac[a]*inv_of_fac[b]%mod*inv_of_fac[a-b]%mod;
}

int main()
{
    init();
    LL K,A,B,X,Y;
    while(cin>>K>>A>>X>>B>>Y)
    {
        LL ans=0;
        for(int i=0;i<=X&&i*A<=K;i++)
        {
            if((K-i*A)%B==0)
            {
                LL t=(K-i*A)/B;
                ans+=C(X,i)*C(Y,t);
                ans%=mod; 
            }
        }
        cout<<ans<<'\n';
    }
}

3.有n臺機器和m個任務。每一個機器一天有一個最多工做時間(<1000?)和能力level(<100),每一個任務有所需時間time(<1000?)和最低所需機器能力level(<100),完成一個任務的對應收益爲200*time+3*level,每一個機器一天最多一個任務,求問最多一天完成多少任務,若是有多種方案,給出最大收益。blog

題解:貪心,對機器按照能力爲第一關鍵字,時間爲第二關鍵字,由小到大排序,依次從剩餘任務中選取,(可以完成而且總價值最大)的任務,具體的算法見代碼。排序

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

const int N=1e2+5;

struct node
{
    int t;
    int v;
    int used=0;
    node() {}
    node(int t_,int v_)
    {
        t=t_,v=v_,used=0;
    }
    bool operator<(const node& rhs)const
    {
        if(used!=rhs.used) return used>rhs.used;
        return t*200+v*3<rhs.t*200+rhs.v*3;
    }
};

vector<int> a[N],b[N];
vector<node> c;
int n,m;
LL ans=0,ans1=0;

void init()
{
    for(int i=0; i<N; i++) a[i].clear(),b[i].clear();
    c.clear();
    ans=0,ans1=0;
}

int main()
{
    scanf("%d%d",&n,&m);
    init();
    for(int i=0; i<n; i++)
    {
        int t,v;
        scanf("%d%d",&t,&v);
        a[v].push_back(t);
    }
    for(int i=0; i<m; i++)
    {
        int t,v;
        scanf("%d%d",&t,&v);
        b[v].push_back(t);
    }
    for(int i=0; i<N; i++)
    {
        sort(a[i].begin(),a[i].end());
        for(int j=0; j<b[i].size(); j++) c.push_back(node(b[i][j],i));
        sort(c.begin(),c.end());
        for(int j=0; j<a[i].size(); j++)
        {
            int pos=upper_bound(c.begin(),c.end(),node(a[i][j],i))-c.begin()-1;
            if(pos<0) continue;
            while(pos>=0&&c[pos].used) pos--;
            if(pos<0) continue;
            c[pos].used=1;
            ans1++;
            ans+=c[pos].t*200+c[pos].v*3;
        }
    }
    printf("%lld %lld\n",ans1,ans);
}
相關文章
相關標籤/搜索