250:
很水的题,写的比较暴力,有效率更高的解法。
#include <string>
#include <memory.h>
using namespace std;
class InterestingNumber
{
public:
string isInteresting(string x)
{
int len = x.length();
bool visit[100];
memset(visit, 0, sizeof(visit));
for(int i = 0; i < len; i++)
{
if(visit[i])
continue;
char s = x[i];
int end, count = 0;
for(int j = i + 1; j < len; j++)
{
if(x[j] == s)
{
end = j;
count++;
}
}
if(count != 1)
return "Not interesting";
if(end - i - 1 != s - '0')
return "Not interesting";
visit[end] = 1;
}
return "Interesting";
}
};
500:
只需要考虑能被x整除的数,而且如果x是其中几个数的最小公倍数,那x必然是这所有能被它整除的数的最小公倍数。因此直接对这些数求最小公倍数即可。
#include <stdio.h>
#include <vector>
#include <string>
using namespace std;
class LCMSetEasy
{
public:
string include(vector<int> S, int x)
{
int temp = 1;
bool found = false;
for(int i = 0; i < S.size(); i++)
{
if(x % S[i] == 0)
{
found = true;
printf("S[i]:%d\n", S[i]);
temp = lcm(S[i], temp);
printf("LCM:%d\n", temp);
if(temp == x)
return "Possible";
}
}
printf("%d\n", temp);
if(found && temp == x)
return "Possible";
else
return "Impossible";
}
private:
int gcd(int a, int b)
{
if(a < b)
return gcd(b, a);
if(b == 0)
return a;
return gcd(b, a % b);
}
int lcm(int a, int b)
{
return a / gcd(a, b) * b;
}
};
1000:
比较简单,我从格子的角度出发,对每一个格子搜索它可能对应的大象,分上、下、左、右四个方向,写的较为复杂。其实从大象的角度出发寻找对应的格子,即直线上最近的那个格子,会更加简洁。
#include <vector>
#include <string>
#include <stdio.h>
#include <memory.h>
using namespace std;
class ElephantDrinkingEasy
{
public:
int maxElephants(vector <string> map)
{
memset(visit, 0, sizeof(visit));
result = 0;
row = map.size();
column = map[0].length();
eleCnt = 4 * column;
waterCnt = 0;
buildGraph(map);
for(int i = 0; i <= row + 1; i++)
{
for(int j = 0; j <= column + 1; j++)
{
printf("%c", graph[i][j]);
}
printf("\n");
}
dfs(1, 1, 0);
return result;
}
private:
void dfs(int r, int c, int count)
{
if(result == eleCnt || result == waterCnt)
return;
if(r > row)
return;
if(c > column)
{
dfs(r + 1, 1, count);
return;
}
if(!visit[r][c] && graph[r][c] == 'Y')
{
bool flag = false;
// if(count == 3 && r == 2 && c == 1)
// {
// printf("count == 3:\n");
// for(int i = 0; i <= row + 1; i++)
// {
// for(int j = 0; j <= column + 1; j++)
// {
// printf("%d", visit[i][j]);
// }
// printf("\n");
// }
// }
//向上
for(int i = r - 1; i >=0; i--)
{
if(visit[i][c] || graph[i][c] == 'Y')
{
flag = true;
break;
}
}
if(!flag)
{
// if(r == 2 && c == 1 && count == 3)
// {
// printf("up error\n");
// }
for(int i = r; i >= 0; i--)
{
visit[i][c] = 1;
}
if(count + 1 > result)
{
result = count + 1;
}
dfs(r, c + 1, count + 1);
for(int i = r; i >= 0; i--)
{
visit[i][c] = 0;
}
}
//向右
flag = false;
for(int i = c + 1; i <= column + 1; i++)
{
if(visit[r][i] || graph[r][i] == 'Y')
{
flag = true;
break;
}
}
if(!flag)
{
// if(r == 2 && c == 1 && count == 3)
// {
// printf("right error\n");
// }
for(int i = c; i <= column + 1; i++)
{
visit[r][i] = 1;
}
if(count + 1 > result)
{
result = count + 1;
}
dfs(r, c + 1, count + 1);
for(int i = c; i <= column + 1; i++)
{
visit[r][i] = 0;
}
}
//向下
flag = false;
for(int i = r + 1; i <= row + 1; i++)
{
if(visit[i][c] || graph[i][c] == 'Y')
{
flag = true;
break;
}
}
if(!flag)
{
// if(r == 2 && c == 1 && count == 3)
// {
// printf("yes\n");
// }
for(int i = r; i <= row + 1; i++)
{
visit[i][c] = 1;
}
if(count + 1 > result)
{
result = count + 1;
}
dfs(r, c + 1, count + 1);
for(int i = r; i <= row + 1; i++)
{
visit[i][c] = 0;
}
}
//向左
flag = false;
for(int i = c - 1; i >= 0; i--)
{
if(visit[r][i] || graph[r][i] == 'Y')
{
flag = true;
break;
}
}
if(!flag)
{
for(int i = c; i >= 0; i--)
{
visit[r][i] = 1;
}
if(count + 1 > result)
{
result = count + 1;
}
dfs(r, c + 1, count + 1);
for(int i = c; i >= 0; i--)
{
visit[r][i] = 0;
}
}
}
dfs(r, c + 1, count);
}
void buildGraph(std::vector<string> map)
{
memset(graph, '0', sizeof(graph));
for(int i = 0; i < map.size(); i++)
{
for(int j = 0; j < map[i].length(); j++)
{
graph[i + 1][j + 1] = map[i][j];
if(graph[i + 1][j + 1] == 'Y')
{
waterCnt++;
}
}
}
}
private:
bool visit[10][10];
char graph[10][10];
int result;
int row;
int column;
int eleCnt;
int waterCnt;
};