g++ -DEVAL -std=gnu++11 -O2 -pipe -static -s -o <file> <file>.cpp
gcc -DEVAL -std=gnu11 -O2 -pipe -static -s -o <file> <file>.c -lm
/usr/bin/javac spy.java
/bin/sh -c jar cf spy.jar *.class
NHDK 四校聯合初學者程式設計練習賽
SCIST 南臺灣學生資訊社群、AA 競程
#include <bits/stdc++.h>
using namespace std;
int n;
int p[360];
signed main() {
cin >> n;
int tmp = 0, ans = 0;
for (int i = 0; i < n; i++)
cin >> p[i];
for (int i = 1; i < n; i++) {
if (p[i] > p[i - 1])
tmp++;
else
tmp = 0;
ans = max(ans, tmp);
}
cout << ans << endl;
return 0;
}
move()
merge()
generate()
move()
merge()
move()
generate()
#include <iostream>
using namespace std;
int n, m, q;
int num[10][10];
const int px[] = {-1, 1, 0, 0};
const int py[] = {0, 0, -1, 1};
int startx[] = {0, 0, 0, 0}; // startx[1] = n - 1
int starty[] = {0, 0, 0, 0}; // starty[3] = m - 1
int merge(int x, int y, int op) {
int cnt = 0;
for (int i = 0; ; i++) {
int nowx = x - i * px[op];
int nowy = y - i * py[op];
int nxtx = x - (i + 1) * px[op];
int nxty = y - (i + 1) * py[op];
if (nxtx < 0 || nxtx >= n || nxty < 0 || nxty >= m)
break;
if (num[nowx][nowy] == num[nxtx][nxty] && num[nowx][nowy] > 0) {
num[nowx][nowy] += num[nxtx][nxty];
if (num[nowx][nowy] == 2048)
num[nowx][nowy] = 2;
num[nxtx][nxty] = 0;
i++;
cnt++;
}
}
return cnt;
}
bool move(int x, int y, int op) {
bool changed = false;
for (int i = 0; i < max(n, m); i++) {
for (int j = 0; ; j++) {
int nowx = x - j * px[op];
int nowy = y - j * py[op];
int nxtx = x - (j + 1) * px[op];
int nxty = y - (j + 1) * py[op];
if (nxtx < 0 || nxtx >= n || nxty < 0 || nxty >= m)
break;
if (num[nowx][nowy] == 0 && num[nxtx][nxty] != 0) {
swap(num[nowx][nowy], num[nxtx][nxty]);
changed = true;
}
}
}
return changed;
}
int get_sum() {
int res = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
res += num[i][j];
return res;
}
bool generate() {
bool success = false;
int sum = get_sum();
int newnum = (sum % 32 == 0 ? 4 : 2);
int space = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
space += (num[i][j] == 0);
if (space == 0)
return false;
int pos = sum % space + 1;
int cnt = 0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
cnt += (num[i][j] == 0);
if (cnt == pos) {
num[i][j] = newnum;
return true;
}
}
}
return false;
}
signed main() {
cin >> n >> m >> q;
startx[1] = n - 1;
starty[3] = m - 1;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> num[i][j];
int op;
int ans = 0;
while (q--) {
cin >> op;
op--;
int x = startx[op];
int y = starty[op];
bool changed = false;
for (int i = 0; x < n && y < m; i++) {
changed |= move(x, y, op);
int mge = merge(x, y, op);
ans += mge;
changed |= mge;
changed |= move(x, y, op);
x += (op >= 2);
y += (op <= 1);
}
if (changed)
generate();
}
cout << ans << endl;
return 0;
}
.insert(s)
、.erase(.find(s))
#include <bits/stdc++.h>
using namespace std;
int q;
multiset<string> st;
signed main() {
cin >> q;
int opt;
string s;
while (q--) {
cin >> opt;
cin >> s;
reverse(s.begin(), s.end());
if (opt == 1)
st.insert(s);
else if (opt == 2)
st.erase(st.find(s));
else {
string s1, s2;
int ans = 0;
int cnt = 0;
if (st.lower_bound(s) != st.begin())
s1 = *(--st.lower_bound(s));
if (st.lower_bound(s) != st.end())
s2 = *(st.lower_bound(s));
for (int i = 0; i < min(s.size(), s1.size()); i++) {
if (s[i] == s1[i])
cnt++;
else
break;
}
ans = cnt;
cnt = 0;
for (int i = 0; i < min(s.size(), s2.size()); i++) {
if (s[i] == s2[i])
cnt++;
else
break;
}
ans = max(ans, cnt);
cout << ans << endl;
}
}
}
v, del
v
:目前集合中的字串del
:等待刪除的字串v
del
v
中會存在一些應該被刪掉但還沒被刪掉的字串,因此需要先求出真正的 v
v, del
各自排序tmp
v
中的每個字串是否有在 del 中,要是不存在,則加入 tmp
v
v
中的所有字串,求出最佳的答案
#include <bits/stdc++.h>
using namespace std;
int q;
signed main() {
cin >> q;
int opt;
string s;
vector<string> v;
vector<string> del;
while (q--) {
cin >> opt;
cin >> s;
reverse(s.begin(), s.end());
if (opt == 1)
v.push_back(s);
else if (opt == 2)
del.push_back(s);
else {
sort(v.begin(), v.end());
sort(del.begin(), del.end());
vector<string> tmp;
int mx = 0;
for (int i = 0, j = 0; i < v.size(); i++) {
while (j < del.size() && del[j] < v[i])
j++;
if (j < del.size() && del[j] == v[i]) {
j++;
continue;
}
tmp.push_back(v[i]);
for (int k = 0; k < min(v[i].size(), s.size()); k++) {
if (v[i][k] == s[k])
mx = max(mx, k + 1);
else
break;
}
}
v = tmp;
del.clear();
cout << mx << endl;
}
}
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define MAXN 1005
int n, m, k;
int s[MAXN][MAXN], d[MAXN][MAXN], dp[MAXN][MAXN];
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> s[i][j];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++)
cin >> d[i][j];
}
memset(dp, -0x3f, sizeof(dp));
dp[0][0] = 0;
for (int i = 1; i <= n; i++) {
dp[i][0] = dp[i - 1][0];
for (int j = 1; j <= m; j++)
dp[i][0] -= d[i][j];
for (int j = 1; j <= m; j++) {
for (int k = 0; k <= j; k++) {
int tmp = 0;
for (int l = k + 1; l <= j; l++)
tmp += s[i][l];
for (int l = j + 1; l <= m; l++)
tmp -= d[i][l];
dp[i][j] = max(dp[i][j], dp[i - 1][k] + tmp);
}
}
}
int ans = 0;
for (int i = 1; i <= n; i++) {
ans = max(ans, dp[i][m]);
}
cout << ans << endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define MAXN 3005
int n, m, k;
int s[MAXN][MAXN], d[MAXN][MAXN], dp[MAXN][MAXN];
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
memset(dp, -0x3f, sizeof(dp));
dp[0][0] = 0;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> s[i][j];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++)
cin >> d[i][j];
}
for (int j = 1; j <= m; j++) {
int mx = 0;
int cnt = 0;
for (int i = 1; i <= n; i++) {
mx = max(mx, dp[i][j - 1]);
cnt += d[i - 1][j];
dp[i][j] = max(dp[i][j], mx - cnt + s[i][j]);
}
}
int ans = 0;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= m; j++) {
}
ans = max(ans, dp[i][m]);
}
cout << ans << endl;
}