import java.util.Scanner;
public class Main {
public static void main(String[] arg) {
Scanner scanner = new Scanner(System.in);
// todo
}
}
NC205306. 动物森友会
描述
输入描述
第一行包含 2 个整数 n, e (,
),中间以空格分隔,分别表示不同事件的数量和 Compute 一天能完成的事件次数。
接下来 n 行,每行包含个整数
,
,
(
,
,
,
),中间以空格分隔,分别表示事件 i 需要完成的次数、事件开放的天数和事件 i 在一周中的哪些时间会开放。
输出描述
在一行输出一个整数,表示 Compute 造出高达的最少天数。
示例1
输入:
5 2 2 4 1 3 5 7 2 3 2 4 6 2 2 1 2 2 2 3 4 2 2 5 6
输出:
5
C++14(g++5.4) 解法, 执行用时: 17ms, 内存消耗: 608K, 提交时间: 2020-05-01 09:02:33
#include<bits/stdc++.h>using namespace std;using ll = long long;using pii = pair<int, int>;using db = double;using vi = vector<int>;#define rep(i,a,n) for (int i=a;i<n;i++)#define per(i,a,n) for (int i=n-1;i>=a;i--)#define pb push_back#define mp make_pair#define all(x) (x).begin(),(x).end()#define fi first#define se second#define SZ(x) ((int)(x).size())#define debug(x) cout << #x <<"\t" << x <<endlconst int inf = 0x3f3f3f3f;const db eps = 1e-8;const int mod = 1e9+7;ll qpow(ll a, ll b){ll ret = 1;while(b){if(b&1)ret = ret*a%mod;a = a*a%mod;b>>=1;}return ret;}int n, e;int sta[1010];int c[1010], num[10];bool check(int x){memset(num, 0, sizeof(num));for(int i=1; i<=7; ++i) num[i] = x/7;for(int i=1; i<=x%7; ++i) num[i]++;for(int msk = 0; msk<(1<<7); msk++){ll R=0;for(int i=1; i<=7; ++i) if(msk&(1<<(i-1)))R += 1ll*num[i]*e;ll L = 0;for(int i=1; i<=n; ++i) if((sta[i]&msk)==sta[i]) L += c[i];if(L>R)return 0;}return 1;}int main(){ios::sync_with_stdio(false);cin.tie(0);cin >> n >> e;for(int i=1; i<=n; ++i){cin >> c[i];int m; cin >> m;int msk = 0;while(m--){int x;cin>> x;msk |= (1<<(x-1));}sta[i] = msk;}int l = 1, r = 700000000;while(l<=r){int m = l+r>>1;if(check(m)) r = m-1;else l = m+1;// debug(m);}cout << l <<"\n";}
C++(clang++ 11.0.1) 解法, 执行用时: 4ms, 内存消耗: 472K, 提交时间: 2023-03-15 08:27:19
#include<bits/stdc++.h>using namespace std;int main(){int i,j,k,x,n,e,ans=0,R[135]={0};scanf("%d%d",&n,&e);while(n--){bool V[7]={0};scanf("%d%d",&x,&k);for(i=0;i<k;i++)scanf("%d",&j),V[j-1]=1;for(i=1;i<128;i++){for(j=0;j<7;j++)if(V[j]&&!((1<<j)&i))break;if(j==7)R[i]+=x;}}for(i=1;i<(1<<7);i++){if(!R[i])continue;n=__builtin_popcount(i),k=R[i]/e+(R[i]%e?1:0);for(j=0;j<7;j++){if(!((1<<j)&i))continue;if((--k)%n==0)break;}ans=max(ans,k/n*7+j+1);}printf("%d\n",ans);return 0;}