第五周训练

P1048 [NOIP2005 普及组] 采药

#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    int t,m;
    cin>>t>>m;
    std::vector<int>bei(t+1,0);
    for(int i=0;i<m;i++){
        int a,b;
        cin>>a>>b;
        for(int i1=bei.size()-1;i1-a>=0;i1--){
            bei[i1]=bei[i1]>bei[i1-a]+b?bei[i1]:bei[i1-a]+b;
        }
    }
    cout<<bei[t]<<endl;
    return 0;
}

简单背包

P1616 疯狂的采药

#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    long long t,m;
    cin>>t>>m;
    std::vector<long long>bei(t+1,0);
    for(int i=0;i<m;i++){
        int a,b;
        cin>>a>>b;
        for(int i1=0;i1+a<bei.size();i1++){
            bei[i1+a]=bei[i1+a]>bei[i1]+b?bei[i1+a]:bei[i1]+b;
        }
    }
    cout<<bei[t]<<endl;
    return 0;
}

改变遍历方式即可;

考虑数据大小改用int应该就会溢出;

P1049 [NOIP2001 普及组] 装箱问题

#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    int t,m;
    cin>>t>>m;
    std::vector<int>bei(t+1,0);
    for(int i=0;i<m;i++){
        int a,b;
        cin>>a;
        
        for(int i1=bei.size()-1;i1-a>=0;i1--){
            bei[i1]=bei[i1]>bei[i1-a]+a?bei[i1]:bei[i1-a]+a;
        }
    }
    cout<<t-bei[t]<<endl;
    return 0;
}

看做价格等于背包容量

P1833 樱花

#include <bits/stdc++.h>
using namespace std;
 int toint(string s1){
     int ans=0;
     for(int i=0;i<s1.size();i++){
         ans*=10;
         ans+=s1[i]-'0';
     }
     return ans;
 }
 int thetime(string s1){
     int pos=s1.find(':');
     int t=toint(s1.substr(0,pos))*60+toint(s1.substr(pos+1,10));
     return t;
     
 }
int main()
{
    string s1,s2;
    cin>>s1;
    cin>>s2;
    int t,m;
    t=thetime(s2)-thetime(s1);
    //cout<<t;
    cin>>m;
    std::vector<int>bei(t+1,0);
    for(int i=0;i<m;i++){
        int a,b,c;
        cin>>a>>b>>c;
        if(c==0){
            for(int i1=0;i1+a<bei.size();i1++){
            bei[i1+a]=bei[i1+a]>bei[i1]+b?bei[i1+a]:bei[i1]+b;
            }
        }else  {
            for(int i2=0;i2<c;i2++){
                for(int i1=bei.size()-1;i1-a>=0;i1--){
                    bei[i1]=bei[i1]>bei[i1-a]+b?bei[i1]:bei[i1-a]+b;
                }
            }
        }
    }
    cout<<bei[t]<<endl;/**/
    return 0;
}

没开优化超时;

#include <bits/stdc++.h>
using namespace std;
 int toint(string s1){
     int ans=0;
     for(int i=0;i<s1.size();i++){
         ans*=10;
         ans+=s1[i]-'0';
     }
     return ans;
 }
 int thetime(string s1){
     int pos=s1.find(':');
     int t=toint(s1.substr(0,pos))*60+toint(s1.substr(pos+1,10));
     return t;
     
 }
 void gouzao(vector<int>&zhi,int c){
     zhi.clear();
     
     //cout<<"??"<<c<<"  "<<":";
     int temp=1;
     for(;temp<=c;temp*=2){
         zhi.push_back(temp);
         c-=temp;
     }
     if(c){
        zhi.push_back(c);
     }/*
     for(int num:zhi){
         cout<<num<<"  ";
     }cout<<endl;
*/ }
int main()
{
    string s1,s2;
    cin>>s1;
    cin>>s2;
    int t,m;
    t=thetime(s2)-thetime(s1);
    vector<int>zhi;
    //cout<<t;
    cin>>m;
    std::vector<int>bei(t+1,0);
    for(int i=0;i<m;i++){
        int a,b,c;
        cin>>a>>b>>c;
        if(c==0){
            for(int i1=0;i1+a<bei.size();i1++){
            bei[i1+a]=bei[i1+a]>bei[i1]+b?bei[i1+a]:bei[i1]+b;
            }
        }else  {
            gouzao(zhi,c);
            for(int i2=0;i2<zhi.size();i2++){
                for(int i1=bei.size()-1;i1-a*zhi[i2]>=0;i1--){
                    int last=bei[i1];
                    bei[i1]=bei[i1]>bei[i1-a*zhi[i2]]+b*zhi[i2]?bei[i1]:bei[i1-a*zhi[i2]]+b*zhi[i2];
                    
                }
            }
            
        }
    }
    cout<<bei[t]<<endl;/**/
    return 0;
}

使用二进制优化 拆分为1 2 ....c-2的i+1次方+1;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值