先推荐一个很好用的网站 http://www.cplusplus.com/
所有C/C++的函数和文档都可以在上面查到。。
A (uva 11988 - Broken Keyboard)
'[' 表示碰到了 "home" ,']' 表示碰到了 "end"。用链表模拟,维护一个指针,当输入是'[' 时,指针移向表头,为 ']' 则移到表尾,否则直接插入。
PS: STL链表
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <cassert>
#include <algorithm>
#include <cmath>
#include <set>
#include <list>
#include <map>
#include <limits>
using namespace std;
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define REP(i, s, t) for(int (i)=(s);(i)<=(t);++(i))
#define UREP(i, s, t) for(int (i)=(s);(i)>=(t);--(i))
#define REPOK(i, s, t, o) for(int (i)=(s);(i)<=(t) && (o);++(i))
#define MAXN 100000
#define MAXM 999999
#define MOD 1000000007
#define PI 3.1415926535897932384626433832795
typedef long long LL;
typedef vector<int> veci;
char buf[MAXN+5];
int main() {
//freopen("input.in", "r", stdin);
while(scanf("%s",buf) != EOF) {
char *p = buf, c;
list<char> ans;
list<char>::iterator it = ans.begin();
while(*p != '\0') {
c = *p;
if (c == '[') {
it = ans.begin();
} else if (c == ']') {
it = ans.end();
} else {
ans.insert(it, c);
}
p++;
}
for(it = ans.begin();it != ans.end();++it)
putchar(*it);
putchar('\n');
}
return 0;
}
B (11136 - Hoax or what)
我们需要一个能够快速插入元素,并且能够快速查询最大,最小值的数据结构。STL 已经为我们实现好了这样的容器,set 和 multiset,不同之处在于 set 里面的元素不可重,而 multiset 可重。set 和 multiset 都是基于 BST(Binary search tree)实现的,以后你可能需要实现自己的 BST 以满足特殊需求。。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <cassert>
#include <algorithm>
#include <cmath>
#include <set>
#include <list>
#include <map>
#include <limits>
using namespace std;
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define REP(i, s, t) for(int (i)=(s);(i)<=(t);++(i))
#define UREP(i, s, t) for(int (i)=(s);(i)>=(t);--(i))
#define REPOK(i, s, t, o) for(int (i)=(s);(i)<=(t) && (o);++(i))
#define MAXN 100000
#define MAXM 999999
#define MOD 1000000007
#define PI 3.1415926535897932384626433832795
typedef long long LL;
typedef vector<int> veci;
char buf[MAXN+5];
int main() {
//freopen("input.in", "r", stdin);
int N;
while(scanf("%d",&N) == 1 && N) {
multiset<int> myset;
LL ans = 0;
REP(i, 1, N) {
int num, t;
scanf("%d",&num);
REP(j, 1, num) {
scanf("%d",&t);
myset.insert(t);
}
int _min = *myset.begin();
int _max = *myset.rbegin();
myset.erase(myset.find(_min));
myset.erase(myset.find(_max));
ans += _max-_min;
}
printf("%lld\n",ans);
}
return 0;
}
C (ZOJ 1089 Lotto)
因为数据非常小,所以有两种做法:
1)生成组合 (请自行 baidu =_=||)
2)暴力枚举
//生成组合
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <cassert>
#include <algorithm>
#include <cmath>
#include <set>
#include <list>
#include <map>
#include <limits>
using namespace std;
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define REP(i, s, t) for(int (i)=(s);(i)<=(t);++(i))
#define UREP(i, s, t) for(int (i)=(s);(i)>=(t);--(i))
#define REPOK(i, s, t, o) for(int (i)=(s);(i)<=(t) && (o);++(i))
#define MAXN 100000
#define MAXM 999999
#define MOD 1000000007
#define PI 3.1415926535897932384626433832795
typedef long long LL;
typedef vector<int> veci;
int _map[15];
int ans[15];
int N;
int upper(int x) {
return N - (6 - x);
}
void print() {
REP(i, 1, 5)
printf("%d ", _map[ans[i]]);
printf("%d\n",_map[ans[6]]);
}
int main() {
//freopen("input.in", "r", stdin);
int kase = 0;
while(scanf("%d",&N) == 1 && N) {
if (kase++ > 0)
putchar('\n');
REP(i, 1, N)
scanf("%d", &_map[i]);
REP(i, 1, 6)
ans[i] = i;
print();
while(true) {
int idx = 6;
while(idx >= 1 && ans[idx] >= upper(idx))
--idx;
if (idx < 1)
break;
ans[idx]++;
REP(i, idx+1, 6)
ans[i] = ans[i-1]+1;
print();
}
}
return 0;
}
//枚举
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <cassert>
#include <algorithm>
#include <cmath>
#include <set>
#include <list>
#include <map>
#include <limits>
using namespace std;
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define REP(i, s, t) for(int (i)=(s);(i)<=(t);++(i))
#define UREP(i, s, t) for(int (i)=(s);(i)>=(t);--(i))
#define REPOK(i, s, t, o) for(int (i)=(s);(i)<=(t) && (o);++(i))
#define MAXN 100000
#define MAXM 999999
#define MOD 1000000007
#define PI 3.1415926535897932384626433832795
typedef long long LL;
typedef vector<int> veci;
int _map[15];
int ans[15];
int N;
int upper(int x) {
return N - (6 - x);
}
void print(int a, int b, int c, int d, int e, int f) {
printf("%d %d %d %d %d %d\n", _map[a], _map[b],
_map[c], _map[d], _map[e], _map[f]);
}
int main() {
//freopen("input.in", "r", stdin);
int kase = 0;
while(scanf("%d",&N) == 1 && N) {
if (kase++ > 0)
putchar('\n');
REP(i, 1, N)
scanf("%d", &_map[i]);
REP(i1, 1, N)
REP(i2, i1+1, N)
REP(i3, i2+1, N)
REP(i4, i3+1, N)
REP(i5, i4+1, N)
REP(i6, i5+1, N) {
print(i1, i2, i3, i4, i5, i6);
}
}
return 0;
}
D (Codeforces 272 Div2 A)
从小到大枚举 m, 判断。判断方法可以是:枚举 m 步里面的1,判断余下的能否被2整除。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <cassert>
#include <algorithm>
#include <cmath>
#include <set>
#include <list>
#include <map>
#include <limits>
using namespace std;
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define REP(i, s, t) for(int (i)=(s);(i)<=(t);++(i))
#define UREP(i, s, t) for(int (i)=(s);(i)>=(t);--(i))
#define REPOK(i, s, t, o) for(int (i)=(s);(i)<=(t) && (o);++(i))
#define MAXN 100000
#define MAXM 10000
#define MOD 1000000007
#define PI 3.1415926535897932384626433832795
typedef long long LL;
typedef vector<int> veci;
typedef vector<pair<int, int> > vect;
typedef pair<int, int> pairi;
const double maxdouble = numeric_limits<double>::max();
const double eps = 1e-10;
const int INF = 0x7FFFFFFF;
int main() {
int n, m;
cin >> n >> m;
bool ok = false;
int ans;
for (int i=1;m*i<=n && !ok;++i) {
int num = m*i;
for (int j=0;j<=num && !ok;++j)
if (j+2*(num-j) == n) {
ok = true;
ans = num;
break;
}
}
if (!ok)
cout << -1;
else
cout << ans;
return 0;
}
E (Codeforces 269 Div2 A)
分情况判断下。。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <cassert>
#include <algorithm>
#include <cmath>
#include <set>
#include <limits>
using namespace std;
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define F(i, n) for(int (i)=0;(i)<(n);++(i))
#define REP(i, s, t) for(int (i)=(s);(i)<=(t);++(i))
#define UREP(i, s, t) for(int (i)=(s);(i)>=(t);--(i))
#define REPOK(i, s, t, o) for(int (i)=(s);(i)<=(t) && (o);++(i))
#define MAXN 100000
#define MAXM 10000
#define MOD 10000007
#define PI 3.1415926535897932384626433832795
typedef long long LL;
const double maxdouble = numeric_limits<double>::max();
const double eps = 1e-10;
const int INF = 0x7FFFFFFF;
int cnt[10];
vector<int> buf;
int main() {
//freopen("input.in", "r", stdin);
int tmp;
REP(i, 0, 5) {
cin >> tmp;
cnt[tmp]++;
}
bool ok = false;
REP(i, 0, 9)
if (cnt[i] > 0) {
if (cnt[i] >= 4) {
cnt[i] -= 4;
ok = true;
}
if (cnt[i] > 0) {
REP(j, 0, cnt[i]-1)
buf.push_back(i);
}
}
if (!ok)
cout << "Alien\n";
else {
//cout << buf.size() << " " << buf[0] << " " << buf[1] << endl;
if (buf[0] != buf[1])
cout << "Bear\n";
else
cout << "Elephant\n";
}
return 0;
F (Codeforces 269 Div2 B)
找连续相等的部分。。然后。。这种和谐的数据,随便搞吧 = =||
因为是 DIV2 ,还是给出我丑陋的代码。。附加一份比较好的代码,对比看看吧~~
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <cassert>
#include <algorithm>
#include <cmath>
#include <set>
#include <limits>
using namespace std;
#define MIN(a, b) ((a) < (b) ? (a) : (b))
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define F(i, n) for(int (i)=0;(i)<(n);++(i))
#define REP(i, s, t) for(int (i)=(s);(i)<=(t);++(i))
#define UREP(i, s, t) for(int (i)=(s);(i)>=(t);--(i))
#define REPOK(i, s, t, o) for(int (i)=(s);(i)<=(t) && (o);++(i))
#define MAXN 100000
#define MAXM 10000
#define MOD 10000007
#define PI 3.1415926535897932384626433832795
typedef long long LL;
const double maxdouble = numeric_limits<double>::max();
const double eps = 1e-10;
const int INF = 0x7FFFFFFF;
int cnt[10];
vector<int> buf;
int main() {
//freopen("input.in", "r", stdin);
int tmp;
REP(i, 0, 5) {
cin >> tmp;
cnt[tmp]++;
}
bool ok = false;
REP(i, 0, 9)
if (cnt[i] > 0) {
if (cnt[i] >= 4) {
cnt[i] -= 4;
ok = true;
}
if (cnt[i] > 0) {
REP(j, 0, cnt[i]-1)
buf.push_back(i);
}
}
if (!ok)
cout << "Alien\n";
else {
//cout << buf.size() << " " << buf[0] << " " << buf[1] << endl;
if (buf[0] != buf[1])
cout << "Bear\n";
else
cout << "Elephant\n";
}
return 0;
}
牛犇的代码:
#include <iostream>
#include <cstdio>
#include <vector>
#include <cmath>
#include <algorithm>
#include <iomanip>
#include <string>
#include <set>
#include <stack>
#define mp(x, y) make_pair(x, y)
#define all(x) x.begin(), x.end()
#define eps 1e-6
using namespace std;
int main(){
//freopen("input.txt", "r", stdin);
int n; cin >> n;
vector<pair<int, int> > g(n), k(n), l(n);
for (int i = 0; i < n; ++i) {
cin >> g[i].first;
g[i].second = i + 1;
}
sort(all(g));
k = g;
l = g;
bool kk = false;
for (int i = 0; i < n - 1; ++i) {
if (g[i].first == g[i + 1].first && !kk) {
kk = true;
swap(k[i], k[i + 1]);
continue;
}
if (g[i].first == g[i + 1].first && kk) {
swap(l[i], l[i + 1]);
cout << "YES" << endl;
for (int w = 0; w < n; ++w)
cout << g[w].second << " ";
cout << endl;
for (int w = 0; w < n; ++w)
cout << k[w].second << " ";
cout << endl;
for (int w = 0; w < n; ++w)
cout << l[w].second << " ";
cout << endl;
return 0;
}
}
cout << "NO" << endl;
return 0;
}
By slowlight93