a_vj_Judges' response(问题转化:背包壮压+MTSP问题)

有n-1个参赛选手举手回答问题(每个人的提问时间已确定为\(c_i\));裁判们都集中在(0,0)位置,每个裁判用于回答问题的时间都不能超过m分钟,问:

  • 求至少需要多少才能回答完所有举手
  • 如果裁判有无数个,问裁判们从出发点出发,回答完问题,然后回到出发点的需要的最少时间

思路:第一问很好解,第二问不会

#include<bits/stdc++.h>
using namespace std;
const int N=17,inf=0x3f3f3f3f;
int n,m,ALL,st[1<<N],f[1<<N],c[N];
vector<int> sta;
struct node {
    int x,y;
}A[N];
int get_cost(int mask) {
    int cost=0;
    for (int i=0; i<n; i++) if (mask&(1<<i)) cost+=c[i];
    return cost<=m ? cost : -1;
}
bool init() {
    bool valid=1;
    for (int i=0; i<n; i++) cin>>A[i].x>>A[i].y;
    for (int i=0; i<n; i++) {
        cin>>c[i];
        if (c[i]>m) valid=false;
    }
    ALL=1<<n;
    for (int i=0; i<ALL; i++) if (get_cost(i)!=-1) {
        sta.push_back(i);  
    }
    return valid;
}
int solve1() {
    memset(f,inf,sizeof f), f[0]=0;
    for (int j=0; j<ALL; j++) if (f[j]!=inf) 
    for (int s : sta)
        f[j|s]=min(f[j|s], f[j]+1);
    return f[ALL-1];
}
int solve2() {
    memset(st,0,sizeof st);
    //to do...
    return 0;
}
int main() {
    std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    while (cin>>n>>m) {
        if (!init()) cout<<-1<<' '<<-1<<'\n';
        else cout<<solve1()<<' '<<solve2()<<'\n';
    }
    return 0;
}
posted @ 2020-11-09 11:02  童年の波鞋  阅读(70)  评论(0编辑  收藏  举报