抱一丝各位,前面两个月生了一场重病没有更新,懒病太严重了,从现在开始接着这个专题更新
每天刷一题,头发少一根;但若放弃治疗,头发掉一吨!—— 秃头警告,但坚持就是胜利
3.8
一、P1067 [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("%3d", 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;
}
键盘敲响的不仅是算法,更是逆袭的节奏!!!各位加油!