2023年06月02日更新
- NOIP2007 字符串的展开
- NOIP2009 多项式输出
- NOIP2010 机器翻译
NOIP2007 字符串的展开
第一道题目花费的时间是最多的,还wa了几次
需要特别注意的一个特殊情况时
1-a
这个时候a的ASCII是大于1的,需要满足的一个条件是’-'前后的符号属于同一个类型,要么都是数字,要么都是大写字母,要么都是小写字母
其他的情况可以通过测试样例发现
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define de(x) cout << x << " ";
#define Pu puts("");
#define sf(x) scanf("%d", &x);
int n, m;
string ans;
char toLow(char x) {
if (x >= '0' && x <= '9') {
return x;
} else if (x >= 'a' && x <= 'z') {
return x;
} else if (x >= 'A' && x <= 'Z') {
return (x + 32);
}
return '0';
}
char toUp(char x) {
if (x >= '0' && x <= '9') {
return x;
} else if (x >= 'a' && x <= 'z') {
return (x - 32);
} else if (x >= 'A' && x <= 'Z') {
return x;
}
return '0';
}
// bool isValid(char x) {
// if ((x >= '0' && x <= '9') || (x >= 'a' && x <= 'z') ||
// (x >= 'A' && x <= 'Z'))
// return 1;
// return 0;
// }
int main() {
int a, b, c;
cin >> a >> b >> c;
string s;
cin >> s;
n = s.size();
ans = "";
ans += s[0];
for (int i = 1; i <= n - 2; i++) {
if (s[i] == '-') {
char l = s[i - 1], r = s[i + 1];
if (!(((l >= '0' && l <= '9') && (r >= '0' && r <= '9')) ||
((l >= 'a' && l <= 'z') && (r >= 'a' && r <= 'z')) ||
((l >= 'A' && l <= 'Z') && (r >= 'A' && r <= 'Z')))) {
ans += '-';
continue;
}
string res = "";
// res += l;
if (l == r - 1) {
// ans += l;
// ans += r;
} else if (l >= r) {
// ans += l;
ans += '-';
// ans += r;
} else if (l < r - 1) {
if (a == 1) {
for (char j = l + 1; j <= r - 1; j++) {
for (int k = 1; k <= b; k++) {
res += toLow(j);
}
}
} else if (a == 2) {
for (char j = l + 1; j <= r - 1; j++) {
for (int k = 1; k <= b; k++) {
res += toUp(j);
}
}
} else if (a == 3) {
for (char j = l + 1; j <= r - 1; j++) {
for (int k = 1; k <= b; k++) {
res += '*';
}
}
}
if (c == 1) {
ans += res;
} else if (c == 2) {
reverse(res.begin(), res.end());
ans = ans + res;
}
}
} else {
ans += s[i];
}
}
ans += s[n - 1];
cout << ans << endl;
return 0;
}
NOIP2009 多项式输出
这个题目需要考虑的情况也是挺多的,最好的处理办法是对多项式的第一项和最后一项进行单独处理,而中间的很多项则可以使用一个for循环进行处理
特殊情况1:系数为1或者-1,注意此时如果不是常数项,则不输出;是常数项,直接输出
特殊情况2:总的多项式中只含有一个常数项,此时无论正负都可以直接输出;但是要注意-1的情况
特殊情况3:指数为1的项,多项式中只有一个x,这一点题目中没有给出
其他的情况可以通过测试样例发现,代码中有注释
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define de(x) cout << x << " ";
#define Pu puts("");
#define sf(x) scanf("%d", &x);
const int N = 1e5 + 10;
int n, m, ans;
string res = "";
int a[N];
int main() {
sf(n);
for (int i = 1; i <= n + 1; i++) {
cin >> a[i];
}
bool flg = true; // 注意这里有一个特殊情况,只有一个常数项
for (int i = 1; i <= n; i++) {
if (a[i] != 0) {
flg = false;
break;
}
}
if (a[1] > 0) { // 先判断第一个
if (a[1] != 1)
res += to_string(a[1]); // 注意系数为1的情况
res += "x^";
res += to_string(n);
} else if (a[1] < 0) {
// res += '-';
if (a[1] != -1)
res += to_string(a[1]);
else if (a[1] == -1)
res += '-';
res += "x^";
res += to_string(n);
}
m = n;
for (int i = 2; i <= n; i++) {
if (a[i] > 0) {
res += '+';
if (a[i] != 1)
res += to_string(a[i]);
if (m == 2) {
res += 'x';
continue;
}
res += "x^";
res += to_string(m - 1);
} else if (a[i] < 0) {
// res += '-';//如果是负数,则需要把这个给去掉
if (a[i] != -1)
res += to_string(a[i]);
else if (a[i] == -1)
res += '-';
if (m == 2) {
res += 'x';
continue;
}
res += "x^";
res += to_string(m - 1);
}
m--; // 注意对于每一个系数,都要减一
}
if (a[n + 1] > 0) { // 这是最后一个
if (flg == false) // 注意这里有一个特殊情况,只有一个常数项
res += '+';
res += to_string(a[n + 1]);
} else if (a[n + 1] < 0) {
// res += '-';
res += to_string(a[n + 1]);
}
de(res);
return 0;
}
NOIP2010 机器翻译
这个题目感觉比前面两个简单,因为可以使用队列先进先出的性质。但是需要注意的一点式,queue中没有像map或者set的find()函数,可以再开一个queue队列,在遍历其中一个队列的时候边遍历边pop()弹出,最后再把存储的元素按照原来的顺序弹入到queue中
代码中有注释
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define de(x) cout << x << " ";
#define Pu puts("");
#define sf(x) scanf("%d", &x);
const int N = 1e5 + 10;
int n, m, ans;
string res = "";
int a[N];
queue<int> q;
bool findMy(int x) {
bool flg = false;
int cnt = q.size();
queue<int> q1; // 另建立一个容器
for (int i = 0; i < cnt; i++) {
if (q.front() == x) {
flg = true;
}
q1.push(q.front());
q.pop();
}
// 再把里面的元素返还到queue中
for (int i = 0; i < cnt; i++) {
q.push(q1.front());
q1.pop();
}
return flg;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= m; i++) {
sf(a[i]);
}
ans++;
q.push(a[1]);
for (int i = 2; i <= m; i++) {
if (findMy(a[i]) == true)
continue;
else {
ans++;
if (q.size() < n) { // 如果容量此时小于n,则可以继续往里面放
q.push(a[i]);
} else { // 否则,移除队首元素
q.pop();
q.push(a[i]);
}
}
}
de(ans);
return 0;
}