2018牛客多校第三场个人总结
A PACM Team
背包dp经典题,也不算是太复杂的变形,直接dp就行了,注意卡空间,用short
 #include <bits/stdc++.h>
#define mem(ar,num) memset(ar,num,sizeof(ar))
#define me(ar) memset(ar,0,sizeof(ar))
#define lowbit(x) (x&(-x))
#define Pb push_back
#define FI first
#define SE second
#define For(i,a,b) for(int i = (a); i < (b); ++i)
#define IOS ios::sync_with_stdio(false)
using namespace std;
const int maxn = 40;
short  F[maxn][maxn][maxn][maxn][maxn];
short a[maxn], b[maxn],c[maxn],d[maxn];
short v[maxn];
short vv[maxn];
bool  dp[maxn][maxn][maxn][maxn][maxn];
int main(void)
{
   int n;
   cin>>n;
  short  A,B,C,D;
   for(int i = 1;i <= n; ++i)
      cin>>a[i]>>b[i]>>c[i]>>d[i]>>v[i];
   cin>>A>>B>>C>>D;
   me(F);
   For(i,1,n+1){
        For(aa,0,A+1){
            For(bb,0,B+1){
                For(cc,0,C+1){
                    For(dd,0,D+1){
                        F[i][aa][bb][cc][dd] = F[i-1][aa][bb][cc][dd];
                        if(aa >= a[i]&&bb >= b[i]&&cc >= c[i]&&dd >= d[i])
                        F[i][aa][bb][cc][dd] =  max((int)F[i][aa][bb][cc][dd],F[i-1][aa-a[i]][bb - b[i]][cc-c[i]][dd-d[i]]+v[i]);
                       }
                   }
               }
           }
         }
    short   Aa = A,Bb = B,Cc = C,Dd = D;
    short   Max = 0;
   for(int aa=0;aa <= A; ++aa){
            for(int bb = 0;bb <= B;++bb){
                for(int cc = 0;cc <= C; ++cc){
                    for(int dd = 0; dd <= D; ++dd ){
                        if(F[n][aa][bb][cc][dd] > Max){
                            Aa  = aa,Bb = bb,Cc = cc,Dd = dd;
                            Max = F[n][aa][bb][cc][dd];
                        }
                    }
                }
            }
        }
    int tot = 0;
    for(int i = n; i > 0;--i){
        if(Aa >= a[i]&&Bb >= b[i]&&Cc >= c[i]&&Dd >= d[i])
        {
            if(F[i][Aa][Bb][Cc][Dd] == F[i-1][Aa-a[i]][Bb-b[i]][Cc-c[i]][Dd-d[i]]+v[i]){
             vv[tot++] = i,Aa -=a[i],Bb -= b[i], Cc -= c[i],Dd -= d[i];
             }
     }
    }  
    cout<<tot<<endl;
    for(int i = tot-1;i >= 0; --i){
         cout<<vv[i]-1; if(i)putchar(' ');
    }
   return 0;
}  2 B Expected Number of Nodes
概率题+dp题,有空补题
3 C Shuffle Cards
伸展树或者rope的应用
D Encrypted String Matching
FFT 的应用
E Sort String
kmp或者hash求最小循环节
F Sum Of Digit
数学+ 数据结构
G Coloring Tree
数学 + BFS
H Diff-prime Pairs
数论打表+简单计数 
 假设gcd(i,j) = d,我们e枚举d的值, 
         表示到i共有多少个素数 
        
I Expected Size of Random Convex Hull
Geometry, Random algo 几何题,随机算法
J Distance to Work
求简单多边形和圆相交的面积 + 二分,直接套板子 
 参考代码

京公网安备 11010502036488号