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