2021.08.12(背包模型+Codeforces Round #737 (Div. 2))
#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]); }
注:背包模型总的来说就是物品、体积、决策,有时候到了体积的时候就没有这一步,到时候就直接是到这循环体积就可以了,确定好哪个是背包容量,哪个是物品体积即可
#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]); }
注:与上相同,就是体积循环的时候,这个是从小往大
#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]); }
注:遇事开long long总没错
#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); } }
注:全局变量数组的初始化问题,还有出现Seg类似的错误,也是数组初始化的问题可能没有赋值为0,就直接++了
#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"); } } }
注:题目读错,只要是存入数组的时候,连下标也存上,然后看有多少个连续块
#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]); }
注:体积循环从大到小
#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); } }
注:真枚举,让我想起来学习贪心时白书上的加油站那个题目,感觉有点类似
#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++; } } }
注:真模拟,题目已知条件别读错了(大水题)
#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"); } } }
注:真水题
#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); } }
注:好多细节的地方敲打代码的时候一定注意,有点细节