1001:排序完按照题意做即可。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cmath>
  4. #include<algorithm>
  5. using namespace std;
  6. int a[],k,n;
  7. int main(){
  8. scanf("%d%d",&n,&k);
  9. for (int i=; i<=n; i++) scanf("%d",&a[i]);
  10. sort(a+,a+n+);
  11. int m=a[n-k+]-a[k];
  12. if (m<&&m>=) printf("NO");
  13. else if (m>){
  14. if (m==) printf("YES\n");
  15. else{
  16. for (int i=; i<=floor(sqrt(m)); i++)
  17. if (m%i==){
  18. printf("NO\n");
  19. printf("%d",m);
  20. return ;
  21. }
  22. printf("YES\n");
  23. }
  24. printf("%d",m);
  25. return ;
  26. }else printf("NO\n%d",m);
  27. return ;
  28. }

1001

1002:模拟,按题意完成即可。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<string>
  4. using namespace std;
  5. int qm,bj,lw,hv,ma,n,sum;
  6. bool gb,wt;
  7. string bb,cc;
  8. int main(){
  9. cin>>n;
  10. for (int i=; i<=n; i++){
  11. hv=;
  12. //cout<<i<<":";
  13. cin>>bb;
  14. scanf("%d%d",&qm,&bj);
  15. getchar();
  16. gb=getchar()=='Y'?:;
  17. getchar();
  18. wt=getchar()=='Y'?:;
  19. scanf("%d",&lw);
  20. if (qm>&&lw) hv+=;
  21. if (qm>&&bj>) hv+=;
  22. if (qm>) hv+=;
  23. if (qm>&&wt) hv+=;
  24. if (bj>&&gb) hv+=;
  25. if (hv>ma) {
  26. ma=hv;
  27. cc=bb;
  28. }
  29. sum+=hv;
  30. //cout<<hv<<":"<<i;
  31. }
  32. cout<<cc<<endl<<ma<<endl<<sum;
  33. }

1002

1003:模拟即可。

  1. #include<stdio.h>
  2. #include<iostream>
  3. #include<string.h>
  4. #include<math.h>
  5. using namespace std;
  6. int main(){
  7. int m,t,u,f,d,s=,t1=;
  8. char a[];
  9. scanf("%d %d %d %d %d",&m,&t,&u,&f,&d);
  10. for(int i=;i<t;i++)
  11. scanf("%s",&a[i]);
  12. for(int i=;i<t;i++){
  13. if(a[i]=='u'||a[i]=='d') s=s+u+d;
  14. else s=s+f*;
  15. if(s>m) break;
  16. t1++;
  17. }
  18. cout<<t1<<endl;
  19. return ;
  20. }

1003

1004:用了奇技淫巧。。。正解应该是记忆化搜索,我的做法是排序后贪心一波。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. using namespace std;
  5. struct fff{
  6. int x,y,n;
  7. }a[];
  8. int f[][],b[][],n,m,ans;
  9. int pd(const fff &a,const fff &b){
  10. return a.n<b.n;
  11. }
  12. int main(){
  13. cin>>n>>m;
  14. for (int i=; i<=n; i++)
  15. for (int j=; j<=m; j++){
  16. scanf("%d",&b[i][j]);
  17. a[i*m-m+j].x=i;a[i*m-m+j].y=j;a[i*m-m+j].n=b[i][j];
  18. f[i][j]=;
  19. }
  20. sort(a+,a+n*m+,pd);
  21. for (int i=; i<=n*m; i++){
  22. int x=a[i].x,y=a[i].y;
  23. f[x+][y]=((b[x+][y]>a[i].n)&&(f[x+][y]<f[x][y]+))?f[x][y]+:f[x+][y];
  24. f[x-][y]=((b[x-][y]>a[i].n)&&(f[x-][y]<f[x][y]+))?f[x][y]+:f[x-][y];
  25. f[x][y+]=((b[x][y+]>a[i].n)&&(f[x][y+]<f[x][y]+))?f[x][y]+:f[x][y+];
  26. f[x][y-]=((b[x][y-]>a[i].n)&&(f[x][y-]<f[x][y]+))?f[x][y]+:f[x][y-];
  27. }
  28. for (int i=; i<=n; i++)
  29. for (int j=; j<=m; j++)
  30. ans=max(ans,f[i][j]);
  31. cout<<ans;
  32. }

1004

1005:裸01背包。。。。

  1. #include<cstdio>
  2. #include<iostream>
  3. using namespace std;
  4. int f[],p[],a[],n,v;
  5. int main(){
  6. cin>>v>>n;
  7. for (int i=; i<=n; i++) scanf("%d%d",&a[i],&p[i]);
  8. for (int i=; i<=n; i++)
  9. for (int j=v; j>=a[i]; j--)
  10. f[j]=max(f[j],p[i]+f[j-a[i]]);
  11. cout<<f[v];
  12. }

1005

1006:模拟。

  1. #include<cstdio>
  2. #include<iostream>
  3. #define k(x,y) y*(a[x]-48)
  4. using namespace std;
  5. int main(){
  6. char a[];
  7. gets(a);
  8. if ((k(,)+k(,)+k(,)+k(,)+k(,)+k(,)+k(,)+k(,)+k(,))%==(a[]=='X'?:a[]-)) cout<<"Right";
  9. else{
  10. cout<<a[]<<a[]<<a[]<<a[]<<a[]<<a[]<<a[]<<a[]<<a[]<<a[]<<a[]<<a[];
  11. if ((k(,)+k(,)+k(,)+k(,)+k(,)+k(,)+k(,)+k(,)+k(,))%==) cout<<"X";
  12. else cout<<(k(,)+k(,)+k(,)+k(,)+k(,)+k(,)+k(,)+k(,)+k(,))%;
  13. }
  14. }

1006

1007:各种排序。。。然后就行了

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<algorithm>
  4. using namespace std;
  5. int m,n,k,l,d,x,xx,yy,y;
  6. struct fff{
  7. int k,no;
  8. }anh[],anl[];
  9. int fuck(const fff &a,const fff &b){
  10. return a.k>b.k;
  11. }
  12. int fuck233(const fff &a,const fff &b){
  13. return a.no<b.no;
  14. }
  15. int main(){
  16. cin>>m>>n>>k>>l>>d;
  17. for (int i=; i<n; i++) anl[i].no=i;
  18. for (int i=; i<m; i++) anh[i].no=i;
  19. for (int i=; i<=d; i++){
  20. scanf("%d%d%d%d",&x,&y,&xx,&yy);
  21. if (x==xx) anl[min(y,yy)].k++;
  22. else if (y==yy) anh[min(x,xx)].k++;
  23. }
  24. sort(anl+,anl+n+,fuck);
  25. sort(anh+,anh++m,fuck);
  26. sort(anl+,anl+l+,fuck233);
  27. sort(anh+,anh+k+,fuck233);
  28. for (int i=; i<k; i++) printf ("%d ",anh[i].no);
  29. cout<<anh[k].no<<endl;
  30. for (int i=; i<l; i++) printf ("%d ",anl[i].no);
  31. cout<<anl[l].no;
  32. }

1007

1008:又是模拟。。。

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int f[][],m,n;
  5. int main(){
  6. scanf("%d%d",&n,&m);
  7. f[][]=;
  8. for (int i=; i<=m; i++)
  9. for (int j=; j<=n; j++){
  10. f[i][j]=f[i-][j==?n:j-]+f[i-][j==n?:j+];
  11. }
  12. cout<<f[m][];
  13. }

1008

1009:略过略过~

1010:模拟即可。。。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cmath>
  5. using namespace std;
  6. char a[];
  7. int f[],ma,mi=0x7f;
  8. int main(){
  9. gets(a);
  10. for (int i=; i<strlen(a); i++)
  11. f[a[i]-]++;
  12. for (int i=; i<=; i++){
  13. ma=max(ma,f[i]);
  14. mi=min(mi,f[i]==?0x7f:f[i]);
  15. }
  16. ma-=mi;
  17. if (ma<){
  18. cout<<"No Answer\n0";
  19. return ;
  20. }
  21. else{
  22. if (ma!=) for (int i=; i<=floor(sqrt(ma)); i++) if (ma%i==){
  23. cout<<"No Answer\n0";
  24. return ;
  25. }
  26. cout<<"Lucky Word\n"<<ma;
  27. }
  28. }

1010

1011:题意就是从(1,1)->(m,n)找两条最大权值不相交路线。f[i,j]就是找到了第i个人,第一条路线在第j行,第二条路线在第k行的最优值。DP一下就行了。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. using namespace std;
  17. int f[][][],a[][],n,m;
  18. inline int in(){
  19. int x=,f=;
  20. char ch=getchar();
  21. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  22. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  23. return x*f;
  24. }
  25. int main(){
  26. n=in(),m=in();
  27. For(i,,n)
  28. For(j,,m)
  29. a[i][j]=in();
  30. For(i,,n+m)
  31. For(j,,min(n,i))
  32. For(k,,min(n,i))
  33. if (j!=k||i==n+m)
  34. f[i][j][k]=max(f[i-][j-][k-],max(max(f[i-][j][k],f[i][j][k]),max(f[i-][j-][k],f[i-][j][k-])))+a[j][i-j+]+a[k][i-k+];
  35. printf("%d\n",f[n+m][n][n]);
  36. }

1011

1012:按题意枚举之后判断就行了。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define max(a,b) (a<b?b:a)
  15. #define min(a,b) (a<b?a:b)
  16. #define ll long long
  17. #define mod 1000000007
  18. using namespace std;
  19. int n,a[]={,,,,,,,,,};
  20. inline int in(){
  21. int x=,f=;
  22. char ch=getchar();
  23. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  24. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  25. return x*f;
  26. }
  27. inline int get(int x){
  28. if (!x) return ;
  29. int cnt=;
  30. while(x){
  31. cnt+=a[x%];
  32. x/=;
  33. }
  34. return cnt;
  35. }
  36. int main(){
  37. n=in();
  38. n-=;
  39. int ans=;
  40. For(i,,)
  41. For(j,i,)
  42. if (get(i)+get(j)+get(i+j)==n)
  43. if (i!=j) ans+=;
  44. else ans++;
  45. printf("%d",ans);
  46. }

1012

1013:二维费用的01背包。我们用f[i][j]表示剩余i金j金币时能跑到zxy妹子的最多个数,记录此时的最小时间消耗为g[i][j](你泡妹子还那么急真是不懂得享受┑( ̄Д  ̄)┍)状态转移方程略。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define max(a,b) (a<b?b:a)
  15. #define min(a,b) (a<b?a:b)
  16. #define ll long long
  17. #define mod 1000000007
  18. using namespace std;
  19. struct zxy{
  20. int rp,c,t;
  21. }a[];
  22. int f[][],g[][],n,rp,m,ans,mi;
  23. inline int in(){
  24. int x=,f=;
  25. char ch=getchar();
  26. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  27. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  28. return x*f;
  29. }
  30. int main(){
  31. n=in();
  32. For(i,,n)
  33. a[i].c=in(),a[i].rp=in(),a[i].t=in();
  34. m=in(),rp=in();
  35. mem(g,/); g[][]=;
  36. For(i,,n)
  37. Ford(j,m,a[i].c)
  38. Ford(k,rp,a[i].rp)
  39. if (f[j-a[i].c][k-a[i].rp]+>f[j][k]||(f[j-a[i].c][k-a[i].rp]+==f[j][k]&&g[j][k]>g[j-a[i].c][k-a[i].rp]+a[i].t)){
  40. f[j][k]=f[j-a[i].c][k-a[i].rp]+;
  41. g[j][k]=g[j-a[i].c][k-a[i].rp]+a[i].t;
  42. if (f[j][k]>ans||(f[j][k]==ans&&g[j][k]<mi)){
  43. ans=f[j][k];
  44. mi=g[j][k];
  45. }
  46. }
  47. printf("%d",mi);
  48. }

1013

1014:区间DP,枚举区间内要拿走的牌按题意完成即可。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define max(a,b) (a<b?b:a)
  15. #define min(a,b) (a<b?a:b)
  16. #define ll long long
  17. #define mod 1000000007
  18. using namespace std;
  19. int n,a[],f[][];
  20. inline int in(){
  21. int x=,f=;
  22. char ch=getchar();
  23. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  24. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  25. return x*f;
  26. }
  27. inline int dp(int l,int r){
  28. if (f[l][r]!=f[][]) return f[l][r];
  29. if (l+==r) return ;
  30. For(i,l+,r-)
  31. f[l][r]=min(f[l][r],dp(l,i)+dp(i,r)+a[l]*a[i]*a[r]);
  32. return f[l][r];
  33. }
  34. int main(){
  35. n=in();
  36. For(i,,n) a[i]=in();
  37. mem(f,/);
  38. dp(,n);
  39. printf("%d",f[][n]);
  40. }

1014

1015:非常水的DP。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. using namespace std;
  5. int a[],n,f[];
  6. int main(){
  7. memset(a,/,sizeof(a));
  8. for (int i=; i<=; i++)
  9. scanf("%d",&f[i]);
  10. cin>>n;
  11. a[]=;
  12. for (int i=; i<=n+; i++)
  13. for (int j=; j<=; j++)
  14. a[i]=min(a[i],a[i-j]+f[j]);
  15. cout<<a[n+];
  16. }

1015

1016:裸01背包+1

  1. #include<cstdio>
  2. #include<iostream>
  3. using namespace std;
  4. int f[],a[],n,v;
  5. int main(){
  6. cin>>v>>n;
  7. for (int i=; i<=n; i++) scanf("%d",&a[i]);
  8. for (int i=; i<=n; i++)
  9. for (int j=v; j>=a[i]; j--)
  10. f[j]=max(f[j],a[i]+f[j-a[i]]);
  11. cout<<v-f[v];
  12. }

1016

1017:并查集之后统计没有用的合并次数即可。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define max(a,b) (a<b?b:a)
  15. #define min(a,b) (a<b?a:b)
  16. #define ll long long
  17. #define mod 1000000007
  18. using namespace std;
  19. int fa[],n,m,ans;
  20. inline int in(){
  21. int x=,f=;
  22. char ch=getchar();
  23. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  24. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  25. return x*f;
  26. }
  27. inline int find(int x){
  28. fa[x]=fa[x]==x?x:find(fa[x]);
  29. return fa[x];
  30. }
  31. int main(){
  32. n=in(); m=in();
  33. For(i,,m) fa[i]=i;
  34. For(i,,n){
  35. int x=in(),y=in();
  36. if (find(x)==find(y)) ans++;
  37. else fa[find(x)]=find(y);
  38. }
  39. printf("%d",ans);
  40. }

1017

1018:20!用LL就可以存了。。。。然后按题意模拟一下即可。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define max(a,b) (a<b?b:a)
  15. #define min(a,b) (a<b?a:b)
  16. #define ll long long
  17. #define mod 1000000007
  18. using namespace std;
  19. int n,k,mo=,a[];
  20. ll ans=;
  21. inline int in(){
  22. int x=,f=;
  23. char ch=getchar();
  24. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  25. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  26. return x*f;
  27. }
  28. int main(){
  29. n=in();k=in();
  30. bool p=;
  31. For(i,,k) mo*=;
  32. For(i,,n)
  33. ans*=i;
  34. while(ans%==) ans/=;
  35. int cnt=;
  36. while(ans){
  37. a[++cnt]=ans%;
  38. ans/=;
  39. }
  40. Ford(i,min(cnt,k),) printf("%d",a[i]);
  41. }

1018

1019:通过进行数学推导,我们容易发现,对于b[i] 中大于a[i]的数,用它们任意进行相减的和是一定的,反之亦然,于是我们只需要将b数组与a数组按大小一一匹配即可。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define max(a,b) (a<b?b:a)
  15. #define min(a,b) (a<b?a:b)
  16. #define ll long long
  17. #define mod 1000000007
  18. using namespace std;
  19. int a[],b[],n,ans;
  20. inline int in(){
  21. int x=,f=;
  22. char ch=getchar();
  23. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  24. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  25. return x*f;
  26. }
  27. int main(){
  28. n=in();
  29. For(i,,n) a[i]=in();
  30. For(i,,n) b[i]=in();
  31. sort(a+,a+n+);
  32. sort(b+,b+n+,greater<int>());
  33. For(i,,n)
  34. ans+=abs(b[i]-a[i]);
  35. printf("%d",ans);
  36. }

1019

1020:筛法筛质数,然后对于每个a[i]暴力枚举注意及时剪枝就行了。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define max(a,b) (a<b?b:a)
  15. #define min(a,b) (a<b?a:b)
  16. #define ll long long
  17. #define mod 1000000007
  18. using namespace std;
  19. bool f[];
  20. int pr[],ma,maxx,n,x,cnt;
  21. inline int in(){
  22. int x=,f=;
  23. char ch=getchar();
  24. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  25. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  26. return x*f;
  27. }
  28. void init(){
  29. f[]=;
  30. For(i,,)
  31. if (!f[i])
  32. For(j,,/i)
  33. f[i*j]=;
  34. For(i,,)
  35. if (!f[i])
  36. pr[++cnt]=i;
  37. return;
  38. }
  39. int main(){
  40. init();
  41. n=in();
  42. For(i,,n){
  43. x=in();
  44. Ford(i,cnt,)
  45. if (pr[i]<maxx) break;
  46. else if (x%pr[i]==){
  47. ma=x;
  48. maxx=pr[i];
  49. }
  50. }
  51. printf("%d",ma);
  52. }

1020

1021:模拟即可。。。。

  1. 1021

1022:进制转换你不会吗?(从低位向上除,判断是否是奇数即可)

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define max(a,b) (a<b?b:a)
  15. #define min(a,b) (a<b?a:b)
  16. #define ll long long
  17. #define mod 1000000007
  18. using namespace std;
  19. ll x;
  20. bool ans[];
  21. inline ll in(){
  22. ll x=,f=;
  23. char ch=getchar();
  24. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  25. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  26. return x*f;
  27. }
  28. int main(){
  29. x=in();
  30. ll p=;
  31. int i=;
  32. for(p=; i<=; p*=(-),i++)
  33. if ((x/p)&){
  34. ans[i]=;
  35. x-=p;
  36. }
  37. while(!ans[i]&&i) i--;
  38. Ford(j,i,)
  39. printf("%d",(ans[j]?:));
  40. }

1022

1023:简单DP,用f[i][j]表示第i分钟时疲倦值为j的最大距离,则f[i][j]=f[i-1][j-1]+d[i](1<=j<=m),f[i][0]=max(f[i-1][0],f[i-j][j])(1<=j<=i&&j<=m)

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define max(a,b) (a<b?b:a)
  15. #define min(a,b) (a<b?a:b)
  16. #define ll long long
  17. #define mod 1000000007
  18. using namespace std;
  19. int d[],n,m,f[][];
  20. inline int in(){
  21. int x=,f=;
  22. char ch=getchar();
  23. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  24. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  25. return x*f;
  26. }
  27. int main(){
  28. n=in(),m=in();
  29. For(i,,n) d[i]=in();
  30. For(i,,n){
  31. f[i][]=f[i-][];
  32. For(j,,min(i,m)) f[i][]=max(f[i][],f[i-j][j]);
  33. For(j,,m) f[i][j]=f[i-][j-]+d[i];
  34. }
  35. printf("%d",f[n][]);
  36. }

1023

1024:最长不下降子序列还是很简单的吧。。。注意一下输入的处理就行了。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define max(a,b) (a<b?b:a)
  15. #define min(a,b) (a<b?a:b)
  16. #define ll long long
  17. #define mod 1000000007
  18. using namespace std;
  19. int dy[],a[],f[],cnt,ans[];
  20. char zxy[];
  21. inline int in(){
  22. int x=,f=;
  23. char ch=getchar();
  24. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  25. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  26. return x*f;
  27. }
  28. int doit(int n){
  29. mem(f,);
  30. f[]=;
  31. int ans=;
  32. For(i,,n)
  33. For(j,,i-)
  34. if (a[i]>=a[j]){
  35. f[i]=max(f[i],f[j]+);
  36. ans=max(f[i],ans);
  37. }
  38. return ans;
  39. }
  40. int main(){
  41. scanf("%s",zxy);
  42. For(i,,strlen(zxy)-)
  43. dy[zxy[i]-'a']=i;
  44. while(scanf("%s",zxy+)!=EOF){
  45. cnt=;
  46. For(i,,strlen(zxy)-)
  47. a[++cnt]=dy[zxy[i]-'a'];
  48. printf("%d",doit(cnt));
  49. }
  50. }

1024

1025:判断奇偶性你不会吗?

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. using namespace std;
  5. char a[],b;
  6. int n;
  7. int main(){
  8. cin>>n;
  9. getchar();
  10. for (int i=; i<=n; i++){
  11. gets(a);
  12. b=a[strlen(a)-];
  13. if (b%==) cout<<"even\n";
  14. else cout<<"odd\n";
  15. }
  16. }

1025

1026:数据范围这么小,打暴力不就好了。。。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define max(a,b) (a<b?b:a)
  15. #define min(a,b) (a<b?a:b)
  16. #define ll long long
  17. #define mod 1000000007
  18. using namespace std;
  19. bool f[][];
  20. int n,m,I,ans;
  21. inline int in(){
  22. int x=,f=;
  23. char ch=getchar();
  24. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  25. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  26. return x*f;
  27. }
  28. int main(){
  29. n=in(),m=in(),I=in();
  30. int x,xx,y,yy;
  31. For(i,,I){
  32. x=in(),y=in(),xx=in(),yy=in();
  33. For(i,x,xx)
  34. For(j,y,yy)
  35. f[i][j]=;
  36. }
  37. For(i,,n)
  38. For(j,,m)
  39. if (f[i][j]) ans++;
  40. printf("%d",ans);
  41. }

1026

1027:按照题意搜索即可。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define max(a,b) (a<b?b:a)
  15. #define min(a,b) (a<b?a:b)
  16. #define ll long long
  17. #define mod 1000000007
  18. using namespace std;
  19. int a[][],dx[]={,,-,},dy[]={,,,-},n,m;
  20. inline int in(){
  21. int x=,f=;
  22. char ch=getchar();
  23. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  24. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  25. return x*f;
  26. }
  27. int bfs(){
  28. int x=,y=;
  29. int ans=a[][];
  30. a[][]=;
  31. while(x!=n||y!=m){
  32. int ma=,nx,ny;
  33. For(i,,)
  34. if (a[x+dx[i]][y+dy[i]]>ma){
  35. ma=a[x+dx[i]][y+dy[i]];
  36. nx=x+dx[i],ny=y+dy[i];
  37. }
  38. ans+=ma;
  39. x=nx,y=ny;
  40. a[x][y]=;
  41. }
  42. return ans;
  43. }
  44. int main(){
  45. n=in(),m=in();
  46. For(i,,n)
  47. For(j,,m)
  48. a[i][j]=in();
  49. printf("%d",bfs());
  50. }

1027

1028:又一次的01背包。。

  1. #include<cstdio>
  2. #include<iostream>
  3. using namespace std;
  4. int f[],a[],n,v;
  5. inline int in(){
  6. int x=,f=;
  7. char ch=getchar();
  8. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  9. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  10. return x*f;
  11. }
  12. int main(){
  13. v=in(),n=in();
  14. for (int i=; i<=n; i++) a[i]=in();
  15. for (int i=; i<=n; i++)
  16. for (int j=v; j>=a[i]; j--)
  17. f[j]=max(f[j],a[i]+f[j-a[i]]);
  18. printf("%d",f[v]);
  19. }

1028

1029:暴力枚举答案检查就行了吧(你要无聊加个二分也行= =)

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define max(a,b) (a<b?b:a)
  15. #define min(a,b) (a<b?a:b)
  16. #define ll long long
  17. #define mod 1000000007
  18. using namespace std;
  19. string a,b;
  20. inline int in(){
  21. int x=,f=;
  22. char ch=getchar();
  23. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  24. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  25. return x*f;
  26. }
  27. bool check(string a,string b,int l){
  28. For(i,,l-)
  29. if (a[i]!=b[b.size()-l+i]) return ;
  30. return ;
  31. }
  32. int main(){
  33. cin>>a;cin>>b;
  34. Ford(i,min(a.size(),b.size()),)
  35. if (check(a,b,i)||check(b,a,i)){
  36. printf("%d",i);
  37. break;
  38. }
  39. }

1029

1030:BFS经典题

  1. #include<cstdio>
  2. #include<iostream>
  3. using namespace std;
  4. struct fff{
  5. int nn,x,y;
  6. }a[];
  7. int dx[]={,,-,,-,,-,,},dy[]={,,,,,-,-,,-},h,t,n,m,x,y;
  8. char aa[];
  9. bool b[][];
  10. int main(){
  11. cin>>n>>m>>y>>x;
  12. for (int i=m; i>=; i--){
  13. cin>>aa;
  14. for (int j=; j<n; j++)
  15. b[i][j+]=aa[j]=='.'?:;
  16. }
  17. h=,t=;
  18. a[].x=x;
  19. a[].y=y;
  20. a[].nn=;
  21. b[x][y]=;
  22. do{
  23. h++;
  24. for (int i=; i<=; i++){
  25. x=a[h].x+dx[i];
  26. y=a[h].y+dy[i];
  27. if (x>&&x<=m&&y>&&y<=n&&!b[x][y]){
  28. t++;
  29. a[t].nn=a[h].nn+;
  30. a[t].x=x;
  31. a[t].y=y;
  32. b[x][y]=;
  33. }
  34. }
  35. }while(h<t);
  36. cout<<a[t].nn;
  37. }

1030

1031:典型最短路,我用的是SPFA:)

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. using namespace std;
  5. int dis[],n,m,s,e,x,y,z,a[][][],pp[],h,t;
  6. bool b[];
  7. int main(){
  8. cin>>n>>m>>s>>e;
  9. for (int i=; i<=m; i++){
  10. scanf("%d%d%d",&x,&y,&z);
  11. a[x][++a[x][][]][]=z;
  12. a[x][a[x][][]][]=y;
  13. a[y][++a[y][][]][]=z;
  14. a[y][a[y][][]][]=x;
  15. }
  16. h=,t=;
  17. pp[]=s;
  18. b[s]=;
  19.  
  20. memset(dis,/,sizeof(dis));
  21. dis[s]=;
  22. do{
  23. h++;
  24. for (int i=; i<=a[pp[h]][][]; i++)
  25. if (dis[a[pp[h]][i][]]>dis[pp[h]]+a[pp[h]][i][]){
  26. dis[a[pp[h]][i][]]=dis[pp[h]]+a[pp[h]][i][];
  27. if (!b[a[pp[h]][i][]]){
  28. t++;
  29. pp[t]=a[pp[h]][i][];
  30. b[a[pp[h]][i][]]=;
  31. }
  32. }
  33. b[pp[h]]=;
  34. }while(h<t);
  35. cout<<dis[e];
  36. }

1031

1032:由于大面额的钱币是小面额的倍数,我们容易想到一个贪心思路:先拿大面额凑,再拿小面额凑,最后注意一下钱不够和最大面额大于所需支付工资的情况即可。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define max(a,b) (a<b?b:a)
  15. #define min(a,b) (a<b?a:b)
  16. #define ll long long
  17. #define mod 1000000007
  18. using namespace std;
  19. struct zxy{
  20. int n,v;
  21. }a[];
  22. int n,v,ans;
  23. inline int in(){
  24. int x=,f=;
  25. char ch=getchar();
  26. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  27. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  28. return x*f;
  29. }
  30. bool cmp(zxy a,zxy b){
  31. return a.v<b.v;
  32. }
  33. int main(){
  34. n=in(),v=in();
  35. For(i,,n)
  36. a[i].v=in(),a[i].n=in();
  37. sort(a+,a+n+,cmp);
  38. Ford(i,n,)
  39. if(a[i].v>v){
  40. n--;
  41. ans+=a[i].n;
  42. }
  43. while(){
  44. int nt=;
  45. Ford(i,n,)
  46. while(a[i].v+nt<v&&a[i].n)
  47. nt+=a[i].v,a[i].n--;
  48. For(i,,n)
  49. if(a[i].n){
  50. nt+=a[i].v;
  51. a[i].n--;
  52. break;
  53. }
  54. if (nt<v) break;
  55. ans++;
  56. }
  57. printf("%d",ans);
  58. }

1032

1033:题意就是叫你求一颗二叉树的深度,DP或者dfs一下就行了,时间效率O(n)。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define max(a,b) (a<b?b:a)
  15. #define min(a,b) (a<b?a:b)
  16. #define ll long long
  17. #define mod 1000000007
  18. using namespace std;
  19. struct zxy{
  20. int lc,rc,deep;
  21. }a[];
  22. int n;
  23. int dfs(int k){
  24. a[a[k].lc].deep=a[a[k].rc].deep=a[k].deep+;
  25. if (!a[k].lc&&!a[k].rc) return a[k].deep;
  26. if (!a[k].rc) return dfs(a[k].lc);
  27. if (!a[k].lc) return dfs(a[k].rc);
  28. return max(dfs(a[k].lc),dfs(a[k].rc));
  29. }
  30. inline int in(){
  31. int x=,f=;
  32. char ch=getchar();
  33. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  34. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  35. return x*f;
  36. }
  37. int main(){
  38. n=in();
  39. int x,y,z;
  40. For(i,,n-){
  41. x=in(),y=in(),z=in();
  42. a[x].lc=y,a[x].rc=z;
  43. }
  44. a[].deep=;
  45. printf("%d",dfs());
  46. }

1033

1034:按题意DP或者打个最短路就行了(最短路待更新),DP按题意做就好

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define max(a,b) (a<b?b:a)
  15. #define min(a,b) (a<b?a:b)
  16. #define ll long long
  17. #define mod 1000000007
  18. #define INF 2000000000
  19. using namespace std;
  20. int f[],c[],s[],n,k;
  21. inline int in(){
  22. int x=,f=;
  23. char ch=getchar();
  24. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  25. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  26. return x*f;
  27. }
  28. int main(){
  29. n=in(),k=in();
  30. For(i,,k) s[i]=in(),c[i]=in();
  31. For(i,,n) f[i]=-INF;
  32. For(i,,n){
  33. bool b=;
  34. For(j,,k)
  35. if (s[j]==i){
  36. f[i+c[j]]=max(f[i+c[j]],f[i]);
  37. b=;
  38. }
  39. if (!b) f[i+]=max(f[i+],f[i]+);
  40. }
  41. printf("%d",f[n+]);
  42. }

1034DP

1035:原谅本人过蒻并不会二分图匹配。。。(容我以后填坑)

1036:排序以后处理一下即可。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 2000000000
  17. using namespace std;
  18. int n,a[],b[];
  19. inline int in(){
  20. int x=,f=;
  21. char ch=getchar();
  22. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  23. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  24. return x*f;
  25. }
  26. int main(){
  27. n=in();
  28. For(i,,n) a[i]=in();
  29. sort(a+,a+n+);
  30. int cnt=;
  31. For(i,,n)
  32. if (a[i]!=a[i-]){
  33. printf("%d %d\n",a[i-],cnt);
  34. cnt=;
  35. }
  36. else ++cnt;
  37. printf("%d %d",a[n],cnt);
  38. }

1036

1037:高精乘法维护抹零后的后20位即可,其余同1018

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 2000000000
  17. using namespace std;
  18. struct zxy{
  19. int begin,l,v[];
  20. zxy(){
  21. begin=,l=;
  22. v[]=;
  23. }
  24. void friend operator *(zxy &a,int b){
  25. For(i,a.begin,min(a.begin+,a.l))
  26. a.v[i]*=b;
  27. For(i,a.begin,min(a.begin+,a.l)){
  28. a.v[i+]+=a.v[i]/;
  29. a.v[i]%=;
  30. if(a.v[a.l+])a.l++;
  31. while(!a.v[a.begin])a.begin++;
  32. }
  33. }
  34. }ans;
  35. int n,k;
  36. inline int in(){
  37. int x=,f=;
  38. char ch=getchar();
  39. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  40. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  41. return x*f;
  42. }
  43. int main(){
  44. n=in(),k=in();
  45. For(i,,n) ans*i;
  46. Ford(i,ans.begin+k-,ans.begin)
  47. printf("%d",ans.v[i]);
  48. }

1037

1038:线段树裸题(大神可以用RMQ,本人太蒻)

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 2000000000
  17. #define mid ((l+r)>>1)
  18. using namespace std;
  19. struct zxy{
  20. int mi;
  21. }tr[];
  22. int n,q;
  23. inline int in(){
  24. int x=,f=;
  25. char ch=getchar();
  26. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  27. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  28. return x*f;
  29. }
  30. inline void update(int l,int r,int k,int t,int add){
  31. if (l==r) {
  32. tr[k].mi=add;
  33. return;
  34. }
  35. if (t<=mid) update(l,mid,k<<,t,add);
  36. else update(mid+,r,k<<|,t,add);
  37. tr[k].mi=min(tr[k<<].mi,tr[k<<|].mi);
  38. return;
  39. }
  40. inline int query(int l,int r,int a,int b,int k){
  41. if (a==l&&b==r) return tr[k].mi;
  42. if (b<=mid) return query(l,mid,a,b,k<<);
  43. if (a>mid) return query(mid+,r,a,b,k<<|);
  44. return min(query(l,mid,a,mid,k<<),query(mid+,r,mid+,b,k<<|));
  45. }
  46. int main(){
  47. n=in(),q=in();
  48. For(i,,n) update(,n,,i,in());
  49. For(i,,q){
  50. int x=in(),y=in();
  51. printf("%d ",query(,n,x,y,));
  52. }
  53. }

1038

1039:线段树裸题+1

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 2000000000
  17. #define mid ((l+r)>>1)
  18. using namespace std;
  19. struct zxy{
  20. int mi;
  21. }tr[];
  22. int n,q;
  23. inline int in(){
  24. int x=,f=;
  25. char ch=getchar();
  26. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  27. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  28. return x*f;
  29. }
  30. inline void update(int l,int r,int k,int t,int add){
  31. if (l==r) {
  32. tr[k].mi=add;
  33. return;
  34. }
  35. if (t<=mid) update(l,mid,k<<,t,add);
  36. else update(mid+,r,k<<|,t,add);
  37. tr[k].mi=min(tr[k<<].mi,tr[k<<|].mi);
  38. return;
  39. }
  40. inline int query(int l,int r,int a,int b,int k){
  41. if (a==l&&b==r) return tr[k].mi;
  42. if (b<=mid) return query(l,mid,a,b,k<<);
  43. if (a>mid) return query(mid+,r,a,b,k<<|);
  44. return min(query(l,mid,a,mid,k<<),query(mid+,r,mid+,b,k<<|));
  45. }
  46. int main(){
  47. n=in(),q=in();
  48. For(i,,n) update(,n,,i,in());
  49. For(i,,q){
  50. int k=in(),x=in(),y=in();
  51. if (!(k^))
  52. printf("%d ",query(,n,x,y,));
  53. else update(,n,,x,y);
  54. }
  55. }

1039

1040&1041:裸的高精加减法,注意一下字符串处理的一些细节即可。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 2000000000
  17. using namespace std;
  18. struct data{
  19. int l,v[];
  20. void clear(){
  21. l=;
  22. mem(v,);
  23. }
  24. data friend operator +(data a,data b){
  25. data c;c.clear();
  26. c.l=max(a.l,b.l);
  27. For(i,,c.l) c.v[i]=a.v[i]+b.v[i];
  28. For(i,,c.l) c.v[i+]+=c.v[i]/,c.v[i]%=;
  29. if (c.v[c.l+]) ++c.l;
  30. return c;
  31. }
  32. data friend operator -(data a,data b){
  33. data c;c.clear();
  34. c.l=a.l;
  35. For(i,,c.l)
  36. if (a.v[i]>=b.v[i])
  37. c.v[i]=a.v[i]-b.v[i];
  38. else {
  39. a.v[i+]--;
  40. c.v[i]=a.v[i]+-b.v[i];
  41. }
  42. while(!c.v[c.l]&&c.l) c.l--;
  43. return c;
  44. }
  45. }ans,tmp[];
  46. char a[],ch[];
  47. int cnt;
  48. inline int in(){
  49. int x=,f=;
  50. char ch=getchar();
  51. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  52. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  53. return x*f;
  54. }
  55. int main(){
  56. scanf("%s",a);
  57. cnt=;
  58. Ford(i,strlen(a)-,)
  59. if (a[i]!='+'&&a[i]!='-') tmp[cnt].v[++tmp[cnt].l]=a[i]-'';
  60. else ch[cnt++]=a[i];
  61. ans=tmp[cnt];
  62. Ford(i,cnt-,)
  63. if (ch[i]=='+') ans=ans+tmp[i]; else ans=ans-tmp[i];
  64. Ford(i,ans.l,) printf("%d",ans.v[i]);
  65. }

1041&1042

1042&1043:栈的练习。。。。注意处理细节。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #include<stack>
  11. #define For(i,a,b) for (int i=a; i<=b; i++)
  12. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  13. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  14. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  15. #define ll long long
  16. #define mod 1000000007
  17. #define INF 2000000000
  18. using namespace std;
  19. stack<ll> num;
  20. stack<char> ch;
  21. string s;
  22. int cnt;
  23. inline int in(){
  24. int x=,f=;
  25. char ch=getchar();
  26. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  27. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  28. return x*f;
  29. }
  30. int inline getlevel(char x){
  31. if (x=='+'||x=='-') return ;
  32. if (x=='*'||x=='/') return ;
  33. if (x=='^') return ;
  34. if (x=='(') return ;
  35. if (x=='#') return -INF;
  36. return -;
  37. }
  38. ll calc(){
  39. char tmp=ch.top();ch.pop();
  40. ll b=num.top();num.pop();
  41. ll a=num.top();num.pop();
  42. if(tmp=='+')return a+b;
  43. if(tmp=='-')return a-b;
  44. if(tmp=='*')return a*b;
  45. if(tmp=='/')return a/b;
  46. ll ans=;
  47. for(int i=;i<=b;i++)
  48. ans*=a;
  49. return ans;
  50. }
  51. int main(){
  52. cin>>s;
  53. For(i,,s.size()-)
  54. if (s[i]=='(') cnt++;
  55. else if (s[i]==')') --cnt;
  56. while(cnt>) cnt--,s=s+")";
  57. while(cnt<) cnt++,s="("+s;
  58. s=s+"#";
  59. ch.push('#');
  60. num.push();
  61. int i=;
  62. while(s[i]!='#'||ch.top()!='#'){
  63. if (s[i]<''||s[i]>''){
  64. if(getlevel(s[i])>getlevel(ch.top())){
  65. s[i]=s[i]=='('?'[':s[i];
  66. ch.push(s[i]);i++;
  67. }
  68. else
  69. if (ch.top()=='[') ch.pop(),i++;
  70. else num.push(calc());
  71. }
  72. else{
  73. ll x=;
  74. while(s[i]>=''&&s[i]<='') x=x*+s[i++]-'';
  75. num.push(x);
  76. }
  77. }
  78. cout<<num.top();
  79. }

1042&1043

1044:递推

  1. #include<cstdio>
  2. #include<iostream>
  3. #define For(i,a,b) for (int i=1; i<=a; i+=b)
  4. #define in(a) scanf("%d",&a)
  5. using namespace std;
  6. int n,f[][],a[][],ans=-0x7ffffff;
  7. int main(){
  8. in(n);
  9. For(i,n,)
  10. For(j,i,)
  11. in(a[i][j]);
  12. f[][]=a[][];
  13. for (int i=; i<=n; i++)
  14. For(j,i,){
  15. f[i][j]=max(f[i-][j],f[i-][j-])+a[i][j];
  16. }
  17. For(i,n,) ans=max(ans,f[n][i]);
  18. cout<<ans;
  19. }

1044

1045:区间DP,f[i][j][k]表示在[i,j]内用了k个乘号,f[l][r][k]=max(f[l][i][j]+f[i+1][r][k-j],f[l][i][j]*f[i+1][r][k-j-1])(1<=l,r<=n;l<=i<r;0<=j<=k;注意非法情况的剪枝,以及r-l=k的情况)

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 2000000000
  17. using namespace std;
  18. int f[][][],a[],n,num;
  19. inline int in(){
  20. int x=,f=;
  21. char ch=getchar();
  22. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  23. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  24. return x*f;
  25. }
  26. inline int dp(int l,int r,int k){
  27. if (r<l||r-l<k||k<) return -;
  28. if (f[l][r][k]>) return f[l][r][k];
  29. if (r-l==k){
  30. f[l][r][k]=;
  31. For(i,l,r)
  32. f[l][r][k]*=a[i];
  33. return f[l][r][k];
  34. }
  35. For(i,l,r-)
  36. For(j,,k)
  37. f[l][r][k]=max(f[l][r][k],max(dp(l,i,j)+dp(i+,r,k-j),dp(l,i,j)*dp(i+,r,k-j-)));
  38. return f[l][r][k];
  39. }
  40. int main(){
  41. n=in(),num=in();
  42. mem(f,(-));
  43. For(i,,n) f[i][i][]=a[i]=in();
  44. printf("%d",dp(,n,num));
  45. }

1045

1046:DP,用f[i][j]表示a串排了i个,b串拍了j个,状态转移方程是f[i][j]=min(f[i-1][j-1]+abs(a[i-1]-b[j-1]),min(f[i-1][j]+k,f[i][j-1]+k)),边界条件是f[i][0]=i*k,f[0][j]=j*k。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 2000000000
  17. #define MAXN 2001
  18. using namespace std;
  19. int f[MAXN][MAXN],n,m,k;
  20. char a[MAXN],b[MAXN];
  21. inline int in(){
  22. int x=,f=;
  23. char ch=getchar();
  24. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  25. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  26. return x*f;
  27. }
  28. int dp(){
  29. mem(f,/);
  30. f[][]=;
  31. For(i,,n) f[i][]=i*k;
  32. For(i,,m) f[][i]=i*k;
  33. For(i,,n)
  34. For(j,,m)
  35. f[i][j]=min(f[i-][j-]+abs(a[i-]-b[j-]),min(f[i-][j]+k,f[i][j-]+k));
  36. return f[n][m];
  37. }
  38. int main(){
  39. scanf("%s%s%d",a,b,&k);
  40. n=strlen(a);
  41. m=strlen(b);
  42. printf("%d",dp());
  43. }

1046

1048:我们不妨假设齐王的马是从快到小依次出的,用f[l][r]表示田忌可以从自己第l强到第r蒻的马中任选一匹在本轮出战,此时赛马已经比过了(n-r+l-1)轮,我们容易想到一个DP的状态方程式:

f[l][r]=max(f[l+1][r]+price(l,n-r+l),f[l][r-1]+price(r,n-r+l));price(i,j)表示用田忌的第i匹马和第j匹马在本轮出战能拿到的money。然后用记忆化搜索实现即可。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 1000000000
  17. using namespace std;
  18. int f[][],n,a[],b[];
  19. inline int in(){
  20. int x=,f=;
  21. char ch=getchar();
  22. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  23. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  24. return x*f;
  25. }
  26. inline int price(int x,int y){
  27. if (a[x]>b[y]) return ;
  28. if (a[x]<b[y]) return (-);
  29. return ;
  30. }
  31. inline int dp(int l,int r){
  32. if (f[l][r]>(-INF)) return f[l][r];
  33. if (r<l) return -INF;
  34. if (l==r) {
  35. f[l][r]=price(l,n);
  36. return f[l][r];
  37. }
  38. f[l][r]=max(dp(l+,r)+price(l,n-r+l),dp(l,r-)+price(r,n-r+l));
  39. return f[l][r];
  40. }
  41. int main(){
  42. mem(f,-/);
  43. n=in();
  44. For(i,,n) a[i]=in();
  45. For(i,,n) b[i]=in();
  46. sort(a+,a+n+,greater<int>());
  47. sort(b+,b+n+,greater<int>());
  48. printf("%d",dp(,n));
  49. }

1048

1049:裸DP题,方程式都没什么好讲的。。。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 2000000000
  17. using namespace std;
  18. int f[],a[],n,ans;
  19. inline int in(){
  20. int x=,f=;
  21. char ch=getchar();
  22. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  23. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  24. return x*f;
  25. }
  26. int main(){
  27. n=in();
  28. For(i,,n) a[i]=in();
  29. f[]=;
  30. For(i,,n)
  31. For(j,,i-)
  32. if (a[i]>=a[j]){
  33. f[i]=max(f[i],f[j]+);
  34. ans=max(f[i],ans);
  35. }
  36. printf("%d",ans);
  37. }

1049

1050:用f[i][j]表示a串前i个字符与b串前j个字符进行匹配的最长子串长度,状态转移方程式是:f[i][j]=max(f[i-1][j],f[i][j-1])(a[i]!=b[j])&f[i][j]=f[i-1][j-1]+1(a[i]=a[j]).然后用记忆化搜索实现即可。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 2000000000
  17. using namespace std;
  18. int f[][];
  19. string a,b;
  20. inline int in(){
  21. int x=,f=;
  22. char ch=getchar();
  23. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  24. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  25. return x*f;
  26. }
  27. inline int dp(int i,int j){
  28. if (i<||j<) return ;
  29. if (f[i][j]) return f[i][j];
  30. if (a[i]==b[j]) return f[i][j]=dp(i-,j-)+;
  31. return f[i][j]=max(dp(i-,j),dp(i,j-));
  32. }
  33. int main(){
  34. cin>>a>>b;
  35. printf("%d",dp(a.size()-,b.size()-));
  36. }

1050

1051:典型的树形DP题,我们采用左儿子右兄弟法存树,f[i][j]表示第i个节点还能选j门课的最优值,枚举DP到儿子时可以选的课数l(1<=l<=j),可以发现

f[i][j]=max(f[儿子][j-i-1]+f[兄弟][i]+i节点的权值,f[兄弟][j]);然后我们使用记忆化搜索实现树上DP即可。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 2000000000
  17. using namespace std;
  18. struct zxy{
  19. int v,son,bra;
  20. }tr[];
  21. int n,f[][],m,ans;
  22. inline int in(){
  23. int x=,f=;
  24. char ch=getchar();
  25. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  26. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  27. return x*f;
  28. }
  29. inline int dp(int k,int t){
  30. if (!(k&&t)) return ;
  31. if (f[k][t]) return f[k][t];
  32. f[k][t]=tr[k].v;
  33. For(i,,t)
  34. f[k][t]=max(f[k][t],dp(tr[k].son,t-i)+dp(tr[k].bra,i-)+tr[k].v);
  35. f[k][t]=max(dp(tr[k].bra,t),f[k][t]);
  36. return f[k][t];
  37. }
  38. int main(){
  39. n=in(),m=in();
  40. For(i,,n){
  41. int x=in(),y=in();
  42. tr[i].bra=tr[x].son;
  43. tr[x].son=i;
  44. tr[i].v=y;
  45. }
  46. f[][]=;
  47. tr[].v=;
  48. printf("%d",dp(tr[].son,m));
  49. }

1051

1052:显然又是一题树上DP,用f[i][0/1]表示取不取第i节点时的最优状态,采用了很暴力的方法存树,找到root,跑一次dfs枚举儿子累加状态即可。

状态转移方程:f[i][0]=Σmax(f[儿子][1],f[儿子][0]),f[i][1]=第i点的权值+∑f[儿子][0].

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 2000000000
  17. using namespace std;
  18. int n,f[][],fa[];
  19. bool b[];
  20. inline int in(){
  21. int x=,f=;
  22. char ch=getchar();
  23. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  24. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  25. return x*f;
  26. }
  27. inline void treedp(int k){
  28. b[k]=;
  29. For(i,,n)
  30. if (b[i]&&fa[i]==k){
  31. treedp(i);
  32. f[k][]+=f[i][];
  33. f[k][]+=max(f[i][],f[i][]);
  34. }
  35. }
  36. int main(){
  37. n=in();
  38. For(i,,n) f[i][]=in();
  39. For(i,,n-){
  40. int x=in(),y=in();
  41. fa[x]=y;
  42. b[x]=;
  43. }
  44. int s;
  45. For(i,,n) if (!b[i]){
  46. s=i;
  47. break;
  48. }
  49. treedp(s);
  50. printf("%d",max(f[s][],f[s][]));
  51. }

1052

1053:字符串处理,按题意做,注意连续'-'和开头以及结尾的处理就行了。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (char i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i<=b; i++)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 2000000000
  17. using namespace std;
  18. string a;
  19. int p1,p2,p3;
  20. inline int in(){
  21. int x=,f=;
  22. char ch=getchar();
  23. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  24. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  25. return x*f;
  26. }
  27. inline bool digit(char k){
  28. return k>=''&&k<='';
  29. }
  30. inline bool alpha(char k){
  31. return k>='a'&&k<='z';
  32. }
  33. inline void get_(char a,char b){
  34. if (b<=a||(alpha(a)&&digit(b))||(digit(a)&&alpha(b))||a=='-'||b=='-') {
  35. putchar('-');
  36. return;
  37. }
  38. int cnt=;
  39. if (p3-){
  40. if (p1==) For(i,a+,b-)
  41. Ford(j,,p2)
  42. putchar('*');
  43. if (p1==&&alpha(a))
  44. for(char i=b-; i>a; i--)
  45. Ford(j,,p2)
  46. putchar(i-'a'+'A');
  47. if (p1==||(p1==&&digit(a))) for(char i=b-; i>a; i--)
  48. Ford(j,,p2)
  49. putchar(i);
  50. return;
  51. }
  52. if (p1==) For(i,a+,b-)
  53. Ford(j,,p2)
  54. putchar('*');
  55. if (p1==&&alpha(a))
  56. For(i,a+,b-)
  57. Ford(j,,p2)
  58. putchar(i-'a'+'A');
  59. if (p1==) For(i,a+,b-)
  60. Ford(j,,p2)
  61. putchar(i);
  62. }
  63. int main(){
  64. p1=in(),p2=in(),p3=in();
  65. cin>>a;
  66. Ford(i,,a.size()-)
  67. if (a[i]!='-'||i==) putchar(a[i]);
  68. else get_(a[i-],a[i+]);
  69. }

1053

1055:又是区间DP,用f[l][r]表示将[l,r]合并成一堆以后的最优值,这样的话状态转移方程式是:f[l][r]=f[l][i]+f[i+1][r]+∑(j=l,j<=r)a[j](l<=i<=r),其中我们可以用前缀和简化∑,然后使用记忆化搜索即可。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 100000000
  17. using namespace std;
  18. int f[][],n,s[];
  19. inline int in(){
  20. int x=,f=;
  21. char ch=getchar();
  22. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  23. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  24. return x*f;
  25. }
  26. inline int dp(int l,int r){
  27. if (f[l][r]<INF) return f[l][r];
  28. if (l==r) return ;
  29. For(i,l,r-) f[l][r]=min(dp(l,i)+dp(i+,r)+s[r]-s[l-],f[l][r]);
  30. return f[l][r];
  31. }
  32. int main(){
  33. n=in();
  34. For(i,,n) s[i]=s[i-]+in();
  35. mem(f,/)
  36. printf("%d",dp(,n));
  37. }

1055

1056:still区间DP,首先对循环这个特性我们进行处理,用[n+1,2*n]复制与[1,n]的相同信息,这样之后从1~n都进行一次长度为n的DP取最优即可。

DP的方法:用f[l][r]表示将[l,r]合并后的最优值,状态转移方程:f[l][r]=f[l][i]+f[i+1][r]+a[l]*a[i+1]*a[r](l<=i<=r),边界是f[i][i]=0;

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 2000000000
  17. using namespace std;
  18. int f[][],a[],n,ans;
  19. inline int in(){
  20. int x=,f=;
  21. char ch=getchar();
  22. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  23. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  24. return x*f;
  25. }
  26. inline int dp(int l,int r){
  27. if (f[l][r]) return f[l][r];
  28. if (l==r) return ;
  29. For(i,l,r-) f[l][r]=max(f[l][r],dp(l,i)+dp(i+,r)+a[l]*a[i+]*a[r+]);
  30. return f[l][r];
  31. }
  32. int main(){
  33. n=in();
  34. For(i,,n) a[i]=in();
  35. For(i,n+,*n) a[i]=a[i-n];
  36. For(i,,n)
  37. ans=max(ans,dp(i,i+n-));
  38. printf("%d",ans);
  39. }

1056

1057:裸01背包,处理一下依附关系即可,具体参见程序。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 2000000000
  17. using namespace std;
  18. struct zxy{
  19. int ls,rs,v,imp;
  20. bool pp;
  21. }tr[];
  22. int n,m,f[];
  23. inline int in(){
  24. int x=,f=;
  25. char ch=getchar();
  26. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  27. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  28. return x*f;
  29. }
  30. int main(){
  31. m=in(),n=in();
  32. m/=;
  33. For(i,,n){
  34. tr[i].v=in();
  35. tr[i].v/=;
  36. tr[i].imp=in();
  37. int y=in();
  38. if (y){
  39. tr[i].pp=;
  40. if (tr[y].ls) tr[y].rs=i;
  41. else tr[y].ls=i;
  42. }
  43. }
  44. tr[].v=tr[].imp=;
  45. For(i,,n)
  46. if (!tr[i].pp)
  47. Ford(j,m,tr[i].v){
  48. int ls=tr[i].ls,rs=tr[i].rs;
  49. if (j-tr[i].v>=tr[ls].v)
  50. f[j]=max(f[j],f[j-tr[i].v-tr[ls].v]+tr[i].v*tr[i].imp+tr[ls].v*tr[ls].imp);
  51. if (j-tr[i].v>=tr[rs].v)
  52. f[j]=max(f[j],f[j-tr[i].v-tr[rs].v]+tr[i].v*tr[i].imp+tr[rs].v*tr[rs].imp);
  53. if (j-tr[i].v>=tr[rs].v+tr[ls].v)
  54. f[j]=max(f[j],f[j-tr[i].v-tr[rs].v-tr[ls].v]+tr[i].v*tr[i].imp+tr[rs].v*tr[rs].imp+tr[ls].v*tr[ls].imp);
  55. f[j]=max(f[j],f[j-tr[i].v]+tr[i].v*tr[i].imp);
  56. }
  57. printf("%d",f[m]*);
  58. }

1057

1058:单纯的模拟,题意自己去外面找去┑( ̄Д  ̄)┍

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 2000000000
  17. using namespace std;
  18. struct zxy{
  19. int no,no2;
  20. }order[];
  21. int use[][],n,m,cnt[],t[][],mac[][],mact[],ans,end[];
  22. bool used[][];
  23. inline int in(){
  24. int x=,f=;
  25. char ch=getchar();
  26. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  27. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  28. return x*f;
  29. }
  30. inline bool pd(int ma,int s,int e){
  31. For(i,s,e)
  32. if (used[ma][i]) return ;
  33. return ;
  34. }
  35. int main(){
  36. m=in(),n=in();
  37. For(i,,m*n) order[i].no=in(),order[i].no2=++cnt[order[i].no];
  38. For(i,,n)
  39. For(j,,m) mac[i][j]=in();
  40. For(i,,n)
  41. For(j,,m) t[i][j]=in();
  42. For(i,,m*n){
  43. int gj=order[i].no,no=order[i].no2;
  44. int tim=t[gj][no],macc=mac[gj][no];
  45. For(j,end[gj],INF)
  46. if (pd(macc,j,j+tim-)){
  47. For(k,j,j+tim-)
  48. used[macc][k]=;
  49. end[gj]=j+tim;
  50. if (j+tim>ans) ans=j+tim;
  51. break;
  52. }
  53. }
  54. printf("%d",ans);
  55. }

1058

1062:题目都说了和合并方法和合并傻子沙子差不多,这里就不多说怎么做了,做法与1055类似,详见代码

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 100000000
  17. using namespace std;
  18. int f[][],n,s[],m;
  19. inline int in(){
  20. int x=,f=;
  21. char ch=getchar();
  22. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  23. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  24. return x*f;
  25. }
  26. inline int dpmi(int l,int r){
  27. if (f[l][r]<INF) return f[l][r];
  28. if (l==r) return ;
  29. For(i,l,r-) f[l][r]=min(dpmi(l,i)+dpmi(i+,r)+s[r]-s[l-],f[l][r]);
  30. return f[l][r];
  31. }
  32. inline int dpma(int l,int r){
  33. if (f[l][r]) return f[l][r];
  34. if (l==r) return ;
  35. For(i,l,r-) f[l][r]=max(dpma(l,i)+dpma(i+,r)+s[r]-s[l-],f[l][r]);
  36. return f[l][r];
  37. }
  38. int main(){
  39. n=in();m=in();
  40. For(i,,n) s[i]=s[i-]+in();
  41. int ma=dpma(,n);
  42. mem(f,/);
  43. int mi=dpmi(,n);
  44. if (m<mi) printf("I am..Sha...X");
  45. else if (m>ma) printf("It is easy");
  46. else printf("I will go to play WarIII");
  47. }

1062

1063:我们可以比较容易的想到一种贪心的方法,用头指针h和尾指针t来在数字串上模拟一个队列,对于队列判断一下是否符合条件,进行答案更新,这样的话效率还是很慢(O(mn)),我们可以考虑对队列中不同元素的数量进行一个统计,这样当cnt=m时,自然队列就符合条件,具体实现方法见代码,时间效率为O(n)。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 2000000000
  17. using namespace std;
  18. int n,m,a[],b[],h,t;
  19. inline int in(){
  20. int x=,f=;
  21. char ch=getchar();
  22. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  23. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  24. return x*f;
  25. }
  26. int main(){
  27. n=in(),m=in();
  28. For(i,,n) a[i]=in();
  29. int cnt=,ans=n+;
  30. h=,t=;
  31. while(h<=n-m+&&t<=n){
  32. while(cnt!=m&&t<=n)
  33. cnt=b[a[++t]]?cnt:cnt+,b[a[t]]++;
  34. if (t-h+<ans) ans=t-h+;
  35. b[a[h]]--;
  36. if (!b[a[h]]) cnt--;
  37. h++;
  38. }
  39. if (ans<=n)printf("%d",ans);
  40. else printf("NO");
  41. }

1063

1065:纯模拟

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstdlib>
  4. using namespace std;
  5. int n,c,x;
  6. int main(){
  7. for (int i=; i<=; i++){
  8. n+=;
  9. scanf("%d",&x);
  10. n-=x;
  11. if (n<){
  12. cout<<-i;
  13. exit();
  14. }
  15. c+=n/*;
  16. n%=;
  17. }
  18. cout<<c+n;
  19. }

1065

1066:STL练习题,可以采用系统优先队列,自带堆等(本人采用自带堆排)

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<queue>
  10. #include<cmath>
  11. #define For(i,a,b) for (int i=a; i<=b; i++)
  12. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  13. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  14. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  15. #define ll long long
  16. #define mod 1000000007
  17. #define INF 2000000000
  18. using namespace std;
  19. int heap[],hp,n,ans;
  20. void in(int x){
  21. heap[++hp]=x;
  22. push_heap(heap+,heap+hp+,greater<int>());
  23. }
  24. int out(){
  25. pop_heap(heap+,heap+hp+,greater<int>());
  26. return heap[hp--];
  27. }
  28. int main(){
  29. cin>>n;
  30. for (int i=; i<=n; i++){
  31. int x;
  32. scanf("%d",&x);
  33. in(x);
  34. }
  35. while(hp!=){
  36. int x=out(),y=out();
  37. ans+=(x+y);
  38. in(x+y);
  39. }
  40. cout<<ans;
  41. }

1066

1067:用DP从前往后和从后往前各求一次到每个人的最长连续上升子序列长度,这样以来选每个人作为最高点时的答案就很好求了。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<string>
  5. #include<algorithm>
  6. #include<map>
  7. #include<set>
  8. #include<vector>
  9. #include<cmath>
  10. #define For(i,a,b) for (int i=a; i<=b; i++)
  11. #define Ford(i,a,b) for (int i=a; i>=b; i--)
  12. #define File(fn) freopen(fn".in","r",stdin); freopen(fn".out","w",stdout);
  13. #define mem(qaq,num) memset(qaq,num,sizeof(qaq));
  14. #define ll long long
  15. #define mod 1000000007
  16. #define INF 700000000
  17. using namespace std;
  18. int upp[],n,a[],dow[],ans=0x7fffffff;
  19. inline int in(){
  20. int x=,f=;
  21. char ch=getchar();
  22. while (ch<''||ch>'') f=ch=='-'?-:,ch=getchar();
  23. while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
  24. return x*f;
  25. }
  26. int main(){
  27. n=in();
  28. For(i,,n) a[i]=in();
  29. For(i,,n)
  30. For(j,,i-)
  31. if (a[i]>a[j])
  32. upp[i]=max(upp[i],upp[j]+);
  33. Ford(i,n,)
  34. Ford(j,n+,i+)
  35. if (a[i]>a[j])
  36. dow[i]=max(dow[i],dow[j]+);
  37. For(i,,n)
  38. ans=min(ans,n-upp[i]-dow[i]+);
  39. printf("%d",ans);
  40. }

1067

1075:数字三角形无脑递推系列...

  1. #include<cstdio>
  2. #include<iostream>
  3. #define For(i,a,b) for (int i=1; i<=a; i+=b)
  4. #define in(a) scanf("%d",&a)
  5. using namespace std;
  6. int n,a[][],ans=-;bool f[][][];
  7. int main(){
  8. in(n);
  9. For(i,n,)
  10. For(j,i,)
  11. in(a[i][j]);
  12. f[][][a[][]%]=;
  13. for (int i=; i<=n; i++)
  14. For(j,i,){
  15. for (int k=; k<=; k++) if (f[i-][j][k]) f[i][j][(k+a[i][j])%]=;
  16. for (int k=; k<=; k++) if (f[i-][j-][k]) f[i][j][(k+a[i][j])%]=;
  17. }
  18. For(j,n,)
  19. for (int i=; i>=; i--) if (f[n][j][i]) ans=max(ans,i);
  20. cout<<ans;
  21. }

1075

1079:数字三角形无脑递推系列...

  1. #include<cstdio>
  2. #include<iostream>
  3. #define For(i,a,b) for (int i=a; i<=b; i++)
  4. #define in(a) scanf("%d",&a)
  5. using namespace std;
  6. int n,f[][],a[][],ans=-0x7ffffff;
  7. int main(){
  8. in(n);
  9. For(i,,n)
  10. For(j,,i)
  11. in(a[i][j]);
  12. f[][]=a[][];
  13. For(i,,n/)
  14. For(j,,i)
  15. f[i][j]=max(f[i-][j],f[i-][j-])+a[i][j];
  16. For(i,,n/-) f[n/][i]=;
  17. For(i,n/+,n)
  18. For(j,n/,i)
  19. f[i][j]=max(f[i-][j],f[i-][j-])+a[i][j];
  20. For(i,n/,n) ans=max(ans,f[n][i]);
  21. cout<<ans;
  22. }

1079

1084:数字三角形无脑递推系列...

  1. #include<cstdio>
  2. #include<iostream>
  3. #define For(i,a,b) for (int i=a; i<=b; i++)
  4. #define in(a) scanf("%d",&a)
  5. using namespace std;
  6. int n,f[][],a[][],ans=-0x7ffffff,x,y;
  7. int main(){
  8. in(n);
  9. For(i,,n)
  10. For(j,,i)
  11. in(a[i][j]);
  12. in(x);in(y);
  13. f[][]=a[][];
  14. For(i,,x)
  15. For(j,,i)
  16. f[i][j]=max(f[i-][j],f[i-][j-])+a[i][j];
  17. For(i,,x)if (i!=y) f[x][i]=-;
  18. For(i,x+,n)
  19. For(j,y,i)
  20. f[i][j]=max(f[i-][j],f[i-][j-])+a[i][j];
  21. For(i,y,n) ans=max(ans,f[n][i]);
  22. cout<<ans;
  23. }

1084

本文由Melacau编写,Melacau代表M星向您问好,如果您不是在我的博客http://www.cnblogs.com/Melacau上看到本文,请您向我联系,email:13960948839@163.com.

【tyvj】刷题记录(1001~1099)(64/99)的更多相关文章

  1. [BUUCTF-Pwn]刷题记录1

    [BUUCTF-Pwn]刷题记录1 力争从今天(2021.3.23)开始每日至少一道吧--在这里记录一些栈相关的题目. 最近更新(2021.5.8) 如果我的解题步骤中有不正确的理解或不恰当的表述,希 ...

  2. PE刷题记录

    PE刷题记录 PE60 / 20%dif 这道题比较坑爹. 所有可以相连的素数可以构成一张图,建出这张图,在其中找它的大小为5的团.注意上界的估算,大概在1W以内.1W内有1229个素数,处理出这些素 ...

  3. leetcode刷题记录--js

    leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...

  4. Leetcode刷题记录(python3)

    Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...

  5. 刷题记录:[HarekazeCTF2019]encode_and_encode

    目录 刷题记录:[HarekazeCTF2019]encode_and_encode 一.知识点 JSON转义字符绕过 php伪协议 刷题记录:[HarekazeCTF2019]encode_and_ ...

  6. 刷题记录:[De1CTF 2019]Giftbox && Comment

    目录 刷题记录:[De1CTF 2019]Giftbox && Comment 一.知识点 1.sql注入 && totp 2.RCE 3.源码泄露 4.敏感文件读取 ...

  7. 刷题记录:[强网杯 2019]Upload

    目录 刷题记录:[强网杯 2019]Upload 一.知识点 1.源码泄露 2.php反序列化 刷题记录:[强网杯 2019]Upload 题目复现链接:https://buuoj.cn/challe ...

  8. 刷题记录:[XNUCA2019Qualifier]EasyPHP

    目录 刷题记录:[XNUCA2019Qualifier]EasyPHP 解法一 1.error_log结合log_errors自定义错误日志 2.include_path设置包含路径 3.php_va ...

  9. 刷题记录:[DDCTF 2019]homebrew event loop

    目录 刷题记录:[DDCTF 2019]homebrew event loop 知识点 1.逻辑漏洞 2.flask session解密 总结 刷题记录:[DDCTF 2019]homebrew ev ...

随机推荐

  1. css变化代码

    <!DOCTYPE html><html>    <head>        <meta charset="UTF-8">      ...

  2. LR回放https协议脚本失败: 错误 -27778: 在尝试与主机“www.baidu.com”connect 时发生 SSL 协议错误

    今天用LR录制脚本协议为https协议,回放脚本时出现报错: Action.c(14): 错误 -27778: 在尝试与主机"www.baidu.com"connect 时发生 S ...

  3. Python内置函数(50)——issubclass

     英文文档: issubclass(class, classinfo) Return true if class is a subclass (direct, indirect or virtual) ...

  4. Centos7.x:开机启动服务的配置和管理

    一.开机启动服务的配置 1.创建服务配置(权限754) vim /usr/lib/systemd/system/nginx.service 文件内容解释 [Unit]:服务的说明Description ...

  5. hadoop2.7.3+spark2.1.0+scala2.12.1环境搭建(4)SPARK 安装

    hadoop2.7.3+spark2.1.0+scala2.12.1环境搭建(4)SPARK 安装 一.依赖文件安装 1.1 JDK 参见博文:http://www.cnblogs.com/liugh ...

  6. SpringBoot 分布式session

    SpringBoot 分布式session实现 1. 什么是分布式session 在集群环境中,不得不考虑的一个问题是用户访问产生的session如何处理.如过不做任何处理,用户将出现频繁俸禄的现象, ...

  7. netty学习--handler传递

    在netty中的处理链pipeline中,事件是按顺序传递的,把自己拟人为netty程序,针对进来(inbound)的请求,会从head开始,依次往tail传递. pipeline采用了链表结构,he ...

  8. python CSS

    CSS 一. css的四种引入方式   1.行内式  2.嵌入式  3. 链接式 将一个.css文件引入到HTML文件中 1 <link href="mystyle.css" ...

  9. vue中的vue-cli

    在前面的学习过程中我相信你们已经对vue有了一定的了解,现在我们来看一下vue中的vue-cli. 学习这个我们首先需要的是node环境的,如果你的网络环境慢的话建议安装淘宝镜像,在cmd中输入 np ...

  10. JavaScript splice() 、slice() 方法

    定义和用法 splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目. slice() 方法可从已有的数组中返回选定的元素. 注释:该方法会改变原始数组. 语法 arrayObject. ...