标签:timus 2011. long statement 排列组合的运用
| input | output |
|---|---|
6 1 2 2 3 3 3 |
Yes |
本题我使用了permutation的知识去解决。
就是把 1 2 2 3 3 3 看着是一个排列,然后求6次下一个排列,如果无重复,那么就是Yes,如果有重复,那么就是No了。
求排序的时间效率是O(n),所以本算法的速度还是相当快的。
能够运用上学过的知识,感觉真是太好了。
#include <string>
#include <vector>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
bool permuteLongStatement(vector<int> &rs, vector<int> &tmp)
{
int i = tmp.size() - 2;
for ( ; i >= 0 && tmp[i] >= tmp[i+1]; i--);
if (i < 0)
{
reverse(tmp.begin(), tmp.end());
return tmp != rs;
}
int j = tmp.size() - 1;
for ( ; tmp[j] <= tmp[i]; j--);
swap(tmp[i], tmp[j]);
reverse(tmp.begin()+i+1, tmp.end());
return tmp != rs;
}
void LongStatement2011()
{
int n;
cin>>n;
vector<int> rs(n);
for (int i = 0; i < n; i++)
{
cin>>rs[i];
}
vector<int> tmp(rs);
bool ok = true;
for (int i = 0; i < 5; i++)//注意这里是5不是6,因为第一个不permute前算一个
{
if (!permuteLongStatement(rs, tmp))
{
ok = false;
break;
}
}
if (ok) cout<<"Yes";
else cout<<"No";
}
Timus 2011. Long Statement 排列组合的运用
标签:timus 2011. long statement 排列组合的运用
原文地址:http://blog.csdn.net/kenden23/article/details/24600119