第三周是过年之前的最后一周,所以我也是憋足了劲写题。而第一次牛客组队合作写题也是令我印象深刻。虽然有点坐牢但合作的感觉还是不错的。题目也是难易分明,能在难题上看出自己的不足。
而年前最后一次比赛似乎是想让我们过个好年,题目也变得简单了许多,但是有些简单的题我没把握好,确实不应该。
其中一道我印象较为深刻的题
KK 与十佳
kk 在十佳歌手比赛现场唱了一首歌。
底下有 n 名评委,分别给 kk 打出了分数(不包含0,不重复)。
现在 kk 有一个权力,可以把一个评委打的分去掉,之后其余剩下的所有评委的分数的乘积就是 kk 的分数。
kk 希望自己的分数尽可能高,请问他应该删除哪一个分数呢。
Input
单组输入。
输入一个 n(2≤n≤3⋅104),代表评委的个数。
接下来输入 n 个整数 ai(ai∈[−1000000,0)∪(0,1000000]),代表 n 名评委打的分数。
Output
输出一个数,即删除的那个数。
这道题代码实现不难,难的是思路。只要思路捋顺,题目自然迎刃而解。
由于是算乘积,自然而然要考虑正负性。结合要求最大值这一条件,那就代表当负数个数为奇数时,必须去除一个最大负数,使得结果为正数并最大。而当负数个数为偶数时,则不需要去除负数,转而去除一个最小正数,同时,若是数据中无正数,则要去除一个最小负数。
AC 代码如下
include <bits/stdc++.h>
using namespace std;
int n,a[30010];
int main(){
cin>>n;
int min=1000010,max=-1000010,min1=0,l=0,k=0;
for(int i=1; i<=n; i++){
cin>>a[i];
if(a[i]<0){
l++;
if(a[i]>max)
max=a[i];
if(a[i]<min1)
min1=a[i];
}else{
if(a[i]<min)
min=a[i];
k=1;
}
}
if(l%2==0&&k==1)
cout<<min;
else if(l%2!=0)
cout<<max;
else
cout<<min1;
return 0;
}
第四周由于没调整过来,解题效率略有下降,加上吃坏肚子,只能含恨离开(.
接下来还要继续训练,在这里给自己打打气,加油!