ACM(2018.4.29)

继续上次的ACM(我承认我只是为了凑博客数)

Third

现在有n个杯子和t毫升茶水,现在满足以下条件:

  • 每个杯子至少装一半的茶水
  • 每个杯子必须装整数的茶水
  • 所有茶水必须放到杯子中
  • 要让所有客人满意(大杯茶的茶水多,小杯装的茶水少)

如果存在方案,任意输出一种;不存在则输出-1。

这道题目一看就“深藏不漏”。但是只要将题意理解了……何不是一道语文题。

#include<bits/stdc++.h>

using namespace std;

int n;

long long w;

int a[120]={};

int b[120]={};

扫描二维码关注公众号,回复: 2892452 查看本文章

int ans[120]={};

int minn=1000000000;

int main()

{

       cin>>n>>w;//读入

       intmaxw=0;

       for(inti=1;i<=n;i++)

       {

        cin>>a[i];

        b[i]=a[i];

        maxw+=a[i];//maxw代表所有茶杯都装满水的所需最大茶水值

       }

       if(maxw<w)//如果连最大茶水值(将杯子都装满的情况下)还达不到它给的茶水量,那么后面的判断都不需要了,这一定是不可能得出方案的,直接输出-1

       {

              cout<<-1<<endl;

              return0;

       }

       sort(a+1,a+n+1);

       intnw=0;

       for(inti=1;i<=n;i++)

       {

        ans[i]=(a[i]+1)/2;

        nw+=ans[i];

    }

       if(nw>w)

        {

             cout<<-1<<endl;

             return0;

        }//如果满足条件的最小值还大于他给出的茶水之,那么也是不可能完成的

       for(;nw<w;)

       for(inti=n;i>=1;i--)

       if(ans[i]<a[i]&&nw<w)

       {

              ans[i]++;

              nw++;

       }//因为要让客人满意,所以多余的茶水先逐一放入大杯

       intf[120]={};

       for(inti=1;i<=n;i++)

        for(int j=1;j<=n;j++)

        if(f[j]==0&&a[j]==b[i])

        {

             b[i]=ans[j];

             f[j]=1;

             break;

        }//按照他所给的顺序将答案放入b_i数组。F是为了避免数相同

        for(int i=1;i<=n-1;i++)

         cout<<b[i]<<' ';

       cout<<b[n]<<endl;//输出答案。

         return 0;

}

其实…..也不是很难的吧╮(╯-╰)╭(不存在的)

Fourth

Emm,没有AC的我无力解释,详见多重背包(听说资源分配也可)经典问题。

Fifth

有一个子序列,求子序列的个数(重复算作一个)

如此短小精炼的题目。。。

这是一道分明的递推题。如果不考虑重复的话dp[i]=dp[i-1]*2(含空集的情况)。考虑重复的问题,如果重复的话,那么要预先处理出与i之前最近的重复的数的位置j那么有dp[i]=dp[i-1]*2-dp[j-1]。(接受递推的磨练吧)

Sixth

两个人玩游戏

有一个序列,求最大分值,规则如下:

A给B一个序列,分值加上这个序列的所有数的和,如果此时给B的序列中只有一个数,那么B会扔掉这个序列,不然的话,B还给A。A将序列随意拆分给B其中一个,重复过程,直至两人手里的都没有序列(语文无能)

谈起这道题,我是很悲伤的。毕竟写了几个小时的高精度结果没AC,结果听到有人用long long给AC了,好无奈……

这道题实际上是很简单的,最小值其实就是每次让A去掉最小的那个数

这是我用高精度不断修改n+1次WA在第4个点的高精度。

#include<bits/stdc++.h>

using namespace std;

int a[10010]={};

int n;

int ans[10100]={};

int main()

{

       cin>>n;

       for(int i=1;i<=n;i++)

        cin>>a[i];

       sort(a+1,a+n+1);

       if(a[n]==0||n==0)

       {

        cout<<0<<endl;

        return 0;

      }

       for(int i=1;i<=n;i++)

        for(int j=i;j<=n;j++)

        {

             intt=0;

             intk=a[j];

        if(i==j&&i!=n)

         a[j]*=2;

         for(;a[j]!=0;)

         {

             ans[++t]=ans[t]+a[j]%10;

             a[j]/=10;

             ans[t+1]=ans[t+1]+ans[t]/10;

             ans[t]%=10;

         }

         a[j]=k;

     }

     int t=2002;

     for(;ans[t]==0;)

      t--;

    for(int i=t;i>=1;i--)

     cout<<ans[i];

     cout<<endl;

     return 0;

}

结果花了10minutes……

 #include<bits/stdc++.h>

using namespace std;

int n;

long long a[300100]={};

long long ans=0;

int main()

{

       cin>>n;

       for(int i=1;i<=n;i++)

        cin>>a[i];

       sort(a+1,a+n+1);

       for(int i=1;i<=n;i++)

        a[i]+=a[i-1];

    for(int i=1;i<=n;i++)

    {

    ans=ans+(a[n]-a[i-1])+(a[i]-a[i-1]);

   }

    ans-=(a[n]-a[n-1]);

   cout<<ans<<endl;

return 0;

}

 

Seventh

这是一道典型的DFS题…..无力分析

猜你喜欢

转载自blog.csdn.net/qq_40681184/article/details/80141591
ACM
今日推荐