社区讨论
论贪心能过此题
P2763试题库问题参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhjdeukz
- 此快照首次捕获于
- 2025/11/04 00:44 4 个月前
- 此快照最后确认于
- 2025/11/04 00:44 4 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5;
int n,k;
int a[N],tk[25][N],p[N];
vector<int>ans[25];
bool use[N];
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>k>>n;
for(int i=1; i<=k; i++)
cin>>a[i];
for(int i=1; i<=n; i++)
{
cin>>p[i];
for(int j=1; j<=p[i]; j++)
{
int x;
cin>>x;
tk[x][i]=1;
}
}
for(int i=1; i<=k;)//范围
{
int x=i+1;//临
for(int j=1; j<=k; j++)//类型
{
if(ans[j].size()==a[j])continue;
for(int l=1; l<=n; l++)//题号
{
if(ans[j].size()==a[j])break;
if(p[l]==i)
if(tk[j][l])
{
ans[j].push_back(l);
tk[j][l]=p[l]=0;
}
}
if(ans[j].size()==a[j])
for(int l=1; l<=n; l++)//题号
if(tk[j][l])p[l]--,x=min(x,p[l]);
}
if(x!=i+1)i=x;
else i++;
}
for(int i=1; i<=k; i++)
if(ans[i].size()<a[i])
{
cout<<"No Solution!\n";
return 0;
}
for(int i=1; i<=k; i++)
{
cout<<i<<": ";
for(int j:ans[i])cout<<j<<' ';
cout<<'\n';
}
return 0;
}
/*
3 6
2 3 1
1 1
1 2
1 2
1 3
2 1 2
2 1 3
*/
大致思路就是优先使用所属类别数量少的题目,若一种类别已经满足,则将属于该类别的题目的所属类别数量减 。
回复
共 1 条回复,欢迎继续交流。
正在加载回复...