🏝️专栏: 【蓝桥杯备篇】
🌅主页: f狐o狸x
抱一丝各位,前面两个月生了一场重病没有更新,懒病太严重了,从现在开始接着这个专题更新
每天刷一题,头发少一根;但若放弃治疗,头发掉一吨!—— 秃头警告,但坚持就是胜利
3.8
一、P1067 [NOIP 2009 普及组] 多项式输出
链接: [NOIP 2009 普及组] 多项式输出
题目描述:
解题思路:
这道题属于模拟题,考察你的代码能力,题目要求啥你就弄哈就OK了
解题代码:
#include <iostream> #include <cmath> using namespace std; int main() { int n = 0; cin >> n; for(int i = n; i >= 0; i--) { int a = 0; cin >> a; if(a == 0) continue; // 1.符号 if(a < 0) cout << "-"; else if(a > 0) { if(i != n) cout << "+"; } // 2.数字 a = abs(a); if( a > 1 || (a == 1 && i == 0) ) cout << a; // 3.x if( i > 1) { cout << "x^" << i; } else if( i == 1) cout << "x"; } return 0; }
复制
二、P5731 【深基5.习6】蛇形方阵
题目链接:P5731 【深基5.习6】蛇形方阵
题目描述:
解题思路:
这个题我们可以采用方向向量,如下图,因为是顺时针填充的,所以方向就是右、下、左、上,最后在按照题目意思,把越界的填充都改变方向,变成合法的填充就可以了
解题代码:
const int N = 10; // 定义方向向量 int dx[4] = { 0,1,0,-1 }; int dy[4] = { 1,0,-1,0 }; int arr[N][N] = { 0 }; int main() { int n = 0; cin >> n; // 起始位置 int x = 1; int y = 1; int pos = 0; for (int i = 1; i <= n * n; i++) { arr[x][y] = i; int a = 1, b = 1; a = x + dx[pos]; b = y + dy[pos]; if (a < 1 || a > n || b < 1 || b > n || arr[a][b]) { pos = (pos + 1) % 4; a = x + dx[pos]; b = y + dy[pos]; } x = a; y = b; } for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { printf("=", arr[i][j]); } printf("\n"); } return 0; }
复制
三、P1098 [NOIP 2007 提高组] 字符串的展开
题目链接:P1098 [NOIP 2007 提高组] 字符串的展开
题目描述:
解题思路:
这题也是明显的模拟题,就按照题目描述的意思一步一步来,注意不要遗漏情况就可以了
解题代码:
string s; string ret; int p1, p2, p3; // 判断是否是小写字母 bool is_a(char ch) { return ch >= 'a' && ch <= 'z'; } // 判断是否是数字 bool is_num(char ch) { return ch >= '0' && ch <= '9'; } //增加函数 void add(char left, char right) { string t; for (char ch = left + 1; ch < right; ch++) { char tmp = ch; //处理p1 if (p1 == 2 && is_a(ch) && is_a(right)) { tmp -= 32; } else if (p1 == 3) { tmp = '*'; } //处理p2 for (int i = 0; i < p2; i++) { t += tmp; } } //处理p3 if (p3 == 2) { reverse(t.begin(), t.end()); } ret += t; } int main() { cin >> p1 >> p2 >> p3 >> s; int l = s.size(); // 遍历字符串,找‘-’ for (int i = 0; i < l; i++) { if (i == 0 || i == l - 1 || s[i] != '-') ret += s[i]; else { //找到字符串判断是否能展开 char left = s[i - 1]; char right = s[i + 1]; if (is_a(left) && is_a(right) && left < right || is_num(left) && is_num(right) && left < right) { add(left, right); } else ret += s[i]; } } cout << ret; return 0; }
复制
键盘敲响的不仅是算法,更是逆袭的节奏!!!各位加油!