PAT1149 Dangerous Goods Packaging 危险品集装箱 (STL)

传送门

给定一张不相容物品的清单,需要你检查每一张集装箱货品清单,判断它们是否能装在同一只箱子里。

思路1:对每一组询问,遍历不相容的清单,看在集合中是否同时存在

#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define INF 0x3f3f3f;
#define x first
#define y second
using namespace std;
const int N=1e4+233;
int n,m,k;
pair<int,int>p[N];
unordered_set<int>s;

int main(){
    cin>>n>>m;
    rep(i,0,n)  cin>>p[i].x>>p[i].y;
    while(m--){
        cin>>k;
        s.clear();
        while(k--) {
            int a;
            cin>>a;
            s.insert(a);
        }
        int flag=1;
        rep(i,0,n)
            if(s.count(p[i].x)&&s.count(p[i].y)) flag=0;
        
        if(flag) puts("Yes");
        else puts("No");
    }
}

思路2:

先对标号离散化,然后可以用二维数组代表所有物品之间的相容关系。对每一组询问之间,暴力每两个之间的关系。

但是不推荐这个思路,很麻烦

#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<n;i++)
#define INF 0x3f3f3f;
using namespace std;
const int N=1e5+233;
int n,m,k;

vector<int>c[N];
map<int,int>p;
int vis[N];
int a[N];
int cnt;
int main(){
    cin>>n>>m;
    rep(i,0,n) {
        int s,t;
        cin>>s>>t;
        if(!p[s]) p[s]=++cnt;
        if(!p[t]) p[t]=++cnt;
        c[p[s]].push_back(p[t]);
        c[p[t]].push_back(p[s]);
    } 
  while(m--){
    cin>>k;
    memset(vis,0,sizeof(vis));
    rep(i,0,k) {
      cin>>a[i];
      if(!p[a[i]]) p[a[i]]=++cnt;
      vis[p[a[i]]] = 1;
    }
    int flag=1;
    rep(i,0,k)
      rep(j,0,c[p[a[i]]].size())
        if(vis[c[p[a[i]]][j]]){
          flag=0;break;
        }
    if(flag) puts("Yes");
    else puts("No");
  }
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值