蓝桥杯A组java_第十届蓝桥杯解题代码——Java/C++ A组

讲解视频在b站。

试题H:修改数组

#include

using namespace std;

const int N = 100010, M = 1100010;

int n;

int p[M];

int find(int x)

{

if (p[x] != x) p[x] = find(p[x]);

return p[x];

}

int main()

{

scanf("%d", &n);

for (int i = 1; i < M; i ++ ) p[i] = i;

for (int i = 1; i <= n; i ++ )

{

int a;

scanf("%d", &a);

a = find(a);

printf("%d ", a);

p[a] = a + 1;

}

return 0;

}

试题I:糖果

#include

#include

#include

#include

using namespace std;

const int N = 100, M = 20;

int n, m, k;

int package[N], f[1 << M];

vector candy[M];

bool st[M];

int h(int state)

{

int res = 0;

for (int s = (1 << m) - 1 - state; s; s -= s & -s)

{

int i = f[s & -s];

res ++ ;

for (auto p : candy[i])

s &= ~package[p];

}

return res;

}

bool dfs(int u, int state)

{

if (!u || u < h(state))

{

if (state == (1 << m) - 1) return true;

return false;

}

int c = -1;

for (int s = (1 << m) - 1 - state; s; s -= s & -s)

{

int i = f[s & -s];

if (c == -1 || candy[c].size() > candy[i].size())

c = i;

}

for (auto p : candy[c])

if (dfs(u - 1, state | package[p]))

return true;

return false;

}

int main()

{

cin >> n >> m >> k;

for (int i = 0; i < m; i ++ ) f[1 << i] = i;

for (int i = 0; i < n; i ++ )

{

memset(st, false, sizeof st);

for (int j = 0, t; j < k; j ++ )

{

cin >> t;

st[t - 1] = true;

}

for (int j = 0; j < m; j ++ )

if (st[j])

{

package[i] += 1 << j;

candy[j].push_back(i);

}

}

int t;

for (t = 0; t <= m; t ++ )

if (dfs(t, 0))

break;

if (t > m) t = -1;

cout << t << endl;

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值