zoukankan      html  css  js  c++  java
  • Codeforces 1203F2 Complete the Projects (hard version)

    [cf题面](https://codeforces.com/contest/1203/problem/F2

    • Time limit
      2000 ms

    • Memory limit
      262144 kB

    解题思路

    贪心加01背包

    就像这题的简单版本那样排序,然后把涨rating的工作先尽量做了。对于掉rating的工作,可以用01背包跑,设(dp[i][j])意思是处理到第(i)个掉分的工作,当前rating为(j)时能完成的最多工作的数量。然后由于按顺序处理这些工作,所以(i)这一维可以滚动,节省空间。

    可反悔的贪心

    先留坑,又可以搞成一个专题了。https://www.cnblogs.com/Miracevin/p/9795871.html

    源代码

    贪心加01背包的——

    #include<cstdio>
    #include<algorithm>
    int n,r;
    struct Data{
    	int need,delta;
    	bool operator < (const Data & a)const{
    		if(delta>=0)
    			return need<a.need;
    		return need>a.need;//对于掉粉的,总和越大越靠前,在输入时处理
    	}
    }pos[105],neg[105];//上分的和掉分的
    int numpos,numneg;//两种工作的数量
    int dp[60010];
    int main()
    {
    	scanf("%d%d",&n,&r);
    	for(int i=1,x,y;i<=n;i++)
    	{
    		scanf("%d%d",&x,&y);
    		if(y>=0)
    			pos[numpos++]={x,y};
    		else
    			neg[numneg++]={x+y,y};
    	}
    	std::sort(pos,pos+numpos);
    	std::sort(neg,neg+numneg);
    	int ans=0;
    	for(int i=0;i<numpos;i++)
    	{
    		if(r>=pos[i].need) ans++,r+=pos[i].delta;
    		else break;
    	}
    	dp[r]=ans;//当前rating能拿到的最多的工程数量
    	for(int i=0;i<numneg;i++)
    	{
    		int nd=neg[i].need-neg[i].delta,dt=neg[i].delta;//排完序之后恢复输入的原始数据
    		for(int j=std::max(nd,-dt);j<=r;j++)    //std::max(nd,-delta)用于保证rating够用且满足要求
    		{//dt<0,j+dt是更小的rating,比较的作用是降到那个rating时可以完成的最多的工作数量
    			dp[j+dt]=std::max(dp[j]+1,dp[j+dt]);
    		}
    	}
    	ans=-1;
    	for(int i=0;i<=r;i++)
    	{
    		ans=std::max(dp[i],ans);
    	}
    	printf("%d
    ",ans);
    	return 0;
    }
    
    
  • 相关阅读:
    Linq101-Generation
    Linq101-Element
    解决 oracle 错误ORA-01033
    Oracle数据表恢复
    C++构造函数
    C++类与对象
    CMake命令之export
    CMake命令之install
    CMake变量(提供信息的变量)
    CMake常用变量
  • 原文地址:https://www.cnblogs.com/wawcac-blog/p/11359534.html
Copyright © 2011-2022 走看看