一.比赛分数
共四题,总分400分,第一,二,三,四题都是0分,总分0分。
二.比赛过程
第一题我一直在求秒数,然后和做饭时间比,有的自己知道写的不全,但不想写,也不会写,浪费时间太长。
第二题题没看懂,看样例也没看懂,蹭的样例。
第三题没算明白是怎么算出来的,也没想到用双指针,蹭的样例。
第四题我用的是双指针,按题目提示算的,也靠之前学过的代码,但只记得一点。
四.题解报告
(1).第一题:做饭
情况:赛中0分,已补题
题意:如果可以赶在达达回家之前制作完晚饭,输出Yes
,否则输出No
。
题解:k1知识,只有scanf不是 ,定义sum求出秒数,然后比较,可以输出Yes,不行输出No。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<utility>
#include<map>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
long long n,a,b;
long long c,k,j;
long long p,q;
int main(){
scanf("%lld:%lld:%lld",&n,&a,&b);
scanf("%lld:%lld:%lld",&c,&k,&j);
scanf("%lld%lld",&p,&q);
long long sum=(n*3600+a*3600+b)-(c*3600+k*3600+j);
if (sum>p+q){
cout<<"Yes";
}
else {
cout<<"No";
}
return 0;
}
(2).第二题:评价标准
情况:赛中0分,已补题
题意:给定一个操作值 kk,然后任意从数组中选择一个数字xx,可以将数字 xx 加上 kk,或者减去 kk,之后得到一个新的数组,并使得新数组的评价标准最小。
题解:六个if,把最小的数加上kk,判断加上kk后是最小的,次小的,还是最大的,再把最大的减去kk,判断减去kk后是最大的,次大的,还是最小的,最后输出一行,包含一个整数,表示操作后最小的评价标准。
AC代码:
暴力方式:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<utility>
#include<map>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
typedef long long ll;
const int N=1e6+10,M=0x3f3f3f3f;
int maxx=M,cmax=M,minn=M,cmin=M;
int n,k,s[N];
int ans=0;
int main(){
cin>>n>>k;
k=abs(k);
for (int i=1;i<=n;i++){
cin>>s[i];
maxx=max(maxx,s[i]);
minn=min(minn,s[i]);
}
ans=maxx-minn;
int c1=0,c2=0;
for (int i=1;i<=n;i++){
if (s[i]==minn) c1++;
if (s[i]==maxx) c2++;
if (s[i]!=minn&&s[i]<cmin) cmin=s[i];
if (s[i]!=maxx&&s[i]>cmax) cmax=s[i];
}
if (c1>1&&c2>1){
cout<<ans;
return 0;
}
if (c1==1&&c2>1){
int t=k+minn;
if (t>=cmin&&t<maxx){
ans=min(ans,maxx-cmin);
}else if (t<cmin){
minn=k+minn;
ans=min(ans,maxx-minn);
}else if (t>=maxx){
maxx=t;
ans=min(ans,maxx-cmin);
}
}else if (c2==1&&c1>1){
int t=maxx-k;
if (t<=cmax&&t>minn){
ans=min(ans,cmax-minn);
}else if(t>cmax){
maxx=t;
ans=min(ans,maxx-minn);
}else if (t<=minn){
minn=t;
ans=min(ans,cmax-minn);
}
}else {
if (k+minn<cmin){
minn=k+minn;
ans=min(ans,maxx-minn);
}
if (k+minn>=cmin&&k+minn<maxx){
ans=min(ans,maxx-cmin);
}
if (k+minn>=maxx){
maxx=k+minn;
ans=min(ans,maxx-cmin);
}
if (maxx-k>cmax){
maxx=maxx-k;
ans=min(ans,maxx-minn);
}
if (maxx-k<=cmax&&maxx-k>minn){
ans=min(ans,cmax-minn);
}
if (maxx-k<=minn){
minn=maxx-k;
ans=min(ans,cmax-minn);
}
}
cout<<ans;
return 0;
}
简便方式:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<utility>
#include<map>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
int n,k,s[10000005],a[10000005],b[10000005],sum1=0,sum2=0;
int main(){
cin>>n>>k;
k=abs(k);
for (int i=1;i<=n;i++){
cin>>s[i];
a[i]=s[i];
b[i]=s[i];
}
sort (a+1,a+n+1);
sort (b+1,b+n+1);
a[1]+=k;
b[n]-=k;
sort(a+1,a+n+1);
sort(b+1,b+n+1);
sum1=a[n]-a[1];
sum2=b[n]-b[1];
if (sum1<sum2) cout<<sum1;
else cout<<sum2;
return 0;
}
(3).第三题:小可买菜
情况:赛中0分,已补题
题意:每两件商品可以使用一张折扣券,使用两个商品中最低价格购买当前这两件商品。
题解:双指针思想,l指向数组头,r指向数组尾,使用一张折扣券,存最低数额,然后r++,l--,有几张进行几次,如果没有折扣券了,r移动两次,再加上r所在位的数额,数组如果是奇数,移动完后l==r,就加上l和r所在位的数额,最后输出最低花费多少元。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<utility>
#include<map>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
const int N=1e6+10;
long long n,k;
long long a[N];
int main(){
cin>>n>>k;
for (int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
long long L=1,R=n,sum=0;
while (k--&&L<=R){
sum+=a[L];
L++;
R--;
}
while (L<=R){
sum+=a[R];
R-=2;
}
sum>>sum;
return 0;
}
(4).第四题:美味佳肴
情况:赛中0分,已补题
题意:大写字母
和 ?
,相同大写字母表示两个食物搭配起来吃最美味,?
则表示搭配任何一个食物吃都非常美味,但是达达有习惯,一旦使用当前这种食物搭配另一个食物,达达就不会再去搭配其他食物吃,也就是说每个?
确定与某个食物搭配后,则不能再与其他食物搭配食用。
题解:在字符串中存在 l,rl,r 满足 l < rl<r 且 s[l] == s[r]s[l]==s[r],则表示一种美味搭配。找出最多的不同的搭配,当 ll 不同或 rr 不同,就表示一种不同搭配。
AC代码:
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<utility>
#include<map>
#include<vector>
#include<stack>
#include<queue>
using namespace std;
int t;
long long a[95];
string s;
int main(){
cin>>t;
while (t--){
memset(a,0,sizeof a);
cin>>s;
int maxx=0;
long long ans=0;
int len=s.size();
int temp;
for (int i=0;i<len;i++){
a[s[i]]++;
if (s[i]!='?'){
if (a[s[i]]>maxx){
maxx=a[s[i]];
temp=s[i];
}
}
}
if (a['?']==0){
for (int j=65;j<=90;j++){
ans+=a[j]*(a[j]-1)/2;
}
}
else {
a[temp]+=a['?'];
for (int j=65;j<=90;j++){
ans+=a[j]*(a[j]-1)/2;
}
}
cout<<ans<<"\n";
}
return 0;
}
四.赛事总结
本次比赛中,除了第一题还有点思路,其他都几乎没有,在写完第一题时,可能就觉得后面难了,后面就没第一题认真了,并且我在保存文件上也用了很长时间,以后需要多思考,多积累。