Codeforces Round #612题解

A题

只需要找到A中后面跟的最长的p串是几个即可

#include<iostream>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<cstdio>
using namespace std;
int main(){
    int t;
        cin>>t; 
        string s;
        int n;
        int i;
        while(t--){
        cin>>n;
        cin>>s;
        int ans=0;
        int cnt=0;
        for(i=n-1;i>=0;i--){
            if(s[i]=='P')
            cnt++;
            else{
                ans=max(ans,cnt);
                cnt=0;
            }
        }
        cout<<ans<<endl;
        
    }
} 
View Code

B题

关键点是发现如果确定两个,那么第三个即可推出,看题要仔细,要认真发掘题目性质

#include<iostream>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<cstdio>
using namespace std;
const int N=10010;
map<string,int> m1;
string s[N];
int main(){
    int i,j;
    int n,k;
    cin>>n>>k;
    for(i=0;i<n;i++){
        cin>>s[i];
        m1[s[i]]+=1;
    }
    int num=0;
    for(i=0;i<n;i++){
        for(j=i+1;j<n;j++){
            int t;
            string res="";
            for(t=0;t<k;t++){
                if(s[i][t]==s[j][t])
                res+=s[i][t];
                else{
                     res+=(236-s[i][t]-s[j][t]);
                }
            }
            if(m1[res])
            num++;
        }
    }
    cout<<num/3<<endl;
}
 
View Code

C题

动态规划,常用的在前i个中求最小或最大,根据经验,可以按照题目性质来列状态,例如本题可以观察得出,有奇数偶数的区别,所以可以将这两个设为两维,另需添一维表述当前位置的状态

此类动态规划题常见且套路清晰。

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
#include<cstdio>
using namespace std;
const int N=105;
int f[N][N][N][2];
int a[N];
int main(){
    int i;
    int n;
    cin>>n;
    for(i=1;i<=n;i++)
    cin>>a[i];
    memset(f,0x3f,sizeof f);
    int num1,num2;
    if(n%2){
        num1=n/2+1;
        num2=n/2;
    }
    else{
        num1=num2=n/2;
    }
    int j,k;
    f[0][0][0][0]=f[0][0][0][1]=0;
    for(i=1;i<=n;i++){
       for(j=0;j<=num1;j++){
         for(k=0;k<=num2;k++){
             if(a[i]==0){
                 if(k>0) 
                 f[i][j][k][0]=min(f[i-1][j][k-1][0],f[i-1][j][k-1][1]+1);
                 if(j>0) 
                 f[i][j][k][1]=min(f[i-1][j-1][k][1],f[i-1][j-1][k][0]+1);
             }
             else{
                 if(a[i]%2){
                     if(j>0) f[i][j][k][1]=min(f[i-1][j-1][k][1],f[i-1][j-1][k][0]+1);
                 }
                 else{
                     if(k>0) f[i][j][k][0]=min(f[i-1][j][k-1][0],f[i-1][j][k-1][1]+1);
                 }
             }
         }    
       }
    } 
    cout<<min(f[n][num1][num2][1],f[n][num1][num2][0])<<endl;
}
 
 
View Code

D题--待补

posted @ 2020-01-12 21:28  朝暮不思  阅读(175)  评论(0编辑  收藏  举报