文章目录
刷题心得
PAT1029中位数
考点:二路归并算法
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 400010;
int a[N * 2];
int n, m;
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
cin >> m;
for (int i = n + 1; i <= n + m; i ++ ) scanf("%d", &a[i]);
sort(a + 1, a + 1 + n + m);
cout << a[(n + m + 1) / 2] << endl;
return 0;
}
PAT1046:最短距离(前缀和)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int s[N];
int n, m;
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++ )
{
scanf("%d", &s[i]);
s[i] += s[i - 1];
}
cin >> m;
while (m -- )
{
int l, r;
scanf("%d %d", &l, &r);
if(l > r) swap(l, r);
printf("%d\n", min(s[r - 1] - s[l - 1], s[n] - s[r - 1] + s[l - 1]));
}
return 0;
}
PAT1085:完美序列
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int a[N];
int n, p;
typedef long long LL;
int main()
{
cin >> n >> p;
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
sort(a + 1, a + 1 + n);
int l = 1, r = 1;
int res = 0;
while (r <= n)
{
while (a[r] <= (LL)a[l] * p && r <= n) r ++;
res = max(res, r - l);
l ++;
}
cout << res << endl;
return 0;
}
PAT1091:急性中风
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int M = 1286, N = 128, L = 60;
int n, m, l, T;
int g[L][M][N];
struct Node
{
int x, y, z;
};
int d[][3] = {
{1, 0, 0},
{-1, 0, 0},
{0, 1, 0},
{0, -1, 0},
{0, 0, 1},
{0, 0, -1}
};
int bfs(int x, int y, int z)
{
queue<Node> q;
q.push({x, y, z});
g[x][y][z] = 0;
int cnt = 1;
while (q.size())
{
auto t = q.front();
q.pop();
for (int i = 0; i < 6; i ++ )
{
int a = t.x + d[i][0], b = t.y + d[i][1], c = t.z + d[i][2];
if(a >= 0 && a < l && b >= 0 && b < m && c >= 0 && c < n && g[a][b][c])
{
g[a][b][c] = 0;
q.push({a, b, c});
cnt ++;
}
}
}
return cnt;
}
int main()
{
scanf("%d%d%d%d", &m, &n, &l, &T);
for (int i = 0; i < l; i ++ )
for (int j = 0; j < m; j ++ )
for (int k = 0; k < n; k ++ )
scanf("%d", &g[i][j][k]);
int res = 0;
for (int i = 0; i < l; i ++ )
for (int j = 0; j < m; j ++ )
for (int k = 0; k < n; k ++ )
{
if(g[i][j][k])
{
int t = bfs(i, j, k);
if(t >= T) res += t;
}
}
printf("%d\n", res);
return 0;
}
PAT1148:狼人杀-简单版(枚举)
思路:(千万不要推理,否则很复杂)
枚举答案三层循环,判断说假话的人数和是否时狼人。
函数判断第k个人说的是真话还是假话
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int n;
int f[N];
int judge(int k, int i, int j)
{
int t = f[k];
if(t > 0)
{
if(t == i || t == j) return 1;
else return 0;
}
t = -t;
if(t == i || t == j) return 0;
return 1;
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i ++ ) scanf("%d", &f[i]);
for (int i = 1; i <= n; i ++ )
{
for (int j = i + 1; j <= n; j ++ )
{
int s = judge(i, i, j) + judge(j, i, j);
if(s != 1) continue;
s = 0;
for (int k = 1; k <= n; k ++ )
{
s += judge(k, i, j);
}
if(s != 2) continue;
cout << i << ' ' << j << endl;
return 0;
}
}
puts("No Solution");
return 0;
}
PAT1051:弹出序列
插入一个数,让栈内能弹出的元素尽量弹出
#include <iostream>
#include <cstring>
#include <algorithm>
#include <stack>
using namespace std;
const int N = 1010;
int n, m, k;
int f[N];
bool check()
{
stack<int> stk;
for (int i = 1, j = 0; i <= n; i ++ )
{
stk.push(i);
if (stk.size() > m) return false;
while (stk.size() && f[j] == stk.top())
{
stk.pop();
j ++;
}
}
return stk.empty();
}
int main()
{
scanf("%d%d%d", &m, &n, &k);
while (k -- )
{
for (int i = 0; i < n; i ++ ) scanf("%d", &f[i]);
if(check()) puts("YES");
else puts("NO");
}
return 0;
}
世界首富
在这里插入代码片
栈
在这里插入代码片
PAT1117:艾丁顿数
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int n;
int a[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
sort(a + 1, a + n + 1);
for (int i = n; i >= 1; i -- )
{
if(a[n - i + 1] > i)
{
cout << i << endl;
return 0;
}
}
puts("0");
return 0;
}
PAT1044:火星购物
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int n, m;
int s[N];
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++ )
{
scanf("%d", &s[i]);
s[i] += s[i - 1];
}
int ans = 1e9;
for (int i = 1, j = 1; i <= n; i ++ )
{
while (s[i] - s[j] >= m) j ++;
if(s[i] - s[j - 1] >= m)
{
ans = min(ans, s[i] - s[j - 1]);
}
}
for (int i = 1, j = 1; i <= n; i ++ )
{
while (s[i] - s[j] >= m) j ++;
if(s[i] - s[j - 1] == ans) printf("%d-%d\n", j, i);
}
return 0;
}