1.比赛分数:
共四题,满分400,比赛中拿到0分,前4题每题得0分。
2.比赛过程:
第一题到第四题freopen写错了所以拿到0分。
3.题解报告:
(1)第一题:做饭
情况:赛中0分,已补题。
题意:可以发现时间都是合法时间,因此可以将p、q都加到开始时间,然后再做时间上的比较。但是这个过程细节较多,需要考虑是否跨天,并不易实现。
这部分分就是给想要模拟这个过程的同学准备的。
题解:观察 的数据,数据较大,因此可以考虑到,将所有时间转成秒,然后在秒上进行加法后再比较。注意输入的格式,使用scanf会比较方便一些。
AC代码:
#include<cstdio>
#include<iostream>
using namespace std;
long long nh,nm,ns;
long long kh,km,ks;
int main(){
scanf("%lld:%lld:%lld",&nh,&nm,&ns);
scanf("%lld:%lld:%lld",&kh,&km,&ks);
long long zhun,zhi;
cin>>zhun>>zhi;
long long sum=(kh*3600+km*60+ks)-(nh*3600+nm*60+ns);
if(sum>zhun+zhi){
cout<<"Yes";
}else{
cout<<"No";
}
return 0;
}
(2):评价标准
情况:赛中0分,已补题
题意:给定一个序列,通过一个操作,可以让序列中的一个数加上或减去 。通过挑选处这个数字操作,使得这个序列的最大值减去最小值尽可能的小。
赛时想法:没想到怎么做,直接照着前四个测试点的数据测试的,但是只拿到0分
题解:
情况一:max
1、当前值加 后比最大值还大,成为新max。
2、当前值减 后比最小值还小,成为min。
新情况二:
1、当前值为原本最大值,减 后比原本次大值小,次大值成为新 。2、当前值为原本最小值,加 后比原本次小值大,次小值成为新 。由此,我们便可以 得找到新 ,总的时间复杂度为 。
AC代码:
#include <bits/stdc++.h>
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,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分,已补题。
题意:折扣券最多1张,那么就选择价格最高的食材去使用。其余的食材可以按照每两个付其中最高的一个的方式去进行。
这个过程需要排序。
赛时想法:没想到怎么做,暴力。
题解:在这个问题中,我们要使得价格最低,也就是将高价商品想办法通过低价购买。
在有优惠券的情况下,既然要最小化,那么我们可以将当前最小和当前最大捆绑在一起实现 。
在没有优惠劵的情况下,最大的价格是一定要花费的,使用最大带次大,一定是花费最小的方式。
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+10;
ll n,k;
ll a[N];
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
ll l=1,R=n,sum=0;
while(k--&&l<=R){
sum+=a[l];
l++;
R--;
}
while(l<=R){
sum+=a[R];
R-=2;
}
cout<<sum;
return 0;
}
(4):美味佳肴
情况:赛时拿到0分,已补题。
题意:给你一个只包含 大写字母 和 ? 的字符串,这个字符串中的 ? 字符可以被同时看作任何字符。 现在你要计算最多有多少对(i,j) 满足 并且s[i]==s[j]。
赛事想法:没有任何思路打暴力得了0分。
题解:可以 的枚举每个字符,然后向后遍历找相等字符并计数。
AC代码:
#include <bits/stdc++.h>
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";
}
}
四.赛事总结:
因为freopen写错了所以拿到0分。我以后要注意。