小明要为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
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<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;
}
比较简单的二分答案的思想#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;
}