准备时间不算少也不算多,寒假就把题库刷了一遍,花的时间也不少,但是考前准备的不多,就是熟练一下解题的思路和模板。对于考试而言仍然有点碰运气的成分,赌他不会出动归,不会出一些数学题,不然就是歇菜,虽然我陈刀仔赌赢了,但是依然没有满分,最后一题图论两个点错误扣了6分,发现错误点的时候还有40分钟,然而却越改错的越多,可能说明一个问题,我还有错误没有发现,但是由于我的代码写的比较宽泛,把一些数据点给漏过去了,但是当我认真改起来的时候发现错的更多了,按水平可能最后一题连24都拿不了,能拿真是天助我也。
考前对此前考过的题和自己的水平也是有所估量的,以我现在的水平很难稳稳拿满,除非题目特别简单,否则必须有惊艳的操作才能如愿,而这次可以说是无功无过加上运气成分。而提升到目标水准可能又是几百道题,甚至这个水准并不存在客观的度量,acmer们做pat可能就轻松多了。
第一题(AC)
思路:(1)合并相邻且相同的数据,存入结构体。
(2)寻找低谷,并以每个低谷为中心向两边扩展,取max值。
反思:没有第一时间审明白题,不过理解题后思路比较清晰,但是却也没有考虑什么极端数据,测完样例就提交了,好在过了。
#include
#include
#include
#include
using namespace std;
int panda[10005], last = 0;
struct node {
int w, num;
};
vectorlist;
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &panda[i]);
if (panda[i] == last) {
list[list.size() - 1].num++;
}
else {
list.push_back({panda[i],1});
}
last = panda[i];
}
vectordistr(list.size());
vectorislight;
if (list[0].w < list[1].w)islight.push_back(0);
for (int i = 1; i < list.size() - 1; i++)
if (list[i].w < list[i + 1].w&&list[i].w < list[i - 1].w)islight.push_back(i);
if (list[list.size() - 1].w < list[list.size() - 2].w)islight.push_back(list.size() - 1);
for (int i = 0; i < islight.size(); i++) {
int it = islight[i],next;
if (i != islight.size() - 1)next = islight[i + 1];
else next = list.size()-1;
distr[it] = 200;
for (int j = it; j >= 1; j--) { //向前回溯
if (list[j - 1].w > list[j].w)distr[j - 1] = max(distr[j - 1], distr[j] + 100);
else break;
}
for (int j = it; j < next; j++) {
if (list[j + 1].w > list[j].w)distr[j + 1] = max(distr[j + 1], distr[j] + 100);
else break;
}
}
int sum = 0;
for (int i = 0; i < distr.size(); i++)
sum += distr[i] * list[i].num;
cout << sum;
return 0;
}
第二题(AC)
水题
#include
#include
#include
#include
using namespace std;
int piece[10005];
int main() {
int n, m, cnt = 0;
scanf("%d%d", &n,&m);
for (int i = 0; i < n; i++)scanf("%d", &piece[i]);
for (int i = 0; i < n; i++) {
int tpsum = 0;
for (int j = 0; j < n&&i + j < n; j++) {
tpsum += piece[i + j];
if (tpsum <= m)cnt++;
else break;
}
}
cout << cnt;
return 0;
}
第三题(AC)
思路:(1)前中建树(刷过题库的应该写烂了)
(2)层序遍历,把每一层第一个元素弄出来。
由于考试最后系统崩溃,没能复制出来代码。
第四题(24)
思路(1)每次输入一个点判断它是否可以直接输出。
(2)如果可以直接输出或者前提条件具备,就以他为其实更新他相邻的点。
(3)如果它输入进去发现不能直接输出且他的前驱们都没有更新过信息,那么就是error。
(4)数据更新两个指标,一个是所需分数要最少(距离),另一个是优惠券更多。
问题:不应该使用后来的考试的更优数据去更新前面的考试的数据。
#include
#include
#include
#include
#include
#include
using namespace std;
struct node {
int s, d;
};
node qmap[1005][1005];
vectorpath,ans;
int mins=65536, maxd=0,f[1005];
vector>behind;
vector>quis;
int lastnode[1005],score[1005],darr[1005],seq[1005],pos[1005];
void dfs(int s) { //本来想写dfs的,写着写着发现是dij的一个子步骤,没改函数名
for (int i = 0; i < behind[s].size(); i++)
{
int next = behind[s][i];
f[next] = 1;
if (score[s] + qmap[s][next].s < score[next]) {
score[next] = score[s] + qmap[s][next].s;
darr[next] = darr[s] + qmap[s][next].d;
lastnode[next] = s;
}
else if (score[s] + qmap[s][next].s == score[next]&&darr[s]+qmap[s][next].d>darr[next]) {
darr[next] = darr[s] + qmap[s][next].d;
lastnode[next] = s;
}
}
}
void getpath(int s) {
path.push_back(s);
if (lastnode[s] == -1)
return;
else getpath(lastnode[s]);
}
int main() {
int n, m,k;
scanf("%d%d", &n, &m);
behind=vector>(n + 1);
quis = vector>(n + 1);
for (int i = 0; i < m; i++) {
int t1, t2, s, d;
scanf("%d%d%d%d", &t1, &t2, &s, &d);
qmap[t1][t2] = {s,d};
behind[t1].push_back(t2);
quis[t2].push_back(t1);
}
scanf("%d", &k);
for (int i = 0; i <= n; i++) {
f[i] = 0;
score[i] = 65536;
darr[i] = 0;
lastnode[i] = -1;
}
bool flag = true;
for (int i = 0; i < k; i++) {
scanf("%d", &seq[i]);
int tp = seq[i];
pos[tp] = i;
}
for (int i = 0; i < k; i++) {
int tp = seq[i];
if (f[tp] || quis[tp].size() == 0) {
if (quis[tp].size() == 0) {
f[tp] = 1;
score[tp] = 0;
darr[tp] = 0;
}
}
else {
flag = false;
f[i+10]=1;
}
for (int j = 0; j <= i; j++)
if (f[seq[j]])dfs(seq[j]);
}
if (flag)printf("Okay.\n");
else printf("Impossible.\n");
for (int i = 0; i < k; i++) {
int tp = seq[i];
if (!f[tp])printf("Error.\n");
else {
if (lastnode[tp] == -1)printf("You may take test %d directly.\n", tp);
else {
path.clear();
getpath(tp);
reverse(path.begin(), path.end());
for (int x = 0; x < path.size(); x++)
if (x == 0)printf("%d", path[x]);
else printf("->%d", path[x]);
printf("\n");
}
}
}
return 0;
}