1 条题解

  • 0
    @ 2026-10-25 22:36:36

    思路

    以每小时录用数前缀和建立容量上限与8小时下界,前7小时跨午夜依赖固定总人数;等式固定s24-s0,正环判不可行,二分最少总人数并严格输出No Solution。

    参考程序(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int T;cin>>T;while(T--){vector<int>need(25),num(25);for(int i=1;i<=24;i++)cin>>need[i];int N;cin>>N;for(int i=0;i<N;i++){int t;cin>>t;num[t+1]++;}auto feasible=[&](int total){vector<tuple<int,int,int>>e;for(int i=1;i<=24;i++){e.push_back({i-1,i,0});e.push_back({i,i-1,-num[i]});if(i>=8)e.push_back({i-8,i,need[i]});else e.push_back({i+16,i,need[i]-total});}e.push_back({0,24,total});e.push_back({24,0,-total});vector<int>d(25);for(int k=0;k<25;k++){bool changed=false;for(auto edge:e){int u,v,w;tie(u,v,w)=edge;if(d[v]<d[u]+w){d[v]=d[u]+w;changed=true;}}if(!changed)return true;}return false;};if(!feasible(N)){cout<<"No Solution\n";continue;}int lo=0,hi=N;while(lo<hi){int mid=(lo+hi)/2;if(feasible(mid))hi=mid;else lo=mid+1;}cout<<lo<<'\n';}}
    
    • 1

    信息

    ID
    1567
    时间
    1000ms
    内存
    64MiB
    难度
    提高
    标签
    递交数
    1
    已通过
    1
    上传者