比赛链接: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珑要加油,争取不拖队友后腿!

京公网安备 11010502036488号