SRM 653 CountryGroupHard
题意:
n 个人坐成一排,同一个国家的人坐在一起,记者问了一些人他们的国家有多少人,他们都回答了正确的信息。已知m条信息,每条信息形如第 pi 个位置上的人的国家有 ai 个人,求已知了这些信息能否推断出所有人所属国家的情况。
分析:
f[i]表示到第i个位置,方案数是多少。然后枚举后面的多少人属于一个国家的。当f[i]>2的时候,设为2就行。初始化f[n]=1。
代码:
/*
* @Author: mjt
* @Date: 2018-10-17 20:55:42
* @Last Modified by: mjt
* @Last Modified time: 2018-10-17 21:37:10
*/
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#include<cctype>
#include<set>
#include<vector>
#include<queue>
#include<map>
#define fi(s) freopen(s,"r",stdin);
#define fo(s) freopen(s,"w",stdout);
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} class CountryGroupHard{
public:
int f[];
string solve(vector <int> a) {
int n = a.size();
f[n] = ;
for (int i = n - ; i >= ; --i) {
if (a[i] == ) {
int ok = -;
for (int j = ; (i + j) <= n; ++j) {
if (a[i + j - ] != ) { // 最近的有数的位置
if (ok != - && ok != a[i + j - ]) break;
else ok = a[i + j - ];
}
if (ok == - || ok == j) f[i] += f[i + j];
}
}
else {
bool ok = (i + a[i] > n); // 要求后面的a[i]个相等
for (int j = i; j < n && j < i + a[i]; ++j)
if (a[j] && a[j] != a[i]) ok = true;
if (!ok) f[i] = f[i + a[i]];
}
if (f[i] >= ) f[i] = ;
}
return f[] > ? "Insufficient" : "Sufficient";
} };