250分:
暴力就行了
/*************************************************************************
> File Name: 250.cpp
> Author: ALex
> Mail: zchao1995@gmail.com
> Created Time: 2015年05月15日 星期五 20时42分55秒
************************************************************************/
#include <functional>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#include <set>
#include <vector>
using namespace std;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const double eps = 1e-15;
typedef long long LL;
typedef pair <int, int> PLL;
struct node {
int l, r;
};
class LittleElephantAndBallsAgain {
public:
int getNumber(string str) {
int n = str.length();
int ans = inf;
for (int i = 0; i < n;) {
int l = i, r = i;
while (i < n && str[i] == str[i + 1]) {
++i;
++r;
}
ans = min(ans, l - 1 + n - r);
++i;
}
return ans;
}
};
500分:
状压然后hash下
/*************************************************************************
> File Name: 500.cpp
> Author: ALex
> Mail: zchao1995@gmail.com
> Created Time: 2015年05月15日 星期五 21时29分17秒
************************************************************************/
#include <functional>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#include <set>
#include <vector>
using namespace std;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const double eps = 1e-15;
typedef long long LL;
typedef pair <int, int> PLL;
set <string> st;
char str[110];
class LittleElephantAndIntervalsDiv2 {
public:
int getNumber(int M, vector<int> l, vector<int> r) {
int n = l.size();
int ans = 0;
st.clear();
for (int i = 0; i < (1 << n); ++i) {
for (int j = 0; j < M; ++j) {
str[j] = '0';
}
for (int j = 0; j < n; ++j) {
if (i & (1 << j)) {
for (int k = l[j] - 1; k <= r[j] - 1; ++k) {
str[k] = '1';
}
}
else {
for (int k = l[j] - 1; k <= r[j] - 1; ++k) {
str[k] = '0';
}
}
}
str[M] = '\0';
if (st.find(str) == st.end()) {
st.insert(str);
}
}
ans = st.size();
return ans;
}
};
1000分:
类似于数位dp
把A,B,C拆成二进制,然后用数位dp枚举某一位开始变小的方法去记忆化搜索一下
dp[cur][flag1][flag2][flag3]
表示到第cur位,A是否受到限制,B是否受到限制hi,C是否受到限制的方案数
原来想的是只拆A,B然后同样做法,最后如果得到的数字异或以后<=C,就返回1,不然就是0,但是不知道为什么每次算出来的都比答案大一些
/*************************************************************************
> File Name: 1000.cpp
> Author: ALex
> Mail: zchao1995@gmail.com
> Created Time: 2015年05月15日 星期五 22时12分33秒
************************************************************************/
#include <functional>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <queue>
#include <stack>
#include <map>
#include <bitset>
#include <set>
#include <vector>
using namespace std;
const double pi = acos(-1.0);
const int inf = 0x3f3f3f3f;
const double eps = 1e-15;
typedef long long LL;
typedef pair <int, int> PLL;
LL dp[40][2][2][2];
int bitA[40], bitB[40], bitC[40];
LL dfs(int cur, bool flag1, bool flag2, bool flag3) {
if (cur == -1) {
return 1;
}
if (~dp[cur][flag1][flag2][flag3]) {
return dp[cur][flag1][flag2][flag3];
}
LL ans = 0;
int end1 = (flag1 ? bitA[cur] : 1);
int end2 = (flag2 ? bitB[cur] : 1);
for (int i = 0; i <= end1; ++i) {
for (int j = 0; j <= end2; ++j) {
int z = i ^ j;
if (flag3 && z > bitC[cur]) {
continue;
}
ans += dfs(cur - 1, flag1 && i == end1, flag2 && j == end2, flag3 && z == bitC[cur]);
}
}
dp[cur][flag1][flag2][flag3] = ans;
return ans;
}
LL calc(int A, int B, int C) {
int cnt1 = 0, cnt2 = 0, cnt3 = 0;
while (A) {
bitA[cnt1++] = A % 2;
A /= 2;
}
while (B) {
bitB[cnt2++] = B % 2;
B /= 2;
}
while (C) {
bitC[cnt3++] = C % 2;
C /= 2;
}
int maxs = max(cnt1, max(cnt2, cnt3));
for (int i = cnt1; i < maxs; ++i) {
bitA[i] = 0;
}
for (int i = cnt2; i < maxs; ++i) {
bitB[i] = 0;
}
for (int i = cnt3; i < maxs; ++i) {
bitC[i] = 0;
}
cnt1 = cnt2 = cnt3 = maxs;
return dfs(cnt1 - 1, 1, 1, 1);
}
class LittleElephantAndXor {
public:
LL getNumber(int A, int B, int C) {
memset(dp, -1, sizeof(dp));
return calc(A, B, C);
}
};