家庭作业
#include<bits/stdc++.h>
#define io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long int ll;
typedef pair<int,int> PII;
ll n;
const int N = 1e6+10;
struct homework
{
ll ddl,point;
bool operator<(const homework& w)const//先修大学分
{
return point>w.point;
}
}homeworks[N];
bool vis[N];//这天要做神魔作业
ll ans;
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
{
scanf("%lld%lld",&homeworks[i].ddl,&homeworks[i].point);
}
sort(homeworks+1,homeworks+1+n);
ll sign=0;//最小坑位
for(int i=1;i<=n;i++)
{
if(homeworks[i].ddl <= sign)continue;//这坑没法占了,这学分不要也罢
int j;
for(j=homeworks[i].ddl;j>=1;j--)//从大的ddl开始寻找一个可以占的坑位
{
if(vis[j] == 0)
{
vis[j]=1;
ans+=homeworks[i].point;
break;//占到坑了
}
}
if(j == 0)//没坑位了,说明前面的都已经给占了,而且已经是最优解了
{
sign=max(sign,homeworks[i].ddl);
}
}
cout<<ans<<endl;
return 0;
}
智力大冲浪
#include<bits/stdc++.h>
#define io ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long int ll;
const int N = 510;
struct Game
{
ll ddl,punishmoney;
bool operator<(const Game& w)const
{
return punishmoney>w.punishmoney;
}
}Games[N];
bool vis[10010];
ll m,n;
// 4
int main()
{
cin>>m>>n;
for(int i=1;i<=n;i++)cin>>Games[i].ddl;
for(int i=1;i<=n;i++)cin>>Games[i].punishmoney;
sort(Games+1,Games+1+n);
for(int i=1;i<=n;i++)
{
for(int j=Games[i].ddl;j>=1;j--)
{
if(vis[j] == 0)//每个点的游戏
{
vis[j]=1;
Games[i].punishmoney=0;
break;
}
}
}
ll punishfinal=0;
for(int i=1;i<=n;i++)
{
punishfinal+=Games[i].punishmoney;
}
cout<<m-punishfinal<<endl;
return 0;
}