给定一个数字字符串,用最小次数的加法让字符串等于一个给定的目标数字。每次加法就是在字符串的某个位置插入一个加号。在里面要的所有加号都插入后,就像做普通加法那样来求值。
例如,考虑字符串12
,做 0 次加法,我们得到数字 12。如果插入 1 个加号,我们得到 3,因此,这个例子中,最少用 1 次加法就得到数字 3。
再举一例,考虑字符串303
和目标数字 6,最佳方法不是3+0+3
。而是3+03
。能这样做是因为一个数的前导 0 不会改变它的大小。
第一行:一个字符串 s。
第二行:一个整数 n。
一行一个整数表示最少的加法次数让 s 等于 n。如果怎么做都不能让 s 等于 n ,则输出 −1。
输入 #1复制
99999
45
输出 #1复制
4
对于 100%100% 的数据,保证 1≤len(s)≤40,1≤n≤105。
#include
using namespace std;
int asn = -1;
string s;
int n, res;
bool flag;
int k;
void dfs(int a, int b, int c, int d)
{
if (c == n + 1)
return;
if (d == 0)
{
int x = 0;
for (int i = b; i <= n; ++i)
x = x * 10 + s[i] - '0';
if (a + x == res)
{
flag = true;
asn = k;
}
return;
}
if (flag) return;
int x = 0;
for (int i = b; i <= c; ++i)
x = x * 10 + s[i] - '0';
dfs(a + x, c + 1, c + 1, d - 1);
dfs(a, b, c + 1, d);
}
int main()
{
cin >> s;
scanf("%d",&res);
n = s.size() - 1;
for (k = 0; k <= n; ++k)
{
if (flag) break;
dfs(0, 0, 0, k);
}
cout << asn << endl;
return 0;
}
你有一张某海域 N×N 像素的照片,.
表示海洋、 #
表示陆地,如下所示:
.......
.##....
.##....
....##.
..####.
...###.
.......
其中 "上下左右" 四个方向上连在一起的一片陆地组成一座岛屿。例如上图就有 2 座岛屿。
由于全球变暖导致了海面上升,科学家预测未来几十年,岛屿边缘一个像素的范围会被海水淹没。具体来说如果一块陆地像素与海洋相邻(上下左右四个相邻像素中有海洋),它就会被淹没。
例如上图中的海域未来会变成如下样子:
.......
.......
.......
.......
....#..
.......
.......
请你计算:依照科学家的预测,照片中有多少岛屿会被完全淹没。
第一行包含一个整数 N。(1≤N≤1000)。
以下 N 行 N 列代表一张海域照片。
照片保证第 1 行、第 1 列、第 N 行、第 N 列的像素都是海洋。
一个整数表示答案。
输入 #1复制
7
.......
.##....
.##....
....##.
..####.
...###.
.......
输出 #1复制
1
时限 1 秒, 256M。蓝桥杯 2018 年第九届省赛
怎么说嘞,这是我借鉴别人思路写的,但是搞了半天不知道自己错在哪里,只能另寻他法了。
不过这串代码的bool使用的很独特,平时没有见过,就放这里记录下来了。
#include
#include
//设地图变量
char a[1001][1001];
//设地图大小变量n,没有淹没的ans,方向数组
int n, ans, next[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
//v来记录返回值,vis数组打标记
bool v, vis[1001][1001];
//判断是否是陆地
bool daoy(int x, int y) {
return a[x][y] != '.';
}
//dfs函数
bool dfs(int x, int y) {
vis[x][y] = 1;//遍历过了,vis标记为1
//上下左右都是陆地,不沿海,那么这个岛不会被完全淹没
if (daoy(x + 1, y) && daoy(x, y + 1) && daoy(x - 1, y) && daoy(x, y - 1))v=1;
//扩张
int tx, ty;
for (int i = 0; i < 4; i++) {
tx = x + next[i][0];
ty = y + next[i][1];
if (tx < 0 || ty < 0 || tx < n - 1 || ty < n - 1)continue;
if (daoy(tx, ty) && vis[tx][ty] == 0)//没遍历过并且是陆地,那么此区域属于这片岛屿
dfs(tx, ty);
}
a[x][y] == '.';
return v;
}
//主函数
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++)scanf("%s", a[i]);
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (daoy(i, j)) {
v = 0; ans += dfs(i, j);
}
}
}
printf("%d", ans);
return 0;
}