zoukankan      html  css  js  c++  java
  • Codeforce Round #545(Div2)

    B.一开始用贪心做,后来贪着贪着分情况乱了emmm,崩了

      然后根据两个方程和四个未知数,枚举两个未知数,求方程组的解

      注意解尊在的条件(范围),以及枚举的未知数是否合适(算其他未知数的时候最好不要)出现除一个数,否则出现不能整除的情况会发生错误

     1 #include<bits/stdc++.h>
     2 #define pii pair<int,int>
     3 using namespace std;
     4 const int maxn=5e3+5;
     5 struct node
     6 {
     7     int id,first,second;
     8 }art[maxn];
     9 int n;
    10 map<pii,int>m;
    11 bool cmp(node a,node b)
    12 {
    13     int sa=a.first+a.second,sb=b.first+b.second;
    14     if(sa==1 && sb==1) return a.first<b.first;
    15     return sa<sb;
    16 }
    17 int main()
    18 {
    19     cin>>n;string t,tt;cin>>t>>tt;
    20     m[{0,1}]=0,m[{1,1}]=0,m[{1,0}]=0,m[{0,0}]=0;
    21     for(int i=1;i<=n;++i)
    22     {
    23         art[i].first=t[i-1]-'0';
    24         art[i].second=tt[i-1]-'0';
    25         ++m[{art[i].first,art[i].second}];
    26         art[i].id=i;
    27     }
    28     sort(art+1,art+1+n,cmp);
    29     //cout<<endl;
    30     static int s00,s11,s01,s10; s00=s11=s01=s10=-1;
    31     for(int i=1;i<=n;++i)
    32     {
    33         if(s00<0 && art[i].first==0 && art[i].second==0) s00=i;
    34         if(s01<0 && art[i].first==0 && art[i].second==1) s01=i;
    35         if(s10<0 && art[i].first==1 && art[i].second==0) s10=i;
    36         if(s11<0 && art[i].first==1 && art[i].second==1) s11=i;
    37     }
    38     int na=m[{0,0}],nb=m[{0,1}],nc=m[{1,0}],nd=m[{1,1}];
    39     /*
    40     for(int a=0;a<=na;++a)
    41     {
    42         for(int d=0;d<=nd;++d)
    43         {
    44             if(a-d==n/2-nd-nb)
    45             {
    46                 int b=(nb+nd-2*d)/2;      //最开始的时候枚举a,d求b,c   但是这里会出现一个问题,就是b=(......)/2,如果(......)是奇数,机会出现错误,所以换了枚举方式
    47                 int c=n/2-a-b-d;
    48                 if(b<0 || c<0 || b>nb || c>nc) continue;
    49                 if(a)for(int i=s00,j=1;j<=a;++j,++i) cout<<art[i].id<<" ";
    50                 if(b)for(int i=s01,j=1;j<=b;++j,++i) cout<<art[i].id<<" ";
    51                 if(c)for(int i=s10,j=1;j<=c;++j,++i) cout<<art[i].id<<" ";
    52                 if(d)for(int i=s11,j=1;j<=d;++j,++i) cout<<art[i].id<<" ";
    53                 return 0;
    54             }
    55         }
    56     }*/
    57     for(int b=0;b<=nb;++b)
    58     {
    59         for(int d=0;d<=nd;++d)
    60         {
    61             int c=nb+nd-b-2*d;
    62             int a=n/2-b-c-d;    //先把a,c算出来,再带入式子看看对不对,注意带进去的式子,不能是恒等式,如果是恒等式,肯定是错的(原因不赘述)
    63             if(a-d==n/2-nb-nd)
    64             {
    65                 if(a<0 || c<0 || a>na || c>nc) continue;
    66                 if(a)for(int i=s00,j=1;j<=a;++j,++i) cout<<art[i].id<<" ";
    67                 if(b)for(int i=s01,j=1;j<=b;++j,++i) cout<<art[i].id<<" ";
    68                 if(c)for(int i=s10,j=1;j<=c;++j,++i) cout<<art[i].id<<" ";
    69                 if(d)for(int i=s11,j=1;j<=d;++j,++i) cout<<art[i].id<<" ";
    70                 return 0;
    71             }
    72         }
    73     }
    74     cout<<-1;return 0;
    75 }
    #include<bits/stdc++.h>
    #definepii pair<int,int>
    using namespace std;
    const int maxn=5e3+5;
    struct node
    {
    int id,first,second;
    }art[maxn];
    int n;
    map<pii,int>m;
    bool cmp(node a,node b)
    {
    int sa=a.first+a.second,sb=b.first+b.second;
    if(sa==1 && sb==1) return a.first<b.first;
    return sa<sb;
    }
    int main()
    {
    cin>>n;string t,tt;cin>>t>>tt;
    m[{0,1}]=0,m[{1,1}]=0,m[{1,0}]=0,m[{0,0}]=0;
    for(int i=1;i<=n;++i)
    {
    art[i].first=t[i-1]-'0';
    art[i].second=tt[i-1]-'0';
    ++m[{art[i].first,art[i].second}];
    art[i].id=i;
    }
    sort(art+1,art+1+n,cmp);
    //cout<<endl;
    static int s00,s11,s01,s10; s00=s11=s01=s10=-1;
    for(int i=1;i<=n;++i)
    {
    if(s00<0 && art[i].first==0 && art[i].second==0) s00=i;
    if(s01<0 && art[i].first==0 && art[i].second==1) s01=i;
    if(s10<0 && art[i].first==1 && art[i].second==0) s10=i;
    if(s11<0 && art[i].first==1 && art[i].second==1) s11=i;
    }
    int na=m[{0,0}],nb=m[{0,1}],nc=m[{1,0}],nd=m[{1,1}];
    /*
    for(int a=0;a<=na;++a)
    {
    for(int d=0;d<=nd;++d)
    {
    if(a-d==n/2-nd-nb)
    {
    int b=(nb+nd-2*d)/2; //最开始的时候枚举a,d求b,c 但是这里会出现一个问题,就是b=(......)/2,如果(......)是奇数,机会出现错误,所以换了枚举方式
    int c=n/2-a-b-d;
    if(b<0 || c<0 || b>nb || c>nc) continue;
    if(a)for(int i=s00,j=1;j<=a;++j,++i) cout<<art[i].id<<" ";
    if(b)for(int i=s01,j=1;j<=b;++j,++i) cout<<art[i].id<<" ";
    if(c)for(int i=s10,j=1;j<=c;++j,++i) cout<<art[i].id<<" ";
    if(d)for(int i=s11,j=1;j<=d;++j,++i) cout<<art[i].id<<" ";
    return 0;
    }
    }
    }*/
    for(int b=0;b<=nb;++b)
    {
    for(int d=0;d<=nd;++d)
    {
    int c=nb+nd-b-2*d;
    int a=n/2-b-c-d; //先把a,c算出来,再带入式子看看对不对,注意带进去的式子,不能是恒等式,如果是恒等式,肯定是错的(原因不赘述)
    if(a-d==n/2-nb-nd)
    {
    if(a<0 || c<0 || a>na || c>nc) continue;
    if(a)for(int i=s00,j=1;j<=a;++j,++i) cout<<art[i].id<<" ";
    if(b)for(int i=s01,j=1;j<=b;++j,++i) cout<<art[i].id<<" ";
    if(c)for(int i=s10,j=1;j<=c;++j,++i) cout<<art[i].id<<" ";
    if(d)for(int i=s11,j=1;j<=d;++j,++i) cout<<art[i].id<<" ";
    return 0;
    }
    }
    }
    cout<<-1;return 0;
    }
  • 相关阅读:
    根据坐标点画图形
    js 解析geojson格式
    devexpress 安装
    DataTable 获取列名
    ADO.NET 注册
    css:outline
    javascript函数sort
    引用类型-2015/10/06
    2015-11-02-js
    jquery
  • 原文地址:https://www.cnblogs.com/codeoosacm/p/10603056.html
Copyright © 2011-2022 走看看