#include <bits/stdc++.h>
using namespace std;
int n,m;
int a[1010],b[1010];
bool cmp(int,int);
int main()
{
int kk;
cin>>kk;
while(kk--)
{
cin>>n>>m;
for(int i = 1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1,cmp);
int sum = 0;
b[1010] = {0};
for(int i = 1;i<=n;i++)
{
int mi = 999999999,mii;
for(int j = 1;j<=m;j++)
{
if(b[j]<mi) mi = b[j],mii = j;
}
b[mii] += a[i];
}
int ma = -999999999;
for(int i = 1;i<=m;i++)
{
ma = max(ma,b[i]);
}
cout<<ma<<endl;
}
return 0;
}
bool cmp(int xx,int yy)
{
return xx>yy;
}
排队打水问题
cpp复制代码
#include <bits/stdc++.h>
using namespace std;
int n,m;
int a[1010],b[1010];
int main()
{
cin>>n>>m;
for(int i = 1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
int sum = 0;
for(int i = 1;i<=n;i++)
{
int mi = 999999999,mii;
for(int j = 1;j<=m;j++)
{
if(b[j]<mi) mi = b[j],mii = j;
}
b[mii] += a[i];
sum += b[mii];
}
cout<<sum;
return 0;
}
找零钱问题
cpp复制代码
#include <bits/stdc++.h>
using namespace std;
int n;
int a[10] = {0,1000,500,200,100,50,20,10,5,1};
int cnt;
int main()
{
float nn;
cin>>nn;
n = nn*10;
for(int i = 1;i<10;i++)
{
int x = n/a[i];
cnt += x;
cout<<a[i]*1.0/10<<":"<<x<<endl;
n = n%a[i];
}
cout<<cnt;
return 0;
}
活动选择问题
cpp复制代码
#include <bits/stdc++.h>
using namespace std;
struct node
{
int x,y,v;
node(){};
node(int aa,int bb,int cc)
{
x = aa;
y = bb;
v = cc;
}
};
int n;
node a[10010];
node b[10010];
int lb;
int cnt;
int main()
{
cin>>n;
for(int i = 1;i<=n;i++)
{
cin>>a[i].x>>a[i].y;
a[i].v = i;
}
for(int i = 1;i<=n-1;i++)
{
for(int j = 1;j<=n-1-i;j++)
{
if(a[j].y>a[j+1].y)
{
swap(a[j],a[j+1]);
}
}
}
b[++lb] = {a[1].x,a[1].y,a[1].v};
cnt = 1;
for(int i = 2;i<=n;i++)
{
if(a[i].x>=b[lb].y)
{
b[++lb] = {a[i].x,a[i].y,a[i].v};
cnt++;
}
}
cout<<cnt<<endl;
for(int i = 1;i<=lb;i++)
{
cout<<b[i].v<<" ";
}
return 0;
}
可分割背包问题
cpp复制代码
#include <bits/stdc++.h>
using namespace std;
int n,m;
float w[10010],v[10010];
float x[10010];
int main()
{
int ttt;
cin>>ttt;
while(ttt--)
{
cin>>m>>n;
for(int i = 1;i<=n;i++)
{
cin>>w[i]>>v[i];
x[i] = v[i]/w[i];
}
for(int i = 1;i<=n-1;i++)
{
for(int j = 1;j<=n-1-i;j++)
{
if(x[j]<x[j+1])
{
swap(x[j],x[j+1]);
swap(w[j],w[j+1]);
swap(v[j],v[j+1]);
}
}
}
float sum = 0;
for(int i = 1;i<=n;i++)
{
if(m==0) break;
if(m>=w[i]) m -= w[i],sum += v[i];
else
{
sum += x[i]*m;
m = 0;
}
}
cout<<fixed<<setprecision(2)<<sum<<endl;
}
return 0;
}