SRM 495 DIV 1 总结

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。


你可能感兴趣的:(SRM)