小马哥的超级盐水

https://www.nowcoder.com/acm/contest/94/K
牛客上的一道题
哇~做不来,私信了问了一哈 衣白衫如初 这位童鞋,没想到竟然回复我了,再次感谢呀~~~
https://www.zybuluo.com/359084415/note/1102485这是 衣白衫如初 写滴题解~
题意:给n杯不同浓度的盐水,问有几种组合能够弄出这个浓度的盐水?

思路:
n最大35,暴力一哈是2^35种情况,这样不行
但是,如果把它分成两坨,一坨暴力的话差不多2^18这样才20w+,就阔以暴力~
左边遍历一次,然后把右边那坨排个序,二分来找答案,
我没看懂这位童鞋怎么暴力的,都没有搜索就暴力出来了0.0,反正我是用dfs来搜的,最后减1是减去左边是0,右边也是0的情况

#include"iostream"
#include"algorithm"
#include"vector"
using namespace std;
int N,X,Y;
vector<int>v[2];
vector<int>aa,bb;
void dfs1(int all,int ceng,int val)
{
    if(ceng==all)
    {
        aa.push_back(val);
        return ;
    }
    dfs1(all,ceng+1,val+v[0][ceng]);
    dfs1(all,ceng+1,val);
}
void dfs2(int all,int ceng,int val)
{
    if(ceng==all)
    {
        bb.push_back(val);
        return ;
    }
    dfs2(all,ceng+1,val+v[1][ceng]);
    dfs2(all,ceng+1,val);
}


int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        v[0].clear();
        v[1].clear();
        aa.clear();
        bb.clear();
        cin>>N>>X>>Y;
        for(int i=1;i<=N;i++)
        {
            int a,b;
            cin>>a>>b;
            int t=a*Y-b*X;//大于0说明浓度比标准的大,反之小
            v[i%2].push_back(t);
//            v[0].push_back(t);
        }

        dfs1(v[0].size(),0,0);
        dfs2(v[1].size(),0,0);
        sort(bb.begin(),bb.end());
        long long ans=0;
        for(int i=0;i<aa.size();i++)
        {
            int posl=lower_bound(bb.begin(),bb.end(),-aa[i])-bb.begin();
            int posr=upper_bound(bb.begin(),bb.end(),-aa[i])-bb.begin();
            ans+=posr-posl;
        }
        //左边右边都是0的情况不要,所以减1
        cout<<ans-1<<endl;
    }
}

猜你喜欢

转载自blog.csdn.net/swustlpf/article/details/79882656
今日推荐