埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛

原创 2018年04月15日 20:09:09

五题菜狗…
那个自习室真是有毒..坐了一下子马上就感冒了..头痛…

A Wasserstein Distance

这题也是搞不懂,一开始狂wa,迷迷糊糊的.

#include <iostream>
#include <vector>
#include <set>
using namespace std;
#define debug(x) std::cerr << #x << " = " << (x) << std::endl
typedef long long LL;
const int MAXN = 1e5+17;
int a[MAXN],b[MAXN],c[MAXN];
int main(int argc ,char const *argv[])
{
    #ifdef noob
    freopen("Input.txt","r",stdin);freopen("Output.txt","w",stdout);
    #endif
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        set<LL > s;
        s.clear();
        for (int i = 0; i < n; ++i)
        {
            a[i] = b[i] = c[i] = 0;
            scanf("%lld",&a[i]);
        }
        for (int i = 0; i < n; ++i)
        {
            scanf("%lld",&b[i]);
        }
        for (int i = 0; i < n; ++i)
        {
            if(a[i]>b[i])
            {
                s.insert(i);
                c[i] = a[i]-b[i];
            }
        }
        //cerr<<"sad"<<endl;
        LL ans = 0;
        for (int i = 0; i < n; ++i)
        {
            // debug(a[i]);
            // debug(b[i]);
            if(a[i]<b[i])
            {
                int need = b[i]-a[i];
                //debug(need);
                while(1)
                {
                    int st = *s.begin();
                    // debug(c[st]);
                    // debug(need);
                    if(c[st]>need)
                    {
                        ans += abs(i-st)*need;
                        c[st]-=need;
                        break;
                    }
                    else
                    {
                        ans += abs(i-st)*c[st];
                        need-=c[st];
                        c[st] = 0;
                        s.erase(s.find(st));
                    }
                    if(need==0) break;
                }
            }
        }
        cout<<ans<<endl;
    }
    return 0;   
}

E 小Y吃苹果

签到.
#include <iostream>
using namespace std;
#define debug(x) std::cerr << #x << " = " << (x) << std::endl
typedef long long LL;
const int MAXN = 1e5+17;
int main(int argc ,char const *argv[])
{
    #ifdef noob
    freopen("Input.txt","r",stdin);freopen("Output.txt","w",stdout);
    #endif
    int n;
    cin>>n;
    int ans = 1;
    for (int i = 0; i < n; ++i)
    {
        ans *= 2;
    }
    cout<<ans<<endl;
    return 0;   
}

F 1 + 2 = 3?

打表找规律,递归.

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define debug(x) //std::cerr << #x << " = " << (x) << std::endl
typedef long long LL;
const int MAXN = 1e5+17;
vector<LL > have[70];
LL fab[100],ans = 0,sum[100];
LL qm(LL a,LL b)
{
    LL res = 1;
    while(b)
    {
        if(b&1) res = res*a;
        a*=a;
        b>>=1;
    }
    return res;
}
void dfs(LL n)
{
    if(n==0) return;
    int p = lower_bound(sum, sum+70, n)-sum;
    if(sum[p]!=n) p--;
    debug(sum[p]);
    debug(n);
    ans += qm(2,p);
    debug(ans);
    if(n!=1)
    dfs(n-sum[p]);
}
int main(int argc ,char const *argv[])
{
    #ifdef noob
    freopen("Input.txt","r",stdin);freopen("Output.txt","w",stdout);
    #endif
    fab[0] = fab[1] = fab[2] = 1;
    for (int i = 0; i < 2; ++i)
    {
        for (int j = i+2; j < 70; ++j)
            have[j].push_back(fab[i]);
    }
    sum[1] = 0,sum[1] = 2,sum[2] = 3;
    for (int i = 3; i < 68; ++i)
    {
        fab[i] = fab[i-1]+fab[i-2];
        sum[i] =fab[i]+sum[i-1];
        for (int j = i+2; j < 70; ++j)
        {
            have[j].push_back(fab[i]);
        }
        // debug(i);
        // debug(fab[i]);
        // debug(sum[i]);
    }
    int t;
    cin>>t;
    while(t--)
    {
        LL n;
        cin>>n;
        ans = 0;
        dfs(n);
        cout<<ans<<endl;
    }
    return 0;   
}

I 二数

水题

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define debug(x) std::cerr << #x << " = " << (x) << std::endl
typedef long long LL;
const int MAXN = 1e5+17;
int main(int argc ,char const *argv[])
{
    #ifdef noob
    freopen("Input.txt","r",stdin);freopen("Output.txt","w",stdout);
    #endif  
    int t;
    cin>>t;
    while(t--)
    {
        string str,ans;
        str.clear();
        ans.clear();
        cin>>str;
        if(str=="1")
        {
            cout<<"0"<<endl;
            continue;
        }
        bool fd = false;
        for (int i = 0; i < str.length(); ++i)
        {
            if((str[i]-'0')&1==1)
            {
                fd = true;
                ans = str.substr(0,i);
                if(str[i]=='9')
                {
                    for (int j = 0;j < str.length()-i; ++j)
                    {
                        ans.push_back('8');
                    }
                    break;
                }
                bool up = false;
                for (int j = i+1; j < str.length(); ++j)
                {
                    if((str[j]-'0')>4)
                    {
                        up = true;
                        break;
                    }
                    else if((str[j]-'0')<4)
                        break;
                }
                if(up)
                    ans.push_back(str[i]+1);
                else if(str[i]=='1'&&i==0)
                    ;
                else
                    ans.push_back(str[i]-1);
                if(up)
                {
                    for (int j = 0; j < str.length()-i-1; ++j)
                    {
                        ans.push_back('0');
                    }
                }
                else
                {
                    for (int j = 0; j < str.length()-i-1; ++j)
                    {
                        ans.push_back('8');
                    }
                }
                break;
            }
        }
        if(fd)
            cout<<ans<<endl;
        else
            cout<<str<<endl;
    }
    return 0;   
}

L K序列

我感觉这题蛮难的啊…为什么呢..
处理取模,然后dp最少获得溢出的数量.

#include <iostream>
#include <vector>
using namespace std;
#define debug(x) //std::cerr << #x << " = " << (x) << std::endl
typedef long long LL;
const int MAXN = 1e5+17;
LL a[MAXN];
vector<LL > rem;
vector<vector<LL > > dp;
int main(int argc ,char const *argv[])
{
    #ifdef noob
    freopen("Input.txt","r",stdin);freopen("Output.txt","w",stdout);
    #endif
    LL n,k,ans = 0,dap = 0;
    cin>>n>>k;
    for (int i = 0; i < n; ++i)
    {
        scanf("%d",a+i);
        if(a[i]%k==0) ans++;
        else rem.push_back(a[i]%k);
        dap+=a[i]%k;
        dap%=k;
    }
    //if(ans==0) return cout<<0<<endl,0;
    if(rem.size()==0)  return cout<<ans<<endl,0;
    if(dap==0) return cout<<n<<endl,0;
    dp.resize(rem.size());
    for (int i = 0; i < rem.size(); ++i)
        dp[i].resize(k+1);
    dp[0][rem[0]] = 1;
    dp[0][0] = 1;
    for (int i = 0; i < rem.size()-1; ++i)
    {
        for (int j = 0; j <= k; ++j)
        {
            if(dp[i][j])
            {
                dp[i+1][j] = 1;
                dp[i+1][(j+rem[i+1])%k] = 1;
            }
        }
    }
    debug(dap);
    for (int i = 0; i < rem.size(); ++i)
    {
        if(dp[i][dap]==1)
        {
            debug(i);
            ans = n-i-1;
            break;
        }
    }
    cout<<ans<<endl;
    return 0;   
}
版权声明:如果你想转载也真是看得起我,告诉我一下就行了 https://blog.csdn.net/m0_37802215/article/details/79952550

编程方向

 一、前言  很多人认为,数据库编程是一个颇具诱惑力的工作,这诱惑力来自于数据库应用的巨大市场需求。计算机应用有科学计算、数据处理与过程控制三大主要领域,而数据处理是其中所占比重最大的一个领域,包括现...
  • xingjiaren
  • xingjiaren
  • 2001-04-10 11:37:00
  • 930

第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛(部分题解)

唉,好久没更新博客了,说明我这段时间在学习上都懈怠了Σ( ° △ °|||)︴昨天打了场金马赛,这网络…..我真的是无力吐槽…..前三题都是大水题,就不挂代码了;D-快速幂取模裸题#include u...
  • Murphyc
  • Murphyc
  • 2017-07-10 13:54:47
  • 484

【牛客网】【埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛】L—K序列【动态规划】

题目链接:L—K序列题解:for一遍数组,temp[i]表示:不包括当前for到的点,序列和为i的最长长度。然后for一遍0-k,对dp[ (j+num[i])%k ]进行更新,dp[j]是包括当前点...
  • gymgym1212
  • gymgym1212
  • 2018-04-15 18:46:39
  • 177

【牛客网】【埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛】B—合约数【莫队做法】

题目链接:B—合约数题意:一棵树,有n个节点,从1编号到n。根节点的编号为p。给出每个节点的val[i]值,定义f(i)为以编号i为根节点的子树中(包括根节点),所有val[j]是合数并且是val[i...
  • gymgym1212
  • gymgym1212
  • 2018-04-15 20:33:28
  • 139

埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛F题 1+2=3?

题目链接:https://www.nowcoder.com/acm/contest/91/F题意:求第N个符合条件X^2X=3X的X。N&amp;lt;=10的12次方。解题思路:我刚开始想到最粗暴的...
  • weixin_36416680
  • weixin_36416680
  • 2018-04-16 11:01:00
  • 61

埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 F-1+2=3?

链接:https://www.nowcoder.com/acm/contest/91/F来源:牛客网题目描述 小Y在研究数字的时候,发现了一个神奇的等式方程,他屈指算了一下有很多正整数x满足这个等式...
  • albertluf
  • albertluf
  • 2018-04-15 16:46:44
  • 136

埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛H题小Y与多米诺骨牌(线段树优化dp)

题意 题目链接:https://www.nowcoder.com/acm/contest/91/H 来源:牛客网 题解 设l[i]l[i]l[i]为向左推第iii个骨牌最远能影响到的骨牌的...
  • ME495
  • ME495
  • 2018-04-17 11:20:36
  • 91

埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 J-小Y写文章(二分+二分图匹配)

链接:https://www.nowcoder.com/acm/contest/91/J来源:牛客网题目描述 小Y写了一篇文章,他对自己的文笔很有自信,尤其是自己总结出了一套计算文章通顺性的公式。 ...
  • albertluf
  • albertluf
  • 2018-04-18 10:27:07
  • 93

埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛 L K序列

题目: 给一个数组 a,长度为 n,若某个子序列中的和为 K 的倍数,那么这个序列被称为“K 序列”。现在要你 对数组 a 求出最长的子序列的长度,满足这个序列是 K 序列。 Input: 第...
  • Tony5t4rk
  • Tony5t4rk
  • 2018-04-16 19:42:25
  • 11

K序列--埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛

链接:https://www.nowcoder.com/acm/contest/91/L来源:牛客网K序列时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 131072K,其他语言2621...
  • zitian246
  • zitian246
  • 2018-04-16 16:47:40
  • 46
收藏助手
不良信息举报
您举报文章:埃森哲杯第十六届上海大学程序设计联赛春季赛暨上海高校金马五校赛
举报原因:
原因补充:

(最多只允许输入30个字)