2021.08.12(背包模型+Codeforces Round #737 (Div. 2))

1.278. 数字组合 - AcWing题库

#include<iostream>
#include<algorithm>
#include <cmath>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
    int n,m;
    scanf("%d %d",&n,&m);
    int f[10010]={0};
    f[0]=1;//确保f[v]可达到并且是1
    for(int i=0;i<n;i++){
        int v;
        scanf("%d",&v);
        for(int j=m;j>=v;j--){
            f[j]+=f[j-v];
        }
    }
    printf("%d\n",f[m]);
}
View Code

注:背包模型总的来说就是物品、体积、决策,有时候到了体积的时候就没有这一步,到时候就直接是到这循环体积就可以了,确定好哪个是背包容量,哪个是物品体积即可

 

2.1023. 买书 - AcWing题库

#include<iostream>
#include<algorithm>
#include <cmath>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
    int n,m;
    scanf("%d",&n);
    int f[1500]={0};
    f[0]=1;//确保f[v]可达到并且是1
    int p[4]={10,20,50,100};
    for(int i=0;i<4;i++){//物品
        for(int j=p[i];j<=n;j++){
            f[j]+=f[j-p[i]];
        }
    }
    printf("%d\n",f[n]);
}
View Code

注:与上相同,就是体积循环的时候,这个是从小往大

 

3.1021. 货币系统 - AcWing题库

#include<iostream>
#include<algorithm>
#include <cmath>
#include<cstdio>
#include<cstring>
using namespace std;
#define int long long
signed main(){
    int n,m;
    scanf("%lld %lld",&n,&m);
    int f[3100]={0};
    f[0]=1;//确保f[v]可达到并且是1
    int p[4]={10,20,50,100};
    for(int i=0;i<n;i++){//物品
        int v;
        scanf("%lld",&v);
        for(int j=v;j<=m;j++){
            f[j]+=f[j-v];
        }
    }
    printf("%lld\n",f[m]);
}
View Code

注:遇事开long long总没错

 

4.532. 货币系统 - AcWing题库

#include<iostream>
#include<algorithm>
#include <cmath>
#include<cstdio>
#include<cstring>
using namespace std;
#define int long long
const int maxx=150;
int a[maxx]={0};
int f[25010]={0};
signed main(){
    int t;
    scanf("%lld",&t);
    while(t--){
        int n;
        memset(a,0,sizeof a);
        memset(f,0,sizeof f);
        scanf("%lld",&n);
        for(int i=0;i<n;i++){
            scanf("%lld",&a[i]);
        }

        int sum=n;
        sort(a,a+n);
        f[0]=1;
        int flag=0;
        for(int i=0;i<n;i++){
            if(f[a[i]]){
                flag++;
                continue;
            }
            for(int j=a[i];j<=a[n-1];j++){
                f[j]+=f[j-a[i]];
            }
        }
        printf("%lld\n",sum-flag);
    }
}
View Code

注:全局变量数组的初始化问题,还有出现Seg类似的错误,也是数组初始化的问题可能没有赋值为0,就直接++了

 

5.Problem - B - Codeforces

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxx=1e5+10;
pair<int,int> a[maxx];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
        int n,k;
        scanf("%d %d",&n,&k);
        for(int i=0;i<n;i++){
            scanf("%d",&a[i].first);
            a[i].second=i;
        }
        sort(a,a+n);
        int sum=1;
        for(int i=1;i<n;i++){
            if(a[i].second==a[i-1].second+1){
                continue;
            }else{
                sum++;
            }
        }
        if(sum>k){
            printf("no\n");
        }else{
            printf("Yes\n");
        }
    }
}
View Code

注:题目读错,只要是存入数组的时候,连下标也存上,然后看有多少个连续块

 

6.AcWing 1019. 庆功会 - AcWing

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define int long long
const int maxx=1e5+10;
int v[1000],w[1000],s[1000];
int f[6500]={0};
signed main(){
    int n,m;
    scanf("%lld %lld",&n,&m);
    for(int i=0;i<n;i++){
        scanf("%lld %lld %lld",&v[i],&w[i],&s[i]);
    }
    for(int i=0;i<n;i++){
        for(int j=m;j>=v[i];j--){
            for(int k=1;k<=s[i];k++){
               if(k*v[i]<=j){
                    f[j]=max(f[j],f[j-k*v[i]]+k*w[i]);
                }
            }
        }
    }
    printf("%lld\n",f[m]);


}
View Code

注:体积循环从大到小

 

7.3661. 重置数列 - AcWing题库

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define int long long
const int maxx=1e5+10;
int a[maxx];
signed main(){
    int t;
    scanf("%lld",&t);
    while(t--){
        int n,k;
        scanf("%lld %lld",&n,&k);

        for(int i=0;i<n;i++){
            scanf("%lld",&a[i]);

        }


        int s1=100001;
        for(int sum=1;sum<=100;sum++){
                int s=0;
        for(int i=0;i<n;i++){
            if(a[i]!=sum){
                i+=k-1;
                s++;
            }
        }
        s1=min(s1,s);
        }
        printf("%lld\n",s1);
    }


}
View Code

注:真枚举,让我想起来学习贪心时白书上的加油站那个题目,感觉有点类似

 

8.3799. 送糖果 - AcWing题库

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define int long long
const int maxx=1e5+10;
signed main(){
    int t;
    scanf("%lld",&t);
    while(t--){
        int a,b;
        scanf("%lld %lld",&a,&b);
        int j=1;
        int flag=0;
        while(1){
            if(j>a){
                printf("Vladik\n");//Vladik
                break;
            }
            a-=j;

            j++;
            if(j>b){
                printf("Valera\n");
                break;
            }
            b-=j;

            j++;
        }

    }

}
View Code

注:真模拟,题目已知条件别读错了(大水题)

 

9.3800. 奇数还是偶数 - AcWing题库

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
#define int long long
const int maxx=1e5+10;
int a[maxx];
signed main(){
    int t;
    scanf("%lld",&t);
    while(t--){
        int b,k;
        scanf("%lld %lld",&b,&k);
        for(int i=1;i<=k;i++){
            scanf("%lld",&a[i]);
        }
        int flag=0;
        if(b%2==1){
            int j=0,o=0;
            for(int i=1;i<=k;i++){
                if(a[i]%2==0){
                    o++;
                }else{
                    j++;
                }
            }
            if(j%2==0){
                flag=0;
            }else{
                flag=1;
            }
        }else{
            flag=0;
            if(a[k]%2==0){
                flag=0;
            }else{
                flag=1;
            }
        }
        if(flag==0){
            printf("even\n");
        }else{
            printf("odd\n");
        }

    }

}
View Code

注:真水题

 

10.3801. 最佳连续子数组 - AcWing题库

#include<iostream>
#include<algorithm>
#include <cmath>
#include<cstring>
#include<cstdio>
#define int long long
using namespace std;
const int maxx=1e5+10;
int a[maxx]={0};
signed main(){
    int t;
    scanf("%lld",&t);
    while(t--){
        int n;
        int ma=0;
        scanf("%lld",&n);
        for(int i=0;i<n;i++){
            scanf("%lld",&a[i]);
            ma=max(a[i],ma);
        }
       // printf("最大:%lld\n",ma);
        int sum=1,s=0;
        for(int i=0;i<n;i++){
            if(a[i]==ma&&a[i]==a[i-1]&&i-1>=0){
                sum++;
            }else{
                s=max(s,sum);
                sum=1;
            }
           // printf("%lld:%lld s:%lld\n",i,sum,s);

        }
        s=max(s,sum);
        printf("%lld\n",s);

    }

}
View Code

注:好多细节的地方敲打代码的时候一定注意,有点细节

 

posted @ 2021-08-12 17:29  bonel  阅读(31)  评论(0编辑  收藏  举报