写在前面的话:我也是初学,有些分析或知识会有错误,望各位大佬们指教
原题链接
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragma warning(disable : 4996)
using namespace std;
int n, m, vis[1010][1010];
int w[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
char g[1010][1010];
struct node {
int x, y, z;
};
int bfs() {
deque<node> que;
node p, temp;
int i, j;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
vis[i][j] = -1;
p.x = p.y = 1;
p.z = 0;
que.push_back(p);
vis[1][1] = 0;
while (!que.empty())
{
p = que.front();
que.pop_front();
if (p.x == n && p.y == m)
return p.z;
for (i = 0; i < 4; i++)
{
int newx = p.x + w[i][0];
int newy = p.y + w[i][1];
if (newx <= 0 || newx > n || newy <= 0 || newy > m)
continue;
temp = p;
if (g[newx][newy] != g[p.x][p.y])
temp.z++;
if (vis[newx][newy] == -1 || temp.z < vis[newx][newy])
{
temp.x = newx;
temp.y = newy;
vis[newx][newy] = temp.z;
if (temp.z - p.z == 0)
que.push_front(temp);
else
que.push_back(temp);
}
}
}
return -1;
}
int main() {
int t, i, j;
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &m);
for (i = 1; i <= n; i++)
scanf("%s", g[i] + 1);
int ans = bfs();
printf("%d\n", ans);
}
system("pause");
return 0;
}
原题链接
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragma warning(disable : 4996)
using namespace std;
const int N = 10010;
int n, m, land[N], dp[N][1010], g, r, vis[N][1010];
struct node {
int pos, time;
};
int bfs() {
deque<node> que;
node p, temp;
int ans = -1;
p.time = 0;
p.pos = 1;
que.push_back(p);
vis[1][0] = 1;
while (!que.empty())
{
p = que.front();
que.pop_front();
if (p.time == 0) //红灯走完,判断可不可以直接到终点
{
int re = n - land[p.pos];
if (re <= g)
{
if (ans == -1 || ans > dp[p.pos][0] * (g + r) + re)
ans = dp[p.pos][0] * (g + r) + re;
}
}
if (p.time == g) //绿灯走完,循环次数+1,放队尾
{
if (vis[p.pos][0] == 0)
{
dp[p.pos][0] = dp[p.pos][g] + 1;
vis[p.pos][0] = 1;
temp = p;
temp.time = 0;
que.push_back(temp);
}
continue;
}
if (p.pos > 1)
{
int cost = land[p.pos] - land[p.pos - 1];
if (p.time + cost <= g && vis[p.pos - 1][p.time + cost] == 0)
{
vis[p.pos - 1][p.time + cost] = 1;
temp = p;
temp.pos--;
temp.time += cost;
dp[temp.pos][temp.time] = dp[p.pos][p.time];
que.push_front(temp);
}
}
if (p.pos < m)
{
int cost = land[p.pos + 1] - land[p.pos];
if (p.time + cost <= g && vis[p.pos + 1][p.time + cost] == 0)
{
vis[p.pos + 1][p.time + cost] = 1;
temp = p;
temp.pos++;
temp.time += cost;
dp[temp.pos][temp.time] = dp[p.pos][p.time];
que.push_front(temp);
}
}
}
return ans;
}
int main() {
int i;
scanf("%d%d", &n, &m);
for (i = 1; i <= m; i++)
scanf("%d", &land[i]);
sort(land + 1, land + 1 + m);
scanf("%d%d", &g, &r);
int ans = bfs();
printf("%d\n", ans);
system("pause");
return 0;
}
原题链接
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragma warning(disable : 4996)
using namespace std;
int n, m, r, c, a, b, cnt;
int w[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
char s[2010][2010];
int vis[2010][2010];
struct node {
int x, y, aa, bb;
};
void bfs() {
deque<node> que;
node p, temp;
int i;
p.x = r;
p.y = c;
p.aa = a;
p.bb = b;
que.push_back(p);
cnt = 1;
vis[p.x][p.y] = 1;
while (!que.empty())
{
p = que.front();
que.pop_front();
for (i = 0; i < 4; i++)
{
int newx = p.x + w[i][0];
int newy = p.y + w[i][1];
if (newx < 0 || newx >= n || newy < 0 || newy >= m || s[newx][newy] == '*' || vis[newx][newy] == 1)
continue;
temp = p;
if (i == 2)
temp.bb--;
else if (i == 3)
temp.aa--;
if (temp.aa < 0 || temp.bb < 0)
continue;
temp.x = newx;
temp.y = newy;
vis[newx][newy] = 1;
cnt++;
if (i == 2 || i == 3)
que.push_back(temp);
else
que.push_front(temp);
}
}
}
int main() {
int i;
scanf("%d%d", &n, &m);
scanf("%d%d", &r, &c);
r--;
c--;
scanf("%d%d", &a, &b);
for (i = 0; i < n; i++)
scanf("%s", s[i]);
bfs();
printf("%d\n", cnt);
system("pause");
return 0;
}
原题链接
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragma warning(disable : 4996)
using namespace std;
int vis[110], a[110];
int main()
{
int n, t, k, i, cnt, x, maxn, j;
vector<int> vec;
cin >> t;
while (t--)
{
cin >> n >> k;
vec.clear();
cnt = 0;
memset(vis, 0, sizeof(vis));
for (i = 1; i <= n; i++)
{
cin >> x;
a[i] = x;
if (vis[x] == 0)
{
cnt++;
vec.push_back(x);
}
vis[x]++;
}
if (k < cnt)
printf("-1\n");
else
{
printf("%d\n", k*n);
int m = -cnt + k;
for (i = 0; i < n; i++)
{
for (j = 0; j < cnt; j++)
{
if (i == 0 && j == 0)
printf("%d", vec[j]);
else
printf(" %d", vec[j]);
}
for (j = 0; j < m; j++)
printf(" 1");
}
printf("\n");
}
}
system("pause");
return 0;
}
原题链接
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragma warning(disable : 4996)
using namespace std;
char s[100010];
int main()
{
int t, i, n, k;
cin >> t;
while (t--)
{
cin >> n >> k;
cin >> s;
sort(s, s + n);
if (s[k - 1] != s[0])
cout << s[k - 1];
else
{
cout << s[k - 1];
if (s[n - 1] == s[k])
{
int num = (n - k) / k;
if ((n - k) % k)
num++;
for (i = 0; i < num; i++)
cout << s[k];
}
else
{
for (i = k; i < n; i++)
cout << s[i];
}
}
cout << endl;
}
system("pause");
return 0;
}
原题链接
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragma warning(disable : 4996)
using namespace std;
typedef long long ll;
const int N = 110;
const int INF = 0x7f7f7f7f;
int m, n, vis[N], p[N], tot, level[N], dis[N];
struct edge {
int to, val, next;
edge(int t = 0, int v = 0, int e = 0) :to(t), val(v), next(e) {}
}edges[N << 4];
vector<edge> vec[N];
void addedge(int from, int to, int val) {
tot++;
edges[tot].to = to;
edges[tot].val = val;
edges[tot].next = p[from];
p[from] = tot;
}
int Dijkstra(int x, int y) {
int i, u, v, minn;
memset(vis, 0, sizeof(vis));
for (i = 1; i <= n; i++)
dis[i] = INF;
for (i = p[n + 1]; i; i = edges[i].next)
{
v = edges[i].to;
if (level[v] < x || level[v] > y)
continue;
if (edges[i].val < dis[v])
dis[v] = edges[i].val;
}
for (int k = 1; k <= n; k++)
{
minn = INF;
for (i = 1; i <= n; i++)
{
if (vis[i] == 0 && minn > dis[i])
{
minn = dis[i];
u = i;
}
}
vis[u] = 1;
if (u == 1)
break;
for (i = p[u]; i; i = edges[i].next)
{
v = edges[i].to;
if (level[v] < x || level[v] > y)
continue;
if (vis[v] == 0 && dis[u] + edges[i].val < dis[v])
dis[v] = edges[i].val + dis[u];
}
}
return dis[1];
}
int main()
{
int i, x, y, z, k, j;
scanf("%d%d", &m, &n);
for (i = 1; i <= n; i++)
vec[i].clear();
memset(p, 0, sizeof(p));
tot = 0;
for (i = 1; i <= n; i++)
{
scanf("%d%d%d", &z, &level[i], &k);
addedge(n + 1, i, z);
for (j = 0; j < k; j++)
{
scanf("%d%d", &x, &z);
vec[i].push_back(edge(x, z, 0));
}
}
for (i = 1; i <= n; i++)
{
int len = vec[i].size();
for (j = 0; j < len; j++)
{
if (abs(level[i] - level[vec[i][j].to]) <= m)
addedge(vec[i][j].to, i, vec[i][j].val);
}
}
int ans = INF;
for (i = level[1] - m; i <= level[1]; i++)
{
ans = min(ans, Dijkstra(i, i + m));
}
printf("%d\n", ans);
system("pause");
return 0;
}
原题链接
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragma warning(disable : 4996)
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int mod = 998244353;
ll dp[1010][1010];
int main()
{
ll n, m, i, a, j;
a = 1;
scanf("%lld%lld", &n, &m);
for (i = 2; i <= m; i++)
{
while (m % (i*i) == 0)
{
a *= i;
m = m / (i*i);
}
}
//cout << a << endl;
//dp[i][j] j的i划分
dp[0][0] = 1;
for (i = 1; i <= n; i++)
for (j = 0; j <= a; j++)
{
if (j - i >= 0)
dp[i][j] = (dp[i - 1][j] + dp[i][j - i]) % mod;
else
dp[i][j] = dp[i - 1][j];
}
printf("%lld\n", dp[n][a]);
system("pause");
return 0;
}
原题链接
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragma warning(disable : 4996)
using namespace std;
typedef long long ll;
struct node {
int r, b;
}nodes[510];
ll dp[510][510];
int main()
{
int n, k, i, j, p;
ll sum = 0;
memset(dp, -1, sizeof(dp));
scanf("%d%d", &n, &k);
for (i = 1; i <= n; i++)
scanf("%d%d", &nodes[i].r, &nodes[i].b);
dp[0][0] = 0;
for (i = 1; i <= n; i++)
{
for (j = 0; j < k; j++)
{
if (dp[i - 1][j] >= 0)
{
int b1 = sum - dp[i - 1][j] * k - j; //第i个果园未取时,剩下蓝莓数
for (p = 1; p <= nodes[i].r&&p < k; p++) //枚举取红莓数
{
if (p + nodes[i].b >= k) //可以混合装篮
{
int b2 = b1 + nodes[i].b - (k - p); //混合装篮后,剩下蓝莓数
int a2 = j + nodes[i].r - p; //混合装篮后,剩下红莓数
dp[i][a2%k] = max(dp[i][a2%k], dp[i - 1][j] + 1 + a2 / k + b2 / k);
}
}
dp[i][(j + nodes[i].r) % k] = max(dp[i][(j + nodes[i].r) % k], dp[i - 1][j] + (j + nodes[i].r) / k + (b1 + nodes[i].b) / k);
}
}
sum += nodes[i].r + nodes[i].b;
}
ll ans = 0;
for (i = 0; i <= n; i++)
for (j = 0; j <= k; j++)
ans = max(dp[i][j], ans);
printf("%lld\n", ans);
system("pause");
return 0;
}
原题链接
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragma warning(disable : 4996)
using namespace std;
int a[200010], b[200010];
int main()
{
int t, n, i, j;
scanf("%d", &t);
while (t--)
{
scanf("%d", &n);
memset(b, 0, sizeof(b));
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
int flag = 1;
for (i = 0; i < n; i++)
{
int temp = ((a[i] + i) % n + n) % n;
b[temp]++;
if (b[temp] > 1)
{
flag = 0;
break;
}
}
if (flag)
printf("YES\n");
else
printf("NO\n");
}
system("pause");
return 0;
}
原题链接
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragma warning(disable : 4996)
using namespace std;
char s[1010][1010];
int n, m, g[1010][1010], tot;
int row[1010], col[1010];
int w[4][2] = { {1,0},{-1,0},{0,1},{0,-1} };
void dfs(int x, int y, int num) {
g[x][y] = num;
int i;
for (i = 0; i < 4; i++)
{
int newx = x + w[i][0];
int newy = y + w[i][1];
if (newx<1 || newx>n || newy<1 || newy>m || s[newx][newy] == '.' || g[newx][newy] != 0)
continue;
dfs(newx, newy, num);
}
}
int main()
{
int i, j, flag, num;
scanf("%d%d", &n, &m);
for (i = 1; i <= n; i++)
scanf("%s", s[i] + 1);
tot = 0;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
{
if (s[i][j] == '#')
{
row[i]++;
col[j]++;
}
if (s[i][j] == '#'&&g[i][j] == 0)
{
tot++;
dfs(i, j, tot);
}
}
flag = 1;
for (i = 1; i <= n; i++)
{
num = 0;
for (j = 1; j <= m; j++)
{
if (j == 1 && g[i][j] != 0)
num++;
else if (j > 1 && g[i][j] != 0 && g[i][j - 1] != g[i][j] && num > 0)
{
flag = 0;
break;
}
else if (g[i][j] != 0 && num == 0)
num++;
}
if (flag == 0)
break;
}
if (flag)
{
for (j = 1; j <= m; j++)
{
num = 0;
for (i = 1; i <= n; i++)
{
if (i == 1 && g[i][j] != 0)
num++;
else if (i > 1 && g[i][j] != 0 && g[i - 1][j] != g[i][j] && num > 0)
{
flag = 0;
break;
}
else if (g[i][j] != 0 && num == 0)
num++;
}
if (flag == 0)
break;
}
}
if (flag)
{
for (i = 1; i <= n; i++)
{
if (row[i] == 0)
{
num = 0;
for (j = 1; j <= m; j++)
{
if (col[j] == 0)
{
num++;
break;
}
}
if (num == 0)
{
flag = 0;
break;
}
}
}
for (j = 1; j <= m; j++)
{
if (col[j] == 0)
{
num = 0;
for (i = 1; i <= n; i++)
{
if (row[i] == 0)
{
num++;
break;
}
}
if (num == 0)
{
flag = 0;
break;
}
}
}
}
if (flag)
printf("%d\n", tot);
else
printf("-1\n");
system("pause");
return 0;
}
原题链接
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#pragma warning(disable : 4996)
using namespace std;
int f[100010];
int main() {
int t, n, i, j, flag, k, m;
cin >> t;
while (t--)
{
cin >> n >> k;
flag = 0;
for (i = 1; i <= n; i++)
{
cin >> m;
if (m > k)
f[i] = 2;
else if (m == k)
{
f[i] = 1;
flag++;
}
else
f[i] = 0;
}
if (flag == 0)
cout << "no" << endl;
else if (flag == n)
cout << "yes" << endl;
else
{
flag = 0;
int sum = 0;
for (i = 1; i <= n; i++)
{
for (j = i + 1; j - i <= 2 && j <= n; j++)
{
if (f[i] && f[j])
{
flag = 1;
break;
}
}
}
if (flag)
cout << "yes" << endl;
else
cout << "no" << endl;
}
}
system("pause");
return 0;
}