繁华模拟赛 最优得分
Posted ACforever
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了繁华模拟赛 最优得分相关的知识,希望对你有一定的参考价值。
#include<iostream> #include<cstdio> #include<string> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #define ll long long using namespace std; const int maxn = 1005,maxt = 3005,maxint = 987654321; struct query{ ll a; ll b; ll c; friend bool operator <(query x,query y){ return y.b * x.c < x.b * y.c; } }; int n,t,dp[maxt]; query q[maxn]; void input(){ cin>>n>>t; for(int i = 1;i <= n;i++){ scanf("%d%d%d",&q[i].a,&q[i].b,&q[i].c); } sort(q+1,q+1+n); memset(dp,-1,sizeof(dp)); dp[0] = 0; } void work(){ for(int i = 1;i <= n;i++){ for(int j = t;j >= q[i].c;j--){ if(dp[j-q[i].c] != -1 && dp[j] < dp[j-q[i].c] + q[i].a - q[i].b * j) dp[j] = dp[j-q[i].c] + q[i].a - q[i].b * j; } } int ans = 0; for(int i = 0;i <= t;i++) ans = max(ans,dp[i]); cout<<ans<<endl; } int main(){ //freopen("score.in","r",stdin); //freopen("score.out","w",stdout); int T; cin>>T; while(T--){ input(); work(); } return 0; } #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<vector> #include<queue> #include<map> #include<set> #include<stack> #include<cstdlib> #include<string> #include<bitset> #include<ctime> #define INF 1000000000 #define N 3005 #define fi first #define se second #define debug(x) cerr<<#x<<"="<<x<<endl #define MP(x,y) make_pair(x,y) using namespace std; typedef long long LL; typedef pair<int,int> pii; struct Data { int a,b,c; }p[N]; bool operator < (Data a,Data b) { return a.c*b.b<b.c*a.b; } inline void upd(int &x,int y) { if(x<y) x=y; } int dp[N]; int main() { int T,n,t,j,fn,ans=0,i; //freopen("score.in","r",stdin); //freopen("score.out","w",stdout); //int t1=clock(); cin>>T; while(T--) { ans=0; cin>>n>>t; for(i=1;i<=n;i++) scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].c); sort(p+1,p+1+n); memset(dp,-1,sizeof(dp)); dp[0]=0; for(i=1;i<=n;i++) { //debug(p[i].a); fn=p[i].a-p[i].b*t; //debug(fn); for(j=t;j>=p[i].c;j--,fn+=p[i].b) if(dp[j-p[i].c]!=-1) upd(dp[j],dp[j-p[i].c]+fn); } for(i=0;i<=t;i++) upd(ans,dp[i]); cout<<ans<<endl; } //debug(clock()-t1); return 0; } // davidlee1999WTK 2015/ // srO myk Orz //ios::sync_with_stdio(false); //#pragma comment(linker, "/STACK:102400000,102400000") //#define O2 __attribute__((optimize("-O2")))
以上是关于繁华模拟赛 最优得分的主要内容,如果未能解决你的问题,请参考以下文章