对局匹配

刚开始直接拿set录数据做,以为是个水题,没想到WA了,只得了12分

WA代码:

#include <stdio.h>
#include <memory.h>
#include <math.h>
#include <string>
#include <string.h>
#include <vector>
#include <set>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>

#define I scanf
#define OL puts
#define O printf
#define F(a,b,c) for(a=b;a<c;a++)
#define FF(a,b) for(a=0;a<b;a++)
#define FG(a,b) for(a=b-1;a>=0;a--)
#define LEN 3000
#define MAX 0x06FFFFFF
#define V vector<int>

using namespace std;

int main(){
//    freopen("D:/CbWorkspace/blue_bridge/对局匹配.txt","r",stdin);
    int N,K,i,t,ans=0;
    set<int> s;
    I("%d %d",&N,&K) ;
    FF(i,N){
        I("%d",&t);
        if(s.find(t)==s.end()){
            s.insert(t+K);
            s.insert(t-K);
            ans++;
        }
    }
    printf("%d
",ans);
    return 0;
}
View Code

看了大佬的代码,终于知道原来是dp。只要思路对,一切都不是问题。

搬运自大佬博客:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define MAX_SCORE 100000
const int maxn = 100000 + 5;
int cnt[MAX_SCORE+5], val[maxn], dp[maxn];
int n, k;

int main() {
    while(scanf("%d%d", &n, &k) == 2) {
        memset(cnt, 0, sizeof(cnt));
        int score, ans = 0;
        for(int i = 1; i <= n; i++) {
            scanf("%d", &score);
            cnt[score]++;
        }
        //特殊处理k=0的情况
        if(k == 0) {
            for(int i = 0; i <= MAX_SCORE; i++) {
                if(cnt[i]) ans++;
            }
        } 
        else {
            for(int i = 0; i < k; i++) {
                int m = 0;
                for(int j = i; j <= MAX_SCORE; j+=k) {
                    val[m++] = cnt[j];
                }
                dp[0] = val[0];
                for(int j = 1; j < m; j++) {
                    if(j == 1) dp[j] = max(dp[0], val[j]);
                    else dp[j] = max(dp[j-2] + val[j], dp[j-1]);
                }
                ans += dp[m-1];
            }
        }
        printf("%d
", ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TQCAI/p/8458721.html