250p:水题。题意讲得很清楚,找到每个位置是否有唯一可能。
可以直接暴力搞起复杂度O(k*n*n),也可以双向处理一下,可以达到O(n)的复杂度。
#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>
#define pb push_back
using namespace std;
class ColorfulCards {
public:
vector <int> theCards(int, string);
};
bool vis[1111], t[1111];
vector <int> ColorfulCards::theCards(int n, string c) {
int i, j, k;
vis[1] = 1;
for(i = 0;i < c.size(); i++)
if(c[i] == 'R')
t[i] = 0;
else
t[i] = 1;
for(i = 2;i*i <= 1000; i++) if(!vis[i]) {
for(j = i*i;j <= 1000; j += i)
vis[j] = 1;
}
for(i = 0;i < c.size(); i++) if(c[i] == 'R')
t[i] = 0;
else
t[i] = 1;
vector <int> ans;
for(i = 0;i < c.size(); i++) {
int sum = 0, id;
for(j = 1;j <= n; j++) {
if(vis[j] == t[i]) {
int cur = i+1;
for(k = j+1;k <= n; k++) {
if(cur < c.size() && vis[k] == t[cur]) {
cur++;
}
else if(cur == c.size())
break;
}
if(cur == c.size()) {
cur = i-1;
for(k = j-1;k >= 1; k--) {
if(cur >= 0 && vis[k] == t[cur])
cur--;
else if(cur < 0)
break;
}
if(cur < 0)
sum++, id = j;
}
}
}
if(sum == 1)
ans.pb(id);
else
ans.pb(-1);
}
return ans;
}
500p: 这道题让我纠结了半天多,刚开始我想用贪心,于是跳进了所谓的坑,爬出来后又被坑在了特殊情况上,搞得太晕了一天,没精力继续搞了,还是放一下这题把。
思路就是首先找出所有入度为0的,然后要找环,最后要对一些情况进行处理,我可能想的不得当,就是过不了有一组test。