您的位置:首页 > 其它

SRM 562 DIV2

2012-12-01 15:24 281 查看
1、第一个,水题,直接求最大值即可,略。

2、根据题目,clipboard最大的时候是50,则可以得到,当粘贴超过50次以后,每次增长的个数是肯定是固定个数。

  写的时候为了保险,把50换到了100多。

#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <map>
#include <algorithm>
#include <stack>
#include <queue>
#include <cmath>
using namespace std;
typedef long long ll;
const int sz_pix = 160;
int num[sz_pix];
bool judge[sz_pix][sz_pix];
class PastingPaintingDivTwo {
public:
long long countColors(vector<string> clipboard, int T) {
int r = clipboard.size();
int c = clipboard[0].size();
for (int i = 0; i < sz_pix; i++)
for (int j = 0; j < sz_pix; j++) {
num[i] = 0;
judge[i][j] = false;
}
for (int i = 0; i < 105; i++) {
for (int a = 0; a < r; a++) {
for (int b = 0; b < c; b++) {
if ((!judge[i + a][i + b]) && (clipboard[a][b] == 'B')) {
judge[i + a][i + b] = true;
num[i]++;
}
}
}
}
if (T > 103) {
ll inc = num[102] ;
ll remain = T - 103;
ll tmp = remain * inc;
ll res = tmp;
for (int i = 0; i < 103; i++) {
res += num[i];
}
return res;
}
ll res = 0;
for (int i = 0; i < T; i++) {
res += num[i];
}
return res;

}
};


3、动态规划+状态压缩的问题。

  

#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>
#include <map>
#include <algorithm>
#include <stack>
#include <queue>
#include <cmath>
using namespace std;
typedef long long ll;
ll num[15][15][1 << 14];

bool path[15][15];
class RandomOption {
public:
double getProbability(int keyCount, vector<int> badLane1,
vector<int> badLane2) {

for (int i = 0; i < keyCount; i++)
num[0][i][1 << i] = 1;

int sz = badLane1.size();
for (int i = 0; i < sz; i++) {
int s = badLane1[i];
int e = badLane2[i];
path[s][e] = path[e][s] = true;
}
for (int i = 1; i < keyCount; i++) {
for (int j = 0; j < keyCount; j++) {
for (int pre = 0; pre < (1 << keyCount); pre++) {
for (int k = 0; k < keyCount; k++) {
if (path[j][k] || (pre & (1 << k)))
continue;
int now = pre | (1 << k);
num[i][k][now] += num[i - 1][j][pre];
};
}
}

}
double all = 1;
int keyCount1 = keyCount;
while (keyCount1) {
all *= keyCount1;
keyCount1--;
}
double pos = 0;
for (int i = 0; i < keyCount; i++) {
pos += num[keyCount - 1][i][(1 << keyCount) - 1];
}

double res = pos / all;
return res;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: