ATCoder abc165_c Many Requirements

一、写在前面

最近打了几场codeforces,发现自己很菜,因为不熟悉题型,很多简单构造题都做不出来。于是一边感叹自己菜一边翻博客,看到codeforces上一个大佬写了一篇很好的博客,TutorialA way to Practice Competitive Programming : From Rating 1000 to 2400+
里面推荐要打div2的前几道题最好先刷一些Atcoder里面的beginner contest 的BCD题。同时多做一做codeforces的复现赛找找感觉。所以最近会加做一些Atcoder的题目。

二、算法分析

理解题意之后先直接想,会觉得A序列不太好构建,于是直觉感觉和枚举有关,看了一眼数据范围果然不负所望。然后想到枚举变dfs,用一个数组w存序列,然后直接就能写出来了。详见代码。

三、代码及注释

#include
#include
#include
#include
using namespace std;
int n,m,q;
const int N=55;
int a[N],b[N],c[N],d[N];
int ans;
int w[12];                                 //存搜索的数字用
int calc(){
    int res=0;
    for(int i=1;i<=q;i++){
        if(w[b[i]]-w[a[i]]==c[i]) res+=d[i];
    }    
    return res;
}
void dfs(int cur){
    if(cur>n){
        ans=max(ans,calc());
        return;
    }
    for(int i=w[cur-1];i<=m;i++){
        w[cur]=i;
        dfs(cur+1);
    }
}
int main(){
    
    cin>>n>>m>>q;
    w[1]=1;
    for(int i=1;i<=q;i++){
        cin>>a[i]>>b[i]>>c[i]>>d[i];
    }
    
    dfs(2);
    
    cout<<ans<<endl;
    
    return 0;
    
}

你可能感兴趣的:(构造)