比赛链接:https://ac.nowcoder.com/acm/contest/5600
A:https://ac.nowcoder.com/acm/contest/5600/A
题意:给你n个怪,第i个怪物的血量为 ai,目标杀死所有怪,即所有怪物血量都变成0,有两种操作方式:你每次可以以一点代价使某个怪的血量减一(普通攻击)或者x点代价使所有血量不为0的怪物血量减一(技能),问你最小的代价为多少。
思路:可以先想,如果x非常大,但是n很小,那么使用技能就十分浪费,接下来我们考虑什么时候使用技能收益大于普通攻击,很容易想到,当xn,技能就是浪费。于是就找到平衡点了,不妨设当前还活着的怪物数量是m,那么当x<m时,就应该使用技能,当条件不成立时,剩下的怪就用普通攻击击杀。
再根据题目,我们可以对怪物按血量进行排序,然后找到第x只(如果存在),采用ax次技能,然后剩下的怪物统统用普通攻击击杀就好,至此代码也就写出来了。

//author CN.TTDragon
#include
typedef long long ll;
const ll mod=1e9+7;
const ll maxn=2e5+7;
const double pi=acos(-1);
using namespace std;
ll a[maxn];
ll ans=0;
int main()
{
    int n,x;
    cin>>n>>x;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
    }
    sort(a,a+n);
    if(x>=n)
    {
        for(int i=0;i<n;i++)
        {
            ans+=a[i];
        }
    }
    if(x<n)
    {
        //注意是活着的怪物!
        //释放次数是 a[n-x-1],因为这里怪物从零开始编号
        ans+=a[n-x-1]*x;
        for(int i=n-x;i<n;i++)
        {
            ans+=a[i]-a[n-x-1];
        }
    }
    cout<<ans<<endl;
     return 0;
}

F:https://ac.nowcoder.com/acm/contest/5600/F
题意:有一个长度为n的数组,数组元素只能是[1,5]之间的正整数,本来应该给你n个数的,但是这次由于某些原因,只给你n-m个数,然后问你最大的平均值和最小的平均值。
思路:很明显,没有给的数字,最大是5,最小是1,那么在接收n-m个数的过程中,计算出sum,最小平均就是没给出的数都是1,最大平均就是没给出的数都是5。至此代码也就写出来了。

//author CN.TTDragon
#include
typedef long long ll;
const ll mod=1e9+7;
const ll maxn=2e5+7;
const double pi=acos(-1);
using namespace std;
ll a[5]={0};
int main()
{
    int n,m;
    scanf("%d %d",&n,&m);
    ll sum=0;
    int q;
    for(int i=0;i<n-m;i++)
    {
        scanf("%d",&q);
        sum+=q;
    }
    printf("%0.5lf ",double(sum+1*m)/n);
    printf("%0.5lf\n",double(sum+5*m)/n);
     return 0;
}

H:https://ac.nowcoder.com/acm/contest/5600/H
题意:给你任意个字符串(仅由英文小写字母和空格组成),要求输出里面出现次数最多的那个字母。
思路:简单统计,开一个桶,里面装的是26个小写字母的出现次数。然后输出值最大那个位置对应的字母就好。

//author CN.TTDragon
#include
typedef long long ll;
const ll mod=1e9+7;
const ll maxn=1e5+7;
const double pi=acos(-1);
using namespace std;
ll a[256]={0};
ll mx=0;
int main()
{
    string s;
    while(getline(cin,s))
    {
        int n=s.length();
        for(int i=0;i<n;i++)
        {
            a[int(s[i])]++;
        }
    }
    for(int i=0;i<256;i++)
    {
        mx=max(mx,a[i]);
    }
    for(int i=0;i<256;i++)
    {
        if(a[i]==mx)
        {
            cout<<char(i)<<endl;
        }
    }
     return 0;
}

I:https://ac.nowcoder.com/acm/contest/5600/I
题意:给你一个二维数组a[n][m],要你在这个二维数组的基础上,输出一个新的二维数组b[n][m],b[i][j]=图片说明
思路:一开始暴力,那是对于b中每一个元素,我们都把那一行和那一列的所有数都加起来(这里会重复a[i][j]一次),再减去a[i][j]。这么做,emmm,复杂度是O(knm)(k=m+n)的。那么我们再来想想怎么优化,我们注意到,对于每个元素,我们都要那一行那一列的所有数的和!我们考虑能不能开两个数组来记录行和列的和。这么一来复杂度就降到O(2nm)的了(如果复杂度计算错误还请指正)。至此代码也就出来了。
私货:这里二维数组不知道m和n,如果都用maxn,开不了。我们考虑用一维数组模拟,具体可以在 这里 (智乃姐姐天下第一)了解一下(没报名的话,可以点别人的提交查看,也可以看智乃姐姐的题解)。

//author CN.TTDragon
#include<bits/stdc++.h>
typedef long long ll;
const ll mod=1e9+7;
const ll maxn=1000010;
const double pi=acos(-1);
using namespace std;
ll n,m;
ll a[maxn]={0};//这里用一维数组模拟二维数组
ll hang[maxn]={0};
ll lie[maxn]={0};
int main()
{
    scanf("%lld %lld",&n,&m);
    for(int i=0;i<n*m;i++)
    {
        scanf("%lld",&a[i]);
        hang[i/(m)]+=a[i];//这里可以自己想一下,为什么是这样
        lie[i%m]+=a[i];//同上
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            printf("%lld ",hang[i]+lie[j]-a[i*m+j]);
        }
        printf("\n");
    }
    return 0;
}

E:https://ac.nowcoder.com/acm/contest/5600/E
题意:给你一个字符串,当两个相邻字符相同的时候可以消去,问你最终这个串会变成什么样子,如果幸运的把串消完了就输出0。
思路:暴力一点,因为是删除,我们肯定回想从后往前删除,我们从后往前遍历,两个相同就删除掉。于是代码就可以写出来了。(虽然是暴力,但复杂度是O(n)的)

//这代码是我从别人那里复制的,侵删。
//链接:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43749313&returnHomeType=1&uid=942544096
#include <iostream>
#include <algorithm>
#include <string>
#include <cstdio>
using namespace std;
using ll = long long;

const int N = 7 + 3e5;

string s;

int main() {
    cin >> s;
    for (int i = (int)s.size() - 2; i >= 0; --i) {
        while (s.size() >= 2 && i + 1 < s.size() && s[i] == s[i + 1]) {
            s.erase(i, 2);
        }
    }
    if (s.empty())
        s += '0';
    cout << s << endl;
    return 0;
}

当然,细想一下就会发现它其实是括号序列的升级版(都是匹配删除)。于是我们可以写出另一个代码。

//author CN.TTDragon
#include<bits/stdc++.h>
typedef long long ll;
const ll mod=1e9+7;
const ll maxn=1e6+7;
const double pi=acos(-1);
using namespace std;
char a[maxn];
int main()
{
    string s;
    cin>>s;
    int n=s.length();
    int p=0;
    //这里是数组模拟的栈,我自己写栈好像一般都是数组模拟(人菜)
    for(int i=0;i<n;i++)
    {
        if(p!=0)//栈不是空的
        {
            if(a[p-1]==s[i])//匹配成功
            {
                p--;//栈中元素减一
            }
            else//匹配失败
            {
                a[p]=s[i];//入栈
                p++;//栈里元素加一
            }
        }
        else
        {
            a[p]=s[i];
            p++;
        }
    }
    for(int i=0;i<p;i++)
    {
        cout<<a[i];
    }
    if(p==0)//空栈输出0。
    {
        cout<<0<<endl;
    }
     return 0;
}

写在最后:
不知不觉回到苏州已经一周了(我们仍未知道那年夏天的TT珑的返校原因),打小白月赛前,学校也打了新生排位赛(体验场)结果就因为没处理好边界条件疯狂WA,直接自闭。
打比赛的时候,A题想复杂了,遂洗澡去也,后明,一A。写I题的时候看到dls开播了(虽然是jls在播),又遂前去看也,结果就是看了个滚榜(了解了滚榜也是不错的)。但代价就是明明开了ll却没有%lld的神仙错误。结果弄得没时间看大水题E,含泪痛+1分。
鬼话就这些,下面说人话:
兰子姐姐!.jpg,期待兰子姐姐下一套题~
TT珑要加油,争取不拖队友后腿!