A - String Generation
水题,读明白题意之后发现只要输出长度为n的 形如abcabcabc 这样的字符串即可满足题意。
AC代码:
#include <bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
#define endl '\n'
using namespace std;
const int N = 1e6 + 100;
void solve()
{
int n, m;
cin >> n >> m;
for(int i = 0; i < n; i ++)
printf("%c", 'a' + (i % 3));
cout << endl;
}
int main()
{
int t;
cin >> t;
while(t --)
solve();
return 0;
}
B - Find the Spruce
题设:T个样例下,每次输入n,m(1≤n,m≤500),和一张n×m的图,求这张图中可构成多少次云杉树。这里的云杉树可通俗化为:由数行构成,首行为一个星号,接下来每行星号长度增加2的轴对称“金字塔形”。
思路:dp,每个星号代表的值(即这个星号形成的云杉树的高度)可以由它的左下,正下和右下三个位置上是否有云杉树来决定。而且云杉树的最低高度就是只有一个星号,即为1。
这里需要注意,因为我们每个格子的状态都是由这个格子下面的三个格子递推出来的,所以在求这个格子的时候我们需要保证下面的三个格子已知,故需要从下往上遍历!!!
所以我们可以得出状态转移方程:
dp【i】【j】= min(dp【i+1】【j】,min(dp【i+1】【j-1】,dp【i+1】【j+1】))+1;
AC代码:
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
int dp[1050][1050];
void solve()
{
memset(dp, 0, sizeof dp);
int n, m;
int ans = 0;
cin >> n >> m;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++)
{
char c;
cin >> c; //在已经知道行列数的情况下,使用cin直接读入字符很方便。
if(c == '*') dp[i][j] = 1;
}
for(int i = n; i; i --)
for(int j = 1; j <= m; j ++)
{
if(dp[i][j])
dp[i][j] = min(dp[i + 1][j], min(dp[i + 1][j - 1],dp[i + 1][j + 1])) + 1;
ans += dp[i][j];
}
cout << ans << endl;
}
int main()
{
IOS; //加快cin和cout
int t;
cin >> t;
while(t --)
{
solve();
}
return 0;
}