CF round 336 div2 总结

来源:互联网 发布:淘宝网站推广软件 编辑:程序博客网 时间:2024/05/29 15:11

A

模拟或者取最大值均可

struct node{    int x,y;    bool operator < (const node &b)const{        return x<b.x;    }}s[10001];int main(){    int n,m;cin>>n>>m;int ans=0;    for(int i=1;i<=n;i++){        //cin>>s[i].x>>s[i].y;        int x,y;cin>>x>>y;        ans=max(ans,max(y,m-x)+x);    }    cout<<ans<<endl;    //sort(s+1,s+n+1);    /*int now=m,t=0,ans=0;    for(int i=n;i>=1;i--){        t=max(s[i].y,t+now-s[i].x);        now=s[i].x;    }    cout<<t<<endl;*/}
B

没开longlong和数组没开够。。wa了2发

#define ll long longll num[2][200010];char s[200010];char c[200010];ll S,T;ll ans;void pre(){    for(ll i=1;i<=S;i++){        num[0][i]=num[0][i-1];        num[1][i]=num[1][i-1];        if(s[i]-'0'==0) num[0][i]++;        else num[1][i]++;    } }void work(){    for(ll i=1;i<=T;i++){        ll l=1,r=S;        r=min(r,i);l=max(l,i+S-T);        ans+=(num[0][r]-num[0][l-1])*abs(0-(c[i]-'0'));        ans+=(num[1][r]-num[1][l-1])*abs(1-(c[i]-'0'));    }}void print(){    cout<<ans;}int main(){    scanf("%s%s",s+1,c+1);    S=strlen(s+1),T=strlen(c+1);    pre();work();print();}


C

二分+判断,开始读错题辣然后wa了好久

最后还有,题目中没有保证读入有序啊!

#define inf 1000000000ll#define ll long longusing namespace std;struct node{    ll x;ll y;}t[1000010];ll n,a[1000010],b[1000010],s[1000010],ans=inf<<2ll;bool comp(const node &a,const node &b){    return a.x<b.x;}void init(){    cin>>n;    for(ll i=1;i<=n;i++)R(t[i].x),R(t[i].y);    sort(t+1,t+n+1,comp);    for(ll i=1;i<=n;i++)a[i]=t[i].x,b[i]=t[i].y;    }void work(){    a[0]=-inf;s[0]=0;    for(ll i=1;i<=n;i++){        ll head=0,tail=i;        while(head!=tail){            ll mid=(head+tail)>>1;            if(a[i]-a[mid]>b[i]){                head=mid+1;            }            else{                tail=mid;            }        }        while(a[i]-a[head]<=b[i] && head!=0){                        head--;                    }        while(a[i]-a[head+1]>b[i] && head+1<i && head!=i){                        head++;                    }        s[i]=s[head]+i-head-1;    }    }void print(){    for(ll i=1;i<=n;i++){        ans=min(ans,n-i+s[i]);    }    cout<<ans;}int main(){    init();work();print();    }
D

n^3区间dp

dp[i][j] 意为i到j最少用多少串

枚举断点,转移就好

因为把最优解覆盖了又WA14

int dp[505][505]; int a[505],n;int update(int sta,int end){    if(sta==end)return 1;    if(sta>end)return 0;    if(a[sta]==a[end])dp[sta][end]=min(dp[sta][end],dp[sta+1][end-1]);    if(a[sta]==a[end] && sta==end-1)dp[sta][end]=1;    dp[sta][end]=min(dp[sta][end],dp[sta+1][end]+1);    dp[sta][end]=min(dp[sta][end],dp[sta][end-1]+1);    return dp[sta][end];}int main(){     cin>>n;    for(int i=1;i<=n;i++){        cin>>a[i];        dp[i][i]=1;    }    for(int i=1;i<=n;i++){        for(int j=i+1;j<=n;j++){            dp[i][j]=inf;        }    }    for(int i=1;i<=n-1;i++){        for(int j=1;j<=n-i;j++){            int sta=j,end=i+j;            update(sta,end);            for(int k=sta;k<=end-1;k++){                dp[sta][end]=min(dp[sta][end],update(sta,k)+update(k+1,end));            }        }    }    cout<<dp[1][n]<<endl;}


因为加了很多头文件和各种数据结构,就只发有用的部分了


1 0