一、总分数
T1[做饭(cook)]:91
T2[评价标准(criterion)]:80
T3[小可买菜(buy)]:50
T4[美味佳肴(cuisine)]:0
总分:221分
二、比赛过程
第一题并不难,但我多了一个特殊判断=号,所以少了9分;
第二题有一些难度要同时考虑到最大、次大、最小、次小,我无法实现,就舍弃了一部分,故80分;
第三题看上去是一个队列题,很难,但仔细一想会发现并不是。
第四题我没有思路;
三、比赛分析
T1[做饭(cook)]
1.题目大意
给出现在时刻和未来时刻,看之间有没有q+p秒;
2.我的思考
我先用自己的方法,得出了一个错误答案,后经仔细读题,发现方法和步骤。
3.题目解析
先把两个时刻化为以秒为单位的变量做差再和p+q作比较,输出正否,尤其注意条件是大于。
4.AC代码
#include<bits/stdc++.h>
using namespace std;
long long now1,now2,now3,k1,k2,k3,p,q,times1,times2,times3;
char c;
int main(){
freopen("cook.in","r",stdin);
freopen("cook.out","w",stdout);
cin>>now1>>c>>now2>>c>>now3;
cin>>k1>>c>>k2>>c>>k3;
cin>>p>>q;
times1+=k1*3600+k2*60+k3;
times2+=now1*3600+now2*60+now3;
times3=times1-times2-p-q;
if(times3>0) cout<<"Yes";
else cout<<"No";
fclose(stdin);
fclose(stdout);
return 0;
}
T2[评价标准(criterion)]
1.题目大意
给定一个操作值 k,然后任意从数组中选择一个数字x,可以将数字 x 加上 k,或者减去 k,之后得到一个新的数组,并使得新数组的评价标准最小。最终输出最小的评价标准。
2.我的思考
比较(最大值-k)-最小值 和 最大值-(最小值+k),输出最小值。
3.题目解析
定义最大、次大、最小、次小,改变最大时,将其放入次大中,最小值同理,最后相减,要注意k应该是绝对值。
4.AC代码
#include<bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f3f;
long long n,k,a[1000005],min1,min2,max1,max2,a1,a2,n1,n2,nmax,nmin,ans=inf;
int main(){
freopen("criterion.in","r",stdin);
freopen("criterion.out","w",stdout);
cin>>n>>k;
k=abs(k);
max1=-inf,max2=-inf;
min1=inf,min2=inf;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]>max2){
if(a[i]>max1){
a2=a1,max2=max1;
a1=i,max1=a[i];
}
else a2=i,max2=a[i];
}
if(a[i]<min2){
if(a[i]<min1){
n2=n1,min2=min1;
n1=i,min1=a[i];
}
else n2=i,min2=a[i];
}
}
a[n1]+=k;
nmin=min(min2,a[n1]);
nmax=max(max1,a[n1]);
ans=min(ans,nmax-nmin);
a[a1]-=k;
nmax=max(max2,a[a1]);
nmin=min(min1,a[a1]);
ans=min(ans,nmax-nmin);
cout<<ans;
fclose(stdin);
fclose(stdout);
return 0;
}
T3[小可买菜(buy)]:50
1.题目大意
总共有n个食材需要购买,在超市中第i个食材的价格是vi,另外,每满两个商品,都可以进行促销活动,使用两个商品中最高价格购买当前这两件商品。
还有k 张超市折扣券,每两件商品可以使用一张折扣券,使用两个商品中最低价格购买当前这两件商品。
注意:商品不能重复参加活动。
2.我的思考
先使用优惠券,再搞促销,但算重复了;
3.题目解析
先循环k次,最小与最大值结合,累加最小值并删除最小值与最大值。循环k次后,循环用双指针再累加。
4.AC代码
#include<bits/stdc++.h>
using namespace std;
long long n,k,a[1000005],ans;
int main(){
freopen("buy.in","r",stdin);
freopen("buy.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
int L=1,R=n;
for(int i=1;i<=k;i++){
ans+=a[L];
L++,R--;
}
while(L<=R){
ans+=a[R];
R-=2;
}
cout<<ans<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}
T4[美味佳肴(cuisine)]
1.题目大意
字母只能与相同字母搭配,?能和所有搭配,但只能用一次,问有多少种搭配。
2.我的思考
固定一个字符,与后面其他字符配对。
3.题目解析
统计所有字符出现次数,“?”与出现次数最多的字符配对,最后再累加。
4.AC代码
#include<bits/stdc++.h>
using namespace std;
long long t;
string s;
int main(){
freopen("criterion.in","r",stdin);
freopen("criterion.out","w",stdout);
cin>>t;
while(t--){
cin>>s;
long long l=s.size(),ans=0,a[300]={0},maxx=0,id=0;
for(int i=0;i<l;i++) a[s[i]]++;
for(int i=0;i<300;i++){
if(char(i)!='?'&&a[i]>maxx){
maxx=a[i];
id=i;
}
}
a[id]+=a['?'];
a['?']=0;
for(int i=0;i<300;i++){
if(a[i]!=0) ans+=a[i]*(a[i]-1)/2;
}
printf("%lld\n",ans);
}
fclose(stdin);
fclose(stdout);
return 0;
}