2018暑假牛客多校(第三场)

A-PACM Team

https://www.nowcoder.com/acm/contest/141/A
就是一个四维的01背包,只不过要记录路径,学到了~

#include"bits/stdc++.h"
#define out(x) cout<<#x<<"="<<x
#define C(n,m) ((long long)fac[(n)]*inv[(m)]%MOD*inv[(n)-(m)]%MOD)
using namespace std;
typedef long long LL;
const int maxn=37;
short dp[maxn][maxn][maxn][maxn];
bool vis[maxn][maxn][maxn][maxn][maxn];
struct AAA 
{
    int c[5],v;
};
AAA a[maxn];
int C1,C2,C3,C4;
void bag01(int n,AAA t)
{

    int c1=t.c[1],c2=t.c[2],c3=t.c[3],c4=t.c[4],v=t.v;
    for(int i=C1;i>=c1;i--)
    {
        for(int j=C2;j>=c2;j--)
        {
            for(int k=C3;k>=c3;k--)
            {
                for(int l=C4;l>=c4;l--)
                {
                    if(dp[i][j][k][l]<dp[i-c1][j-c2][k-c3][l-c4]+v)
                    {
                        dp[i][j][k][l]=dp[i-c1][j-c2][k-c3][l-c4]+v;
                        vis[n][i][j][k][l]=1;
                    }
                }
            }
        }
    }
}
int main()
{
    int N;
    cin>>N;

    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=4;j++)cin>>a[i].c[j];
        cin>>a[i].v;
    }
    cin>>C1>>C2>>C3>>C4;
    memset(vis,0,sizeof vis);

    for(int i=1;i<=N;i++)
    {
        bag01(i,a[i]);
    }
    int cnt=0;
    int ans[maxn];
    memset(ans,0,sizeof(ans));
    for(int i=N,j=C1,k=C2,l=C3,m=C4;i>=1&&j>=0&&k>=0&&l>=0&&m>=0;i--)
    {
        if(vis[i][j][k][l][m])
        {
            j-=a[i].c[1];
            k-=a[i].c[2];
            l-=a[i].c[3];
            m-=a[i].c[4];
            ans[i]=1;
            cnt++;
            continue; 
        }
    }
    cout<<cnt<<endl;
    for(int i=1;i<=N;i++)
    {
        if(ans[i])cout<<i-1<<" ";
    }
    cout<<endl;
}

C-Shuffle Cards

竟然有库函数。。。

#include"bits/stdc++.h"
#include"ext/rope"
#define out(x) cout<<#x<<"="<<x
using namespace __gnu_cxx;
using namespace std;
typedef long long LL;
const int maxn=1e6+5;
rope<int>ro;
int main()
{
    int N,K;
    cin>>N>>K;
    for(int i=1;i<=N;i++)ro.append(i);
    while(K--)
    {
        int L,len;
        cin>>L>>len;
        L--;
        rope<int>tmp;
        tmp=ro.substr(L,len);
        ro.erase(L,len);
        ro.insert(0,tmp);
    }
    for(int i=0;i<N;i++)printf("%d ",ro[i]);
    printf("\n");
}

H-Diff-prime Pairs

https://www.nowcoder.com/acm/contest/141/H
这题。。。当我们队都还在冥思苦想抓头发的时候,ymf说,让我交一哈嘛~,结果,啪的一哈,就过了。。。。。。他才大一啊。。。让我们怎么活啊。。。。

题解:ymf的一句话提醒了我~,要是 ( 2 , 3 ) 阔以的话,那么 ( 4 , 6 ) 也阔以, ( 6 , 9 ) 还是阔以,哇~
好像发现了什么规律。
就是找 g c d = 1 的两个质数,然后他们的倍数也满足条件~
而最多倍数能达到几倍喃?就是 N 除以最大的那个呀,然后这题就完了。。。

#include"bits/stdc++.h"
#define out(x) cout<<#x<<"="<<x
using namespace std;
typedef long long LL;
const int maxn=1e7+5;
vector<int> prime;
bool vis[maxn];
int cnt[maxn]; 
void PRIME(int NN)
{
    memset(vis,1,sizeof(vis));
    for(int i=2;i<=NN;i++)
    {
        if(vis[i])prime.push_back(i);
        for(int j=0;j<prime.size()&&i*prime[j]<=NN;j++)
        {
            vis[i*prime[j]]=0;
            if(i%prime[j]==0)break;
        }
        cnt[i]=prime.size();
    }
}

int main()
{
    PRIME(maxn-5);
    int N;
    while(cin>>N)
    {
        LL ans=0;
        for(int i=2;i<=N;i++)
        {
            if(vis[i])
            {
                ans+=(cnt[i]-1)*(N/i);
            }
        }
        cout<<ans*2<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/SwustLpf/article/details/81269053
今日推荐