今天topcoder DIV2只做了一个题,掉rateing了,离DIV1呼一下又远了……
A题:比较简单,模拟一下即可,只是描述挺长的,做的慢
B题:最后没来的及提交,但提交了也不对,有两个小错误,一个是少了break,一个是j写成了i。当时不知道能在编译器中产生main()函数代码,没来的及调。
思路:对小球排序,对平台的位置排序,然后枚举每一个平台,找到这个平台位置所在小球的区间,计算平台移动的最大区间,便可算出有多少种放法,复杂度可以达到O(50 + 50),但当时为了保险、方便,写了O(50 * 50),最后没出来这道题,比较遗憾……
C题:后来看的,感觉是搜索,想了很长时间应该怎么去搜,刚开始感觉很麻烦,没处下手,后来发现思路很简单,就是每次找图形中找最上、最左的没有搜过的点,然后从这点开始往右、往下搜,代码也比较简单,复杂度很高,没有剪枝,效率低。本机测试一个4*4的数据,跑了24秒……还没想到优化,就提交了,发现数据中就一个4*4的,其它的都搜过去了,不知如何优化……
B题代码:
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <utility>
#include <ctime>
using namespace std;
#define x first
#define y second
#define LL long long
const LL mod = 1000000009;
typedef pair<int, int> pii;
pii p[100];
class YetAnotherIncredibleMachine {
public:
int countWays(vector <int>, vector <int>, vector <int>);
};
int YetAnotherIncredibleMachine::countWays(vector <int> platformMount, vector <int> platformLength, vector <int> balls) {
int n = platformMount.size();
int m = balls.size();
LL ans = 1, lef, rig, t;
int flag = 0;
for(int i = 0; i < n; i++){
p[i].x = platformMount[i];
p[i].y = platformLength[i];
}
sort(p, p + n);
sort(balls.begin(), balls.end());
for(int i = 0, j; i < n; i++){
for(j = 0; j < m; j++){
if(p[i].x == balls[j]){
printf("YES\n");
flag = 1;
break;
}else if(p[i].x < balls[j]){
rig = balls[j] - 1;
if(j){
lef = balls[j - 1] + 1;
}else{
lef = -mod;
}
break;
}
}
if(j >= m){
lef = balls[m - 1] + 1;
rig = mod;
}
if(flag) break;
if(lef < p[i].x - p[i].y) lef = p[i].x - p[i].y;
if(rig > p[i].x + p[i].y) rig = p[i].x + p[i].y;
t = rig - lef;
if(t - p[i].y + 1 <= 0){
flag = 1;
break;
}else {
ans *= (t - p[i].y + 1);
ans %= mod;
}
}
if(flag) return 0;
else return ans;
}
C题代码:(没有优化,4 * 4 会超时)
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <cstring>
using namespace std;
int vis[10][10];
int cnt;
void dfs(int sum, vector <string> v)
{
int n = v.size(), m = v[0].size();
int x, y, flag, tmp;
flag = 0;
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
if(!vis[i][j]){
x = i; y = j;
flag = 1;
break;
}
}
if(flag) break;
}
if(!flag){
if(cnt < sum)
cnt = sum;
return;
}
for(int j = 0, k; j < m - y; j++){
k = j;
tmp = 0;
for(int i = 0; i <= j; i++){
if(!vis[x][y + i]){
vis[x][y + i] = 1;
tmp = tmp * 10 + v[x][y + i] - '0';
}else{
k = i - 1;
break;
}
}
dfs(sum + tmp, v);
for(int i = 0; i <= k; i++){
vis[x][y + i] = 0;
}
if(k != j) break;
}
for(int j = 0, k; j < n - x; j++){
tmp = 0;
k = j;
for(int i = 0; i <= j; i++){
if(!vis[x + i][y]){
vis[x + i][y] = 1;
tmp = tmp * 10 + v[x + i][y] - '0';
}else {
k = i - 1;
break;
}
}
dfs(sum + tmp, v);
for(int i = 0; i <= k; i++){
vis[x + i][y] = 0;
}
if(k != j) break;
}
}
class CutTheNumbers {
public:
int maximumSum(vector <string>);
};
int CutTheNumbers::maximumSum(vector <string> board) {
int ans;
cnt = 0;
memset(vis, 0, sizeof(vis));
dfs(0, board);
ans = cnt;
return ans;
}