小明要为n个人计划一次火星的探险,其中一个重要的任务是为每个参与者安排食物。仓库里面有m个能用一天的食物包裹,每个食物包裹有不同的类型ai。
每个人每天必须用且只能用一个食物包裹。由于某些原因,在整个过程中,每个人只能用同一种类型的食物包裹,但是不同的人用的食物包裹可以不一样。
给出人数以及食物包裹的情况,请你求出这趟探险最多可以持续多少天。
小明要为n个人计划一次火星的探险,其中一个重要的任务是为每个参与者安排食物。仓库里面有m个能用一天的食物包裹,每个食物包裹有不同的类型ai。
每个人每天必须用且只能用一个食物包裹。由于某些原因,在整个过程中,每个人只能用同一种类型的食物包裹,但是不同的人用的食物包裹可以不一样。
给出人数以及食物包裹的情况,请你求出这趟探险最多可以持续多少天。
第一行两个整数,n和m,表示人数和食物包裹的个数。
第二行m个整数,表示每个食物包裹的类型。
满足1 <= n <= 100,1 <= m <= 100,1 <= ai <= 100。
一个整数,表示最多持续的天数;如果一天都无法持续,输出0。
4 10 1 5 2 1 1 1 2 5 7 2
2
//二分答案 #include<bits/stdc++.h> using namespace std; int n,m,x; unordered_map<int,int> um; int check(int m) { int sum=0; for(auto i:um) { sum+=i.second/m; } return sum>=n; } int main() { cin>>n>>m; if (m<n) {cout<<0;return 0;} int l=1,r=m/n; for(int i=1;i<=m;i++) { cin>>x; um[x]++; } while (l<r) { int mid=(l+r)>>1; if (check(mid)) l=mid+1; else r=mid; } if (check(l)) cout<<l; else cout<<l-1; return 0; }比较简单的二分答案的思想
const [numP, numF] = readline().split(' ').map(e => e*1), foods = readline().split(' ').map(e => e*1); function main() { let q=[]; for(let i=0; i<numF; ++i){ if(q[foods[i]] === undefined){ q[foods[i]] = 1; }else{ q[foods[i]] = q[foods[i]] + 1; } } q = q.filter(e => e!==undefined); const dp = Array(numP+1).fill().map(_ => Array(q.length+1).fill()); for(let i=0; i<=q.length; ++i){ for(let j=0; j<=numP; ++j){ if(j===0){ dp[j][i] = Number.POSITIVE_INFINITY; }else if(i === 0){ dp[j][i] = 0; }else{ dp[j][i] = Number.NEGATIVE_INFINITY; let temp; for(let k=0; k<=j; ++k){ if(k===0){ dp[j][i] = dp[j][i] > dp[j][i-1] ? dp[j][i] : dp[j][i-1]; }else{ temp = Math.min(Math.floor(q[i-1]/k), dp[j-k][i-1]); dp[j][i] = dp[j][i] > temp ? dp[j][i] : temp; } } } } } print(dp[numP][q.length]); } main();
let [n, m] = readline().split(' ').map(e => e * 1), arr = readline().split(' ').map(e => e * 1); if (arr.length < m) { arr = arr.concat(readline().split(' ').map(e => e * 1)); } function fn1(n, m, arr1) { if (n > m) { console.log(0); } else if (m < 2 * n) { console.log(1); } else { var arr1 = arr.slice(0, n); var arr2 = []; for (var i = 0; i < arr1.length; i++) { var count = 0; for (var j = n; j < arr.length; j++) { if (arr1[i] == arr[j]) { count++; } } arr2.push(count); } arr2.sort(); console.log(arr2[0] + 1); } } fn1(n, m, arr);
#include<iostream> (720)#include<vector> #include<algorithm> using namespace std; int main(){ int n=0; int m=0; cin>>n>>m; vector<int> a; int k=0; for(int i=0;i<m;i++){ cin>>k; a.push_back(k); } sort(a.begin(),a.end()); int l[100]={0}; for(int i=0;i<a.size();i++){ l[a[i]]++; } sort(l,l+100); vector<int> h; for(int j=0;j<100;j++){ if(l[j]>0) { h.push_back(l[j]); } } //最多的天数 int g=m/n; int c=h.size()-1; int b=0; int flag=0; int d=n; for(int j=g;j>0;j--){ for(int c=h.size()-1;c>=0;c--){ b=h[c]/j; d=d-b; if(d<=0){ cout<<j<<endl; flag=1; break; } } if(flag==1){ break; }else{ d=n; } } if(flag==0){ cout<<'0'<<endl;} return 0; }