• 集训第四周(高效算法设计)H题 (贪心)


    Description

    Download as PDF
     
    Most financial institutions had become insolvent during financial crisis and went bankrupt or were bought by larger institutions, usually by banks. By the end of financial crisis of all the financial institutions only two banks still continue to operate. Financial markets had remained closed throughout the crisis and now regulators are gradually opening them. To prevent speculation and to gradually ramp up trading they will initially allow trading in only one financial instrument and the volume of trading will be limited to i<tex2html_verbatim_mark> contracts for i<tex2html_verbatim_mark> -th minute of market operation. Two banks had decided to cooperate with the government to kick-start the market operation. The boards of directors had agreed on trading volume for each minute of this first trading session. One bank will be buying ai<tex2html_verbatim_mark> contracts ( 1$ le$ai$ le$i<tex2html_verbatim_mark> ) during i<tex2html_verbatim_mark> -th minute ( 1$ le$i$ le$n<tex2html_verbatim_mark> ), while the other one will be selling. They do not really care whether to buy or to sell, and the outside observer will only see the volume ai<tex2html_verbatim_mark> of contracts traded per minute. However, they do not want to take any extra risk and want to have no position in the contract by the end of the trading session. Thus, if we define bi = 1<tex2html_verbatim_mark> when the first bank is buying and bi = - 1<tex2html_verbatim_mark> when the second one is buying (and the first one is selling), then the requirement for the trading session is that $ sum_{{i=1}}^{{n}}$aibi = 0<tex2html_verbatim_mark> . Your lucky team of three still works in the data center (due to the crisis, banks now share the data center and its personnel) and your task is to find such bi<tex2html_verbatim_mark> or to report that this is impossible.

    Input 

    The input file contains several test cases, each of them as described below. The first line of the input contains the single integer number n<tex2html_verbatim_mark>( 1$ le$n$ le$100 000<tex2html_verbatim_mark> ). The second line of the input contains n<tex2html_verbatim_mark> integer numbers -- ai<tex2html_verbatim_mark> ( 1$ le$ai$ le$i<tex2html_verbatim_mark> ).

    Output 

    For each test case, the first line of the output must contain `` Yes'' if the trading session with specified volumes is possible and `` No'' otherwise. In the former option a second line must contain n<tex2html_verbatim_mark> numbers -- bi<tex2html_verbatim_mark> .

    Sample Input 

    4
    1 2 3 3
    4
    1 2 3 4
    

    Sample Output 

    No
    Yes
    1 -1 -1 1

    给你一个数组,选择其中的一半的数变成负数,然后这个数组的和为0
    首先来判断一下NO的情况,如果这个数组的和是一个奇数的话,那么你无论怎么选都不会有结果,然后如果你数组长度为1,那么就没得选了。
    YES该怎么做?先从大到小排序,然后一路加下去(使和大于数组和一半的不能加),如果刚好和等于数组和的一半,那么你选择的那些数就是应该乘以-1的数了

    #include"iostream"
    #include"algorithm"
    using namespace std;
    
    const int maxn=100000+10;
    
    int  f[maxn];
    long long sum;
    int n;
    
    struct node
    {
        int val,num;
    }a[maxn];
    
    bool cmp(struct node a1,struct node a2)
    {
        return a1.val>a2.val;
    }
    
    bool Init()
    {
        sum=0;
        for(int i=0;i<n;i++)
        {
            cin>>a[i].val;
            a[i].num=i;
            f[i]=-1;
            sum+=a[i].val;
        }
        if(sum%2) return false;
        else return true;
    }
    
    void Work()
    {
        sort(a,a+n,cmp);
       long long cur=0;
        for(int i=0;i<n;i++)
        {
            if(cur+a[i].val<=sum/2)
            {
                cur+=a[i].val;
                f[a[i].num]=1;
                if(cur==sum/2) break;
            }
        }
    }
    
    void print()
    {
        for(int i=0;i<n-1;i++)
        {
            if(i!=0) cout<<' ';
            cout<<f[i];
        }
        cout<<' '<<f[n-1]<<endl;
    }
    
    int main()
    {
        while(cin>>n)
        {
            if(!Init()||n==1) cout<<"No"<<endl;
            else
            {
            cout<<"Yes"<<endl;
            Work();
            print();
            }
        }
        return 0;
    }

     

  • 相关阅读:
    生日蜡烛——第七届蓝桥杯C语言B组(省赛)第二题
    积分之谜——第六届蓝桥杯C语言B组(国赛)第一题
    平方十位数——第八届蓝桥杯JavaB组(国赛)第一题
    激光样式——第九届蓝桥杯C语言B组(国赛)第二题
    换零钞——第九届蓝桥杯C语言B组(国赛)第一题
    煤球数目——第七届蓝桥杯C语言B组(省赛)第一题
    扫描算法(SCAN)——磁盘调度管理
    最短寻道优先算法(SSTF)——磁盘调度管理
    最近最少使用算法(LRU)——页面置换
    ssm返回jsonp数据格式
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/4705148.html
Copyright © 2020-2023  润新知