zoukankan      html  css  js  c++  java
  • 【tyvj】刷题记录(1001~1099)(64/99)

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

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 #include<algorithm>
     5 using namespace std;
     6 int a[10001],k,n;
     7 int main(){
     8     scanf("%d%d",&n,&k);
     9     for (int i=1; i<=n; i++) scanf("%d",&a[i]);
    10     sort(a+1,a+n+1);
    11     int m=a[n-k+1]-a[k];
    12     if (m<2&&m>=0) printf("NO");
    13     else if (m>0){
    14         if (m==2) printf("YES
    ");
    15         else{
    16             for (int i=2; i<=floor(sqrt(m)); i++)
    17                 if (m%i==0){
    18                     printf("NO
    ");
    19                     printf("%d",m);
    20                     return 0;
    21                 }
    22             printf("YES
    ");
    23         }
    24         printf("%d",m);
    25         return 0;
    26     }else printf("NO
    %d",m);
    27     return 0;
    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=1; i<=n; i++){ 
    11         hv=0; 
    12         //cout<<i<<":"; 
    13         cin>>bb; 
    14         scanf("%d%d",&qm,&bj); 
    15         getchar(); 
    16         gb=getchar()=='Y'?1:0; 
    17         getchar(); 
    18         wt=getchar()=='Y'?1:0; 
    19         scanf("%d",&lw); 
    20         if (qm>80&&lw) hv+=8000; 
    21         if (qm>85&&bj>80) hv+=4000; 
    22         if (qm>90) hv+=2000; 
    23         if (qm>85&&wt) hv+=1000; 
    24         if (bj>80&&gb) hv+=850; 
    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:模拟即可。

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<math.h>
    using namespace std;
    int main(){
        int m,t,u,f,d,s=0,t1=0;
        char a[100001];
        scanf("%d %d %d %d %d",&m,&t,&u,&f,&d);
        for(int i=0;i<t;i++)
        scanf("%s",&a[i]);
        for(int i=0;i<t;i++){
                if(a[i]=='u'||a[i]=='d') s=s+u+d;
                else s=s+f*2;
                if(s>m) break;
                t1++;
                }
        cout<<t1<<endl;
        return 0;
    }
    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[10001]; 
     8 int f[101][101],b[101][101],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=1; i<=n; i++) 
    15         for (int j=1; 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]=1; 
    19         } 
    20     sort(a+1,a+n*m+1,pd); 
    21     for (int i=1; i<=n*m; i++){ 
    22         int x=a[i].x,y=a[i].y; 
    23         f[x+1][y]=((b[x+1][y]>a[i].n)&&(f[x+1][y]<f[x][y]+1))?f[x][y]+1:f[x+1][y]; 
    24         f[x-1][y]=((b[x-1][y]>a[i].n)&&(f[x-1][y]<f[x][y]+1))?f[x][y]+1:f[x-1][y]; 
    25         f[x][y+1]=((b[x][y+1]>a[i].n)&&(f[x][y+1]<f[x][y]+1))?f[x][y]+1:f[x][y+1]; 
    26         f[x][y-1]=((b[x][y-1]>a[i].n)&&(f[x][y-1]<f[x][y]+1))?f[x][y]+1:f[x][y-1]; 
    27     } 
    28     for (int i=1; i<=n; i++) 
    29         for (int j=1; 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[1001],p[101],a[101],n,v; 
     5 int main(){ 
     6     cin>>v>>n; 
     7     for (int i=1; i<=n; i++) scanf("%d%d",&a[i],&p[i]); 
     8     for (int i=1; 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:模拟。

    #include<cstdio>
    #include<iostream>
    #define k(x,y) y*(a[x]-48)
    using namespace std;
    int main(){
        char a[14];
        gets(a);
        if ((k(0,1)+k(2,2)+k(3,3)+k(4,4)+k(6,5)+k(7,6)+k(8,7)+k(9,8)+k(10,9))%11==(a[12]=='X'?10:a[12]-48)) cout<<"Right";
            else{
                cout<<a[0]<<a[1]<<a[2]<<a[3]<<a[4]<<a[5]<<a[6]<<a[7]<<a[8]<<a[9]<<a[10]<<a[11];
                if ((k(0,1)+k(2,2)+k(3,3)+k(4,4)+k(6,5)+k(7,6)+k(8,7)+k(9,8)+k(10,9))%11==10) cout<<"X";
                    else cout<<(k(0,1)+k(2,2)+k(3,3)+k(4,4)+k(6,5)+k(7,6)+k(8,7)+k(9,8)+k(10,9))%11;
            }
    }
    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[1001],anl[1001];
     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=1; i<n; i++) anl[i].no=i;
    18     for (int i=1; i<m; i++) anh[i].no=i;
    19     for (int i=1; 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+1,anl+n+1,fuck);
    25     sort(anh+1,anh+1+m,fuck);
    26     sort(anl+1,anl+l+1,fuck233);
    27     sort(anh+1,anh+k+1,fuck233);
    28     for (int i=1; i<k; i++) printf ("%d ",anh[i].no);
    29     cout<<anh[k].no<<endl;
    30     for (int i=1; 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[31][31],m,n;
     5 int main(){
     6     scanf("%d%d",&n,&m);
     7     f[0][1]=1;
     8     for (int i=1; i<=m; i++)
     9         for (int j=1; j<=n; j++){
    10             f[i][j]=f[i-1][j==1?n:j-1]+f[i-1][j==n?1:j+1];
    11         }
    12     cout<<f[m][1];
    13 }
    1008

    1009:略过略过~

    1010:模拟即可。。。

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cstring>
     4 #include<cmath>
     5 using namespace std;
     6 char a[100];
     7 int f[27],ma,mi=0x7f;
     8 int main(){
     9     gets(a);
    10     for (int i=0; i<strlen(a); i++)
    11         f[a[i]-95]++;
    12     for (int i=1; i<=26; i++){
    13         ma=max(ma,f[i]);
    14         mi=min(mi,f[i]==0?0x7f:f[i]);
    15     }
    16     ma-=mi;
    17     if (ma<2){
    18         cout<<"No Answer
    0";
    19         return 0;
    20     }
    21     else{
    22         if (ma!=2) for (int i=2; i<=floor(sqrt(ma)); i++) if (ma%i==0){
    23             cout<<"No Answer
    0";
    24             return 0;
    25         }
    26         cout<<"Lucky Word
    "<<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[101][51][51],a[51][51],n,m;
    18 inline int in(){
    19     int x=0,f=1;
    20     char ch=getchar();
    21     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    22     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    23     return x*f;
    24 }
    25 int main(){
    26     n=in(),m=in();
    27     For(i,1,n)
    28         For(j,1,m)
    29             a[i][j]=in();
    30     For(i,1,n+m)
    31         For(j,1,min(n,i))
    32             For(k,1,min(n,i))
    33             if (j!=k||i==n+m)
    34                 f[i][j][k]=max(f[i-1][j-1][k-1],max(max(f[i-1][j][k],f[i][j][k]),max(f[i-1][j-1][k],f[i-1][j][k-1])))+a[j][i-j+1]+a[k][i-k+1];
    35     printf("%d
    ",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[10]={6,2,5,5,4,5,6,3,7,6};
    20 inline int in(){
    21     int x=0,f=1;
    22     char ch=getchar();
    23     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    24     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    25     return x*f;
    26 }
    27 inline int get(int x){
    28     if (!x) return 6;
    29     int cnt=0;
    30     while(x){
    31         cnt+=a[x%10];
    32         x/=10;
    33     }
    34     return cnt;
    35 }
    36 int main(){
    37     n=in();
    38     n-=4;
    39     int ans=0;
    40     For(i,0,800)
    41         For(j,i,800)
    42             if (get(i)+get(j)+get(i+j)==n)
    43                 if (i!=j) ans+=2;
    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[101];
    22 int f[101][101],g[101][101],n,rp,m,ans,mi;
    23 inline int in(){
    24     int x=0,f=1;
    25     char ch=getchar();
    26     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    27     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    28     return x*f;
    29 }
    30 int main(){
    31     n=in();
    32     For(i,1,n)
    33         a[i].c=in(),a[i].rp=in(),a[i].t=in();
    34     m=in(),rp=in();
    35     mem(g,127/3); g[0][0]=0;
    36     For(i,1,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]+1>f[j][k]||(f[j-a[i].c][k-a[i].rp]+1==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]+1;
    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[101],f[101][101];
    20 inline int in(){
    21     int x=0,f=1;
    22     char ch=getchar();
    23     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    24     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    25     return x*f;
    26 }
    27 inline int dp(int l,int r){
    28     if (f[l][r]!=f[0][0]) return f[l][r];
    29     if (l+1==r) return 0;
    30     For(i,l+1,r-1)
    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,1,n) a[i]=in();
    37     mem(f,127/3);
    38     dp(1,n);
    39     printf("%d",f[1][n]);
    40 }
    1014

    1015:非常水的DP。

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

    1016:裸01背包+1

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 int f[20001],a[31],n,v;
     5 int main(){
     6     cin>>v>>n;
     7     for (int i=1; i<=n; i++) scanf("%d",&a[i]);
     8     for (int i=1; 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[101],n,m,ans;
    20 inline int in(){
    21     int x=0,f=1;
    22     char ch=getchar();
    23     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    24     while (ch>='0'&&ch<='9') x=x*10+ch-'0',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,1,m) fa[i]=i;
    34     For(i,1,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=1,a[30];
    20 ll ans=1;
    21 inline int in(){
    22     int x=0,f=1;
    23     char ch=getchar();
    24     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    25     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    26     return x*f;
    27 }
    28 int main(){
    29     n=in();k=in();
    30     bool p=0;
    31     For(i,1,k) mo*=10;
    32     For(i,1,n) 
    33         ans*=i;
    34     while(ans%10==0) ans/=10;
    35     int cnt=0;
    36     while(ans){
    37         a[++cnt]=ans%10;
    38         ans/=10;
    39     }
    40     Ford(i,min(cnt,k),1) 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[10001],b[10001],n,ans;
    20 inline int in(){
    21     int x=0,f=1;
    22     char ch=getchar();
    23     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    24     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    25     return x*f;
    26 }
    27 int main(){
    28     n=in();
    29     For(i,1,n) a[i]=in();
    30     For(i,1,n) b[i]=in();
    31     sort(a+1,a+n+1);
    32     sort(b+1,b+n+1,greater<int>());
    33     For(i,1,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[20001];
    20 int pr[20001],ma,maxx,n,x,cnt;
    21 inline int in(){
    22     int x=0,f=1;
    23     char ch=getchar();
    24     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    25     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    26     return x*f;
    27 }
    28 void init(){
    29     f[1]=1;
    30     For(i,2,20000)
    31         if (!f[i])
    32             For(j,2,20000/i)
    33                 f[i*j]=1;
    34     For(i,2,20000)
    35         if (!f[i])
    36             pr[++cnt]=i;
    37     return;
    38 }
    39 int main(){
    40     init();
    41     n=in();
    42     For(i,1,n){
    43         x=in();
    44         Ford(i,cnt,1)
    45             if (pr[i]<maxx) break;
    46             else if (x%pr[i]==0){
    47                 ma=x;
    48                 maxx=pr[i];
    49             }
    50     }
    51     printf("%d",ma);
    52 }
    1020

    1021:模拟即可。。。。

    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[33];
    21 inline ll in(){
    22     ll x=0,f=1;
    23     char ch=getchar();
    24     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    25     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    26     return x*f;
    27 }
    28 int main(){
    29     x=in();
    30     ll p=1;
    31     int i=0;
    32     for(p=1; i<=32; p*=(-2),i++)
    33         if ((x/p)&1){
    34             ans[i]=1;
    35             x-=p;
    36         }
    37     while(!ans[i]&&i) i--;
    38     Ford(j,i,0)
    39         printf("%d",(ans[j]?1:0));
    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[2001],n,m,f[2001][501];
    20 inline int in(){
    21     int x=0,f=1;
    22     char ch=getchar();
    23     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    24     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    25     return x*f;
    26 }
    27 int main(){
    28     n=in(),m=in();
    29     For(i,1,n) d[i]=in();
    30     For(i,1,n){
    31         f[i][0]=f[i-1][0];
    32         For(j,1,min(i,m)) f[i][0]=max(f[i][0],f[i-j][j]);
    33         For(j,1,m) f[i][j]=f[i-1][j-1]+d[i];
    34     }
    35     printf("%d",f[n][0]);    
    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[26],a[255],f[255],cnt,ans[255];
    20 char zxy[255];
    21 inline int in(){
    22     int x=0,f=1;
    23     char ch=getchar();
    24     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    25     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    26     return x*f;
    27 }
    28 int doit(int n){
    29     mem(f,0);
    30     f[1]=0;
    31     int ans=0;
    32     For(i,2,n)
    33         For(j,1,i-1)
    34             if (a[i]>=a[j]){
    35                 f[i]=max(f[i],f[j]+1);
    36                 ans=max(f[i],ans);
    37             }
    38     return ans;    
    39 }
    40 int main(){
    41     scanf("%s",zxy);
    42     For(i,0,strlen(zxy)-1)
    43         dy[zxy[i]-'a']=i;
    44     while(scanf("%s",zxy+1)!=EOF){
    45         cnt=0;
    46         For(i,0,strlen(zxy)-1)
    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[255],b;
     6 int n;
     7 int main(){
     8     cin>>n;
     9     getchar();
    10     for (int i=1; i<=n; i++){
    11         gets(a);
    12         b=a[strlen(a)-1];
    13         if (b%2==0) cout<<"even
    ";
    14         else cout<<"odd
    ";
    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[241][241];
    20 int n,m,I,ans;
    21 inline int in(){
    22     int x=0,f=1;
    23     char ch=getchar();
    24     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    25     while (ch>='0'&&ch<='9') x=x*10+ch-'0',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,1,I){
    32         x=in(),y=in(),xx=in(),yy=in();
    33         For(i,x,xx)
    34             For(j,y,yy)
    35                 f[i][j]=1;
    36     }
    37     For(i,1,n)
    38         For(j,1,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[45][45],dx[4]={1,0,-1,0},dy[4]={0,1,0,-1},n,m;
    20 inline int in(){
    21     int x=0,f=1;
    22     char ch=getchar();
    23     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    24     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    25     return x*f;
    26 }
    27 int bfs(){
    28     int x=1,y=1;
    29     int ans=a[1][1];
    30     a[1][1]=0;
    31     while(x!=n||y!=m){
    32         int ma=0,nx,ny;
    33         For(i,0,3)    
    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]=0;
    41     }
    42     return ans;
    43 }
    44 int main(){
    45     n=in(),m=in();
    46     For(i,1,n)
    47         For(j,1,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[45001],a[501],n,v;
     5 inline int in(){
     6     int x=0,f=1;
     7     char ch=getchar();
     8     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
     9     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    10     return x*f;
    11 }
    12 int main(){
    13     v=in(),n=in();
    14     for (int i=1; i<=n; i++) a[i]=in();
    15     for (int i=1; 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=0,f=1;
    22     char ch=getchar();
    23     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    24     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    25     return x*f;
    26 }
    27 bool check(string a,string b,int l){
    28     For(i,0,l-1)
    29         if (a[i]!=b[b.size()-l+i]) return 0;
    30     return 1;
    31 }
    32 int main(){
    33     cin>>a;cin>>b;
    34     Ford(i,min(a.size(),b.size()),1)
    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[100001];
     7 int dx[9]={0,1,-1,1,-1,1,-1,0,0},dy[9]={0,0,0,1,1,-1,-1,1,-1},h,t,n,m,x,y;
     8 char aa[101];
     9 bool b[101][101];
    10 int main(){
    11     cin>>n>>m>>y>>x;
    12     for (int i=m; i>=1; i--){
    13         cin>>aa;
    14         for (int j=0; j<n; j++)
    15             b[i][j+1]=aa[j]=='.'?0:1;   
    16     }
    17     h=0,t=1;
    18     a[1].x=x;
    19     a[1].y=y;
    20     a[1].nn=0;
    21     b[x][y]=1;
    22     do{
    23         h++;
    24         for (int i=1; i<=8; i++){
    25             x=a[h].x+dx[i];
    26             y=a[h].y+dy[i];
    27             if (x>0&&x<=m&&y>0&&y<=n&&!b[x][y]){
    28                 t++;
    29                 a[t].nn=a[h].nn+1;
    30                 a[t].x=x;
    31                 a[t].y=y;
    32                 b[x][y]=1;
    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[2501],n,m,s,e,x,y,z,a[2501][101][3],pp[100001],h,t;
     6 bool b[3001];
     7 int main(){
     8     cin>>n>>m>>s>>e;
     9     for (int i=1; i<=m; i++){
    10         scanf("%d%d%d",&x,&y,&z);
    11         a[x][++a[x][0][0]][1]=z;
    12         a[x][a[x][0][0]][2]=y;
    13         a[y][++a[y][0][0]][1]=z;
    14         a[y][a[y][0][0]][2]=x;
    15     }
    16     h=0,t=1;
    17     pp[1]=s;
    18     b[s]=1;
    19      
    20     memset(dis,127/3,sizeof(dis));
    21     dis[s]=0;
    22     do{
    23         h++;
    24         for (int i=1; i<=a[pp[h]][0][0]; i++)
    25             if (dis[a[pp[h]][i][2]]>dis[pp[h]]+a[pp[h]][i][1]){
    26                 dis[a[pp[h]][i][2]]=dis[pp[h]]+a[pp[h]][i][1];
    27                 if (!b[a[pp[h]][i][2]]){
    28                     t++;
    29                     pp[t]=a[pp[h]][i][2];
    30                     b[a[pp[h]][i][2]]=1;
    31                 }
    32             }
    33         b[pp[h]]=0;
    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[21];
    22 int n,v,ans;
    23 inline int in(){
    24     int x=0,f=1;
    25     char ch=getchar();
    26     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    27     while (ch>='0'&&ch<='9') x=x*10+ch-'0',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,1,n)
    36         a[i].v=in(),a[i].n=in();
    37     sort(a+1,a+n+1,cmp);
    38     Ford(i,n,1)
    39         if(a[i].v>v){
    40             n--;
    41             ans+=a[i].n;
    42         }
    43     while(1){
    44         int nt=0;
    45         Ford(i,n,1)
    46             while(a[i].v+nt<v&&a[i].n)
    47                     nt+=a[i].v,a[i].n--;
    48         For(i,1,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[1001];
    22 int n;
    23 int dfs(int k){
    24     a[a[k].lc].deep=a[a[k].rc].deep=a[k].deep+1;
    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=0,f=1;
    32     char ch=getchar();
    33     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    34     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    35     return x*f;
    36 }
    37 int main(){
    38     n=in();
    39     int x,y,z;
    40     For(i,1,n-1){
    41         x=in(),y=in(),z=in();
    42         a[x].lc=y,a[x].rc=z;
    43     }
    44     a[1].deep=1;
    45     printf("%d",dfs(1));
    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[10002],c[10001],s[10001],n,k;
    21 inline int in(){
    22     int x=0,f=1;
    23     char ch=getchar();
    24     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    25     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    26     return x*f;
    27 }
    28 int main(){
    29     n=in(),k=in();
    30     For(i,1,k)  s[i]=in(),c[i]=in();
    31     For(i,2,n) f[i]=-INF;
    32     For(i,1,n){
    33         bool b=0;
    34         For(j,1,k)
    35             if (s[j]==i){
    36                 f[i+c[j]]=max(f[i+c[j]],f[i]);
    37                 b=1;
    38             }
    39         if (!b) f[i+1]=max(f[i+1],f[i]+1);
    40     }
    41     printf("%d",f[n+1]);
    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[200001],b[200001];
    19 inline int in(){
    20     int x=0,f=1;
    21     char ch=getchar();
    22     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    23     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    24     return x*f;
    25 }
    26 int main(){
    27     n=in();
    28     For(i,1,n) a[i]=in();
    29     sort(a+1,a+n+1);
    30     int cnt=1;
    31     For(i,2,n)
    32         if (a[i]!=a[i-1]){
    33             printf("%d %d
    ",a[i-1],cnt);
    34             cnt=1;
    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[500001];
    20     zxy(){
    21         begin=1,l=1;
    22         v[1]=1;
    23     }
    24     void friend operator *(zxy &a,int b){
    25         For(i,a.begin,min(a.begin+20,a.l))
    26             a.v[i]*=b;
    27         For(i,a.begin,min(a.begin+20,a.l)){
    28             a.v[i+1]+=a.v[i]/10;            
    29             a.v[i]%=10;
    30             if(a.v[a.l+1])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=0,f=1;
    38     char ch=getchar();
    39     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    40     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    41     return x*f;
    42 }
    43 int main(){
    44     n=in(),k=in();
    45     For(i,1,n) ans*i;
    46     Ford(i,ans.begin+k-1,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[400001];
    22 int n,q;
    23 inline int in(){
    24     int x=0,f=1;
    25     char ch=getchar();
    26     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    27     while (ch>='0'&&ch<='9') x=x*10+ch-'0',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<<1,t,add);
    36     else update(mid+1,r,k<<1|1,t,add);
    37     tr[k].mi=min(tr[k<<1].mi,tr[k<<1|1].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<<1);
    43     if (a>mid) return query(mid+1,r,a,b,k<<1|1);
    44     return min(query(l,mid,a,mid,k<<1),query(mid+1,r,mid+1,b,k<<1|1));
    45 }
    46 int main(){
    47     n=in(),q=in();
    48     For(i,1,n) update(1,n,1,i,in());
    49     For(i,1,q){
    50         int x=in(),y=in();
    51         printf("%d ",query(1,n,x,y,1));
    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[400001];
    22 int n,q;
    23 inline int in(){
    24     int x=0,f=1;
    25     char ch=getchar();
    26     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    27     while (ch>='0'&&ch<='9') x=x*10+ch-'0',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<<1,t,add);
    36     else update(mid+1,r,k<<1|1,t,add);
    37     tr[k].mi=min(tr[k<<1].mi,tr[k<<1|1].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<<1);
    43     if (a>mid) return query(mid+1,r,a,b,k<<1|1);
    44     return min(query(l,mid,a,mid,k<<1),query(mid+1,r,mid+1,b,k<<1|1));
    45 }
    46 int main(){
    47     n=in(),q=in();
    48     For(i,1,n) update(1,n,1,i,in());
    49     For(i,1,q){
    50         int k=in(),x=in(),y=in();
    51         if (!(k^1))
    52             printf("%d ",query(1,n,x,y,1));
    53         else update(1,n,1,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[2001];
    20     void clear(){
    21         l=0;
    22         mem(v,0);
    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,1,c.l) c.v[i]=a.v[i]+b.v[i];
    28         For(i,1,c.l) c.v[i+1]+=c.v[i]/10,c.v[i]%=10;
    29         if (c.v[c.l+1]) ++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,1,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+1]--;
    40                 c.v[i]=a.v[i]+10-b.v[i];
    41             }
    42         while(!c.v[c.l]&&c.l) c.l--;
    43         return c;
    44     }
    45 }ans,tmp[260];
    46 char a[260],ch[260];
    47 int cnt;
    48 inline int in(){
    49     int x=0,f=1;
    50     char ch=getchar();
    51     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    52     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    53     return x*f;
    54 }
    55 int main(){
    56     scanf("%s",a);
    57     cnt=1;
    58     Ford(i,strlen(a)-1,0)
    59         if (a[i]!='+'&&a[i]!='-') tmp[cnt].v[++tmp[cnt].l]=a[i]-'0';
    60         else ch[cnt++]=a[i];
    61     ans=tmp[cnt];
    62     Ford(i,cnt-1,1)
    63         if (ch[i]=='+') ans=ans+tmp[i]; else ans=ans-tmp[i];
    64     Ford(i,ans.l,1) 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=0,f=1;
    25     char ch=getchar();
    26     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    27     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    28     return x*f;
    29 }
    30 int inline getlevel(char x){
    31     if (x=='+'||x=='-') return 1;
    32     if (x=='*'||x=='/') return 2;
    33     if (x=='^') return 3;
    34     if (x=='(') return 100;
    35     if (x=='#') return -INF;
    36     return -100;
    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=1;
    47     for(int i=1;i<=b;i++)
    48         ans*=a;
    49     return ans;
    50 }
    51 int main(){
    52     cin>>s;
    53     For(i,0,s.size()-1)
    54         if (s[i]=='(') cnt++;
    55         else if (s[i]==')') --cnt;
    56     while(cnt>0) cnt--,s=s+")";
    57     while(cnt<0) cnt++,s="("+s;
    58     s=s+"#";
    59     ch.push('#');
    60     num.push(0);
    61     int i=0;
    62     while(s[i]!='#'||ch.top()!='#'){
    63         if (s[i]<'0'||s[i]>'9'){
    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=0;
    74                 while(s[i]>='0'&&s[i]<='9') x=x*10+s[i++]-'0';
    75                 num.push(x);
    76         }
    77     }
    78     cout<<num.top();
    79 }
    1042&1043

    1044:递推

    #include<cstdio>
    #include<iostream>
    #define For(i,a,b) for (int i=1; i<=a; i+=b)
    #define in(a) scanf("%d",&a)
    using namespace std;
    int n,f[26][26],a[26][26],ans=-0x7ffffff;
    int main(){
        in(n);
        For(i,n,1)
            For(j,i,1)
                in(a[i][j]);
        f[1][1]=a[1][1];
        for (int i=2; i<=n; i++)
            For(j,i,1){
                f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j];
            }
        For(i,n,1) ans=max(ans,f[n][i]);
        cout<<ans;
    }
    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[101][101][101],a[101],n,num;
    19 inline int in(){
    20     int x=0,f=1;
    21     char ch=getchar();
    22     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    23     while (ch>='0'&&ch<='9') x=x*10+ch-'0',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<0) return -1;    
    28     if (f[l][r][k]>0) return f[l][r][k];
    29     if (r-l==k){
    30         f[l][r][k]=1;
    31         For(i,l,r)
    32             f[l][r][k]*=a[i];
    33         return f[l][r][k];
    34     }
    35     For(i,l,r-1)
    36         For(j,0,k)
    37             f[l][r][k]=max(f[l][r][k],max(dp(l,i,j)+dp(i+1,r,k-j),dp(l,i,j)*dp(i+1,r,k-j-1)));
    38     return f[l][r][k];
    39 }
    40 int main(){
    41     n=in(),num=in();
    42     mem(f,(-1));
    43     For(i,1,n) f[i][i][0]=a[i]=in();
    44     printf("%d",dp(1,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=0,f=1;
    23     char ch=getchar();
    24     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    25     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    26     return x*f;
    27 }
    28 int dp(){
    29     mem(f,127/3);
    30     f[0][0]=0;
    31     For(i,1,n) f[i][0]=i*k;
    32     For(i,1,m) f[0][i]=i*k;
    33     For(i,1,n)
    34         For(j,1,m)
    35             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));
    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[1001][1001],n,a[1001],b[1001];
    19 inline int in(){
    20     int x=0,f=1;
    21     char ch=getchar();
    22     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    23     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    24     return x*f;
    25 }
    26 inline int price(int x,int y){
    27     if (a[x]>b[y]) return 200;
    28     if (a[x]<b[y]) return (-200);
    29     return 0;
    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+1,r)+price(l,n-r+l),dp(l,r-1)+price(r,n-r+l));
    39     return f[l][r];
    40 }
    41 int main(){
    42     mem(f,-127/2);
    43     n=in();
    44     For(i,1,n) a[i]=in();
    45     For(i,1,n) b[i]=in();
    46     sort(a+1,a+n+1,greater<int>());
    47     sort(b+1,b+n+1,greater<int>());
    48     printf("%d",dp(1,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[5001],a[5001],n,ans;
    19 inline int in(){
    20     int x=0,f=1;
    21     char ch=getchar();
    22     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    23     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    24     return x*f;
    25 }
    26 int main(){
    27     n=in();
    28     For(i,1,n) a[i]=in();
    29     f[0]=0;
    30     For(i,1,n)
    31         For(j,0,i-1)
    32             if (a[i]>=a[j]){
    33                 f[i]=max(f[i],f[j]+1);
    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[2001][2001];
    19 string a,b;
    20 inline int in(){
    21     int x=0,f=1;
    22     char ch=getchar();
    23     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    24     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    25     return x*f;
    26 }
    27 inline int dp(int i,int j){
    28     if (i<0||j<0) return 0;
    29     if (f[i][j]) return f[i][j];
    30     if (a[i]==b[j]) return f[i][j]=dp(i-1,j-1)+1;
    31     return f[i][j]=max(dp(i-1,j),dp(i,j-1));
    32 }
    33 int main(){
    34     cin>>a>>b;
    35     printf("%d",dp(a.size()-1,b.size()-1));
    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[301];
    21 int n,f[301][301],m,ans;
    22 inline int in(){
    23     int x=0,f=1;
    24     char ch=getchar();
    25     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    26     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    27     return x*f;
    28 }
    29 inline int dp(int k,int t){
    30     if (!(k&&t)) return 0;
    31     if (f[k][t]) return f[k][t];
    32     f[k][t]=tr[k].v;
    33     For(i,1,t)
    34         f[k][t]=max(f[k][t],dp(tr[k].son,t-i)+dp(tr[k].bra,i-1)+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,1,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[0][0]=0;
    47     tr[0].v=0;
    48     printf("%d",dp(tr[0].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[6001][2],fa[6001];
    19 bool b[6001];
    20 inline int in(){
    21     int x=0,f=1;
    22     char ch=getchar();
    23     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    24     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    25     return x*f;
    26 }
    27 inline void treedp(int k){
    28     b[k]=0;
    29     For(i,1,n)
    30         if (b[i]&&fa[i]==k){
    31             treedp(i);
    32             f[k][1]+=f[i][0];
    33             f[k][0]+=max(f[i][1],f[i][0]);
    34         }
    35 }
    36 int main(){
    37     n=in();
    38     For(i,1,n) f[i][1]=in();
    39     For(i,1,n-1){
    40         int x=in(),y=in();
    41         fa[x]=y;
    42         b[x]=1;
    43     }
    44     int s;
    45     For(i,1,n) if (!b[i]){
    46         s=i;
    47         break;
    48     }
    49     treedp(s);
    50     printf("%d",max(f[s][0],f[s][1]));
    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=0,f=1;
    22     char ch=getchar();
    23     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    24     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    25     return x*f;
    26 }
    27 inline bool digit(char k){
    28     return k>='0'&&k<='9';
    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=0;
    39     if (p3-1){
    40         if (p1==3) For(i,a+1,b-1)
    41                         Ford(j,1,p2)
    42                             putchar('*');
    43         if (p1==2&&alpha(a)) 
    44             for(char i=b-1; i>a; i--)
    45                 Ford(j,1,p2)
    46                     putchar(i-'a'+'A');
    47         if (p1==1||(p1==2&&digit(a))) for(char i=b-1; i>a; i--)
    48                     Ford(j,1,p2)
    49                         putchar(i);
    50         return;
    51     }
    52     if (p1==3) For(i,a+1,b-1)
    53                         Ford(j,1,p2)
    54                             putchar('*');
    55     if (p1==2&&alpha(a)) 
    56         For(i,a+1,b-1)
    57             Ford(j,1,p2)
    58                 putchar(i-'a'+'A');
    59     if (p1==1) For(i,a+1,b-1)
    60                 Ford(j,1,p2)
    61                     putchar(i);
    62 }
    63 int main(){
    64     p1=in(),p2=in(),p3=in();
    65     cin>>a;
    66     Ford(i,0,a.size()-1)
    67         if (a[i]!='-'||i==0) putchar(a[i]);
    68         else get_(a[i-1],a[i+1]);
    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[301][301],n,s[301];
    19 inline int in(){
    20     int x=0,f=1;
    21     char ch=getchar();
    22     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    23     while (ch>='0'&&ch<='9') x=x*10+ch-'0',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 0;
    29     For(i,l,r-1) f[l][r]=min(dp(l,i)+dp(i+1,r)+s[r]-s[l-1],f[l][r]);
    30     return f[l][r];
    31 }
    32 int main(){
    33     n=in();
    34     For(i,1,n) s[i]=s[i-1]+in();
    35     mem(f,127/3)
    36     printf("%d",dp(1,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[205][205],a[205],n,ans;
    19 inline int in(){
    20     int x=0,f=1;
    21     char ch=getchar();
    22     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    23     while (ch>='0'&&ch<='9') x=x*10+ch-'0',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 0;
    29     For(i,l,r-1) f[l][r]=max(f[l][r],dp(l,i)+dp(i+1,r)+a[l]*a[i+1]*a[r+1]);
    30     return f[l][r];
    31 }
    32 int main(){
    33     n=in();
    34     For(i,1,n) a[i]=in();
    35     For(i,n+1,2*n) a[i]=a[i-n];
    36     For(i,1,n)
    37         ans=max(ans,dp(i,i+n-1));
    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[61];
    22 int n,m,f[3201];
    23 inline int in(){
    24     int x=0,f=1;
    25     char ch=getchar();
    26     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    27     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    28     return x*f;
    29 }
    30 int main(){
    31     m=in(),n=in();
    32     m/=10;
    33     For(i,1,n){
    34         tr[i].v=in();
    35         tr[i].v/=10;
    36         tr[i].imp=in();
    37         int y=in();
    38         if (y){
    39             tr[i].pp=1;
    40             if (tr[y].ls) tr[y].rs=i;
    41             else tr[y].ls=i;
    42         }
    43     }
    44     tr[0].v=tr[0].imp=0;
    45     For(i,1,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]*10);
    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[401];
    21 int use[21][21],n,m,cnt[21],t[21][21],mac[21][21],mact[21],ans,end[21];
    22 bool used[21][401];
    23 inline int in(){
    24     int x=0,f=1;
    25     char ch=getchar();
    26     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    27     while (ch>='0'&&ch<='9') x=x*10+ch-'0',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 0;
    33     return 1;
    34 }
    35 int main(){
    36     m=in(),n=in();
    37     For(i,1,m*n) order[i].no=in(),order[i].no2=++cnt[order[i].no];
    38     For(i,1,n)
    39         For(j,1,m) mac[i][j]=in();
    40     For(i,1,n)
    41         For(j,1,m) t[i][j]=in();
    42     For(i,1,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-1)){
    47                 For(k,j,j+tim-1)
    48                     used[macc][k]=1;
    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[101][101],n,s[101],m;
    19 inline int in(){
    20     int x=0,f=1;
    21     char ch=getchar();
    22     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    23     while (ch>='0'&&ch<='9') x=x*10+ch-'0',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 0;
    29     For(i,l,r-1) f[l][r]=min(dpmi(l,i)+dpmi(i+1,r)+s[r]-s[l-1],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 0;
    35     For(i,l,r-1) f[l][r]=max(dpma(l,i)+dpma(i+1,r)+s[r]-s[l-1],f[l][r]);
    36     return f[l][r];
    37 }
    38 int main(){
    39     n=in();m=in();
    40     For(i,1,n) s[i]=s[i-1]+in();
    41     int ma=dpma(1,n);
    42     mem(f,127/3);
    43     int mi=dpmi(1,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[200001],b[200001],h,t;
    19 inline int in(){
    20     int x=0,f=1;
    21     char ch=getchar();
    22     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    23     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    24     return x*f;
    25 }
    26 int main(){
    27     n=in(),m=in();
    28     For(i,1,n) a[i]=in();
    29     int cnt=0,ans=n+1;
    30     h=1,t=0;
    31     while(h<=n-m+1&&t<=n){
    32         while(cnt!=m&&t<=n)
    33             cnt=b[a[++t]]?cnt:cnt+1,b[a[t]]++;
    34         if (t-h+1<ans) ans=t-h+1;
    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=1; i<=12; i++){
     8         n+=300;
     9         scanf("%d",&x);
    10         n-=x;
    11         if (n<0){
    12             cout<<-i;
    13             exit(0);
    14         }
    15         c+=n/100*120;
    16         n%=100;
    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[25001],hp,n,ans;
    20 void in(int x){
    21     heap[++hp]=x;
    22     push_heap(heap+1,heap+hp+1,greater<int>());
    23 }
    24 int out(){
    25     pop_heap(heap+1,heap+hp+1,greater<int>());
    26     return heap[hp--];
    27 }
    28 int main(){
    29     cin>>n;
    30     for (int i=1; i<=n; i++){
    31         int x;
    32         scanf("%d",&x);
    33         in(x);
    34     }
    35     while(hp!=1){
    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[102],n,a[102],dow[102],ans=0x7fffffff;
    19 inline int in(){
    20     int x=0,f=1;
    21     char ch=getchar();
    22     while (ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
    23     while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    24     return x*f;
    25 }
    26 int main(){
    27     n=in();    
    28     For(i,1,n) a[i]=in();
    29     For(i,1,n)
    30         For(j,0,i-1)
    31             if (a[i]>a[j])
    32                 upp[i]=max(upp[i],upp[j]+1);
    33     Ford(i,n,1)
    34         Ford(j,n+1,i+1)
    35             if (a[i]>a[j])
    36                 dow[i]=max(dow[i],dow[j]+1);
    37     For(i,1,n)
    38         ans=min(ans,n-upp[i]-dow[i]+1);
    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[26][26],ans=-32767;bool f[26][26][100];
     7 int main(){
     8     in(n);
     9     For(i,n,1)
    10         For(j,i,1)
    11             in(a[i][j]);
    12     f[1][1][a[1][1]%100]=1;
    13     for (int i=2; i<=n; i++)
    14         For(j,i,1){
    15             for (int k=0; k<=99; k++) if (f[i-1][j][k]) f[i][j][(k+a[i][j])%100]=1;
    16             for (int k=0; k<=99; k++) if (f[i-1][j-1][k]) f[i][j][(k+a[i][j])%100]=1;
    17         }
    18     For(j,n,1)  
    19         for (int i=99; i>=0; 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[26][26],a[26][26],ans=-0x7ffffff;
     7 int main(){
     8     in(n);
     9     For(i,1,n)
    10         For(j,1,i)
    11             in(a[i][j]);
    12     f[1][1]=a[1][1];
    13     For(i,2,n/2)
    14         For(j,1,i)
    15             f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j];
    16     For(i,1,n/2-1) f[n/2][i]=0;
    17     For(i,n/2+1,n)
    18         For(j,n/2,i)
    19             f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j];
    20     For(i,n/2,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[26][26],a[26][26],ans=-0x7ffffff,x,y;
     7 int main(){
     8     in(n);
     9     For(i,1,n)
    10         For(j,1,i)
    11             in(a[i][j]);
    12     in(x);in(y);
    13     f[1][1]=a[1][1];
    14     For(i,2,x)
    15         For(j,1,i)
    16             f[i][j]=max(f[i-1][j],f[i-1][j-1])+a[i][j];
    17     For(i,1,x)if (i!=y) f[x][i]=-2147483647;
    18     For(i,x+1,n)
    19         For(j,y,i)
    20             f[i][j]=max(f[i-1][j],f[i-1][j-1])+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.

  • 相关阅读:
    【CH6801】棋盘覆盖
    【模板】二分图匹配
    【POJ3683】Priest John's Busiest Day
    【Asia Yokohama Regional Contest 2018】Arithmetic Progressions
    【POJ2230】Watchcow
    【CF263D】Cycle in Graph
    【CF131D】Subway
    【洛谷P2709】小B的询问
    【模板】2-SAT
    【模板】矩阵快速幂
  • 原文地址:https://www.cnblogs.com/Melacau/p/tyvj.html
Copyright © 2011-2022 走看看