1.比赛分数:
共4题,满分400,比赛中得50分,第1题0分,2题30分,第3题10分,第4题10分。
2.比赛过程:
第1题看到时以为是减出来的绝对值加到累加器上,可是老师说要用比较出来最大的时间。
第2题一看到就想到打暴力,可是没想到会是时间超限。
第3题是一开始想双指针枚举,可是不会。
第4题本想用桶标记,但多样数据不会。
3.题解报告:
(1)
情况:赛中0分,已补题。
题意:
一个整数 n ,表示人数一个整数 L ,表示独木桥的长度,第三行是a1,a2 …an ,其中ai 表示第 i 个人初始位置到独木桥左端点 的距离,表示所有人都离开独木桥所需的最短时间。
题解:比出最大的。
错思路:无。
错代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
long long n,l,a[100000],s=-1;
cin>>n>>l;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<n;i++){
s=s+abs(a[i]-a[i+1]);
}
cout<<s;
return 0;
}
对思路:
比出时间最长的。
对代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
long long n,l,x,s=0;
cin>>n>>l;
for(int i=1;i<=n;i++){
cin>>x;
s=max(s,min(x,l-x));
}
cout<<s;
return 0;
}
(2)
情况:赛中30分,已补题。
题意:一个整数,表示把棋子从 x 号格子移动到y 号格子需要的最少操作次数。
题解:判断情况。
错思路:判断少了。
错代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
long long x,y,s=0;
cin>>x>>y;
while(x!=y){
if(x<y&&x>0&&y>0){
cout<<s+y-x;
return 0;
}
if(x>y&&x>0&&y>0){
x=x-x*2;
s++;
}
if(x<y&&x<=0&&y>0){
x=x+x*-2;
s++;
}
}
cout<<s;
return 0;
}
对思路:全部情况遍历
对代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
long long x,y,ans;
cin>>x>>y;
if(x*y<0){
ans=abs(abs(x)-abs(y))+1;
}else if(x*y>0){
if(x>y){
ans=x-y+2;
}else if(x<y){
ans=y-x;
}
}else{
ans=abs(x-y);
if(x>y){
ans=ans+1;
}
}
cout<<ans;
return 0;
}
(3)
情况:赛中10分,已补题。
题意:最少需要花费多少钱买门票才能看到所有种类的动物(同
一种动物他可能不止看一个)。
题解:双指针从一个头上查找看的最多的种类。
错思路:暴力骗分。
错代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
long long n,m,x[100000],cnt=0,s=0;
cin>>n,m;
for(int i=1;i<=n;i++){
cin>>x[i];
}
int a=1,b=n;
cout<<m*10;
return 0;
}
对思路:利用双指针从一个头上查找看的最多的种类。
对代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
long long n,m,a[1000000],b[1000000];
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int l=1,r=0,cnt=0,ans=0x3f3f3f3f;
while(r<n){
while(cnt<m&&r<n){
r++;
b[a[r]]++;
if(b[a[r]]==1){
cnt++;
}
}
while(cnt==m){
ans=min(ans,r-l+1);
b[a[l]]--;
if(b[a[l]]==0){
cnt--;
}
l++;
}
}
cout<<ans*10;
return 0;
}
(4)
情况:赛中10分,已补题。
题意:计算最小的代价。
题解:计算出两种方法然后比较最小的代价。
错思路:只计算一种方法。
错代码:
#include <bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
return a<b;
}
int main(){
long long t;
cin>>t;
for(int i=1;i<=t;i++){
long long n,c,x[100000],b[100000]={0},max=0,s=0;
cin>>n>>c;
if(c<=1){
cout<<n*c;
}else{
for(int i=1;i<=n;i++){
cin>>x[i];
}
sort(x+1,x+1+n,cmp);
for(int i=1;i<=n;i++){
b[x[i]]++;
}
for(int i=1;i<=n;i++){
if(b[i]>max){
max=b[i];
}
}
s=s+max*c;
for(int i=1;i<=n;i++){
}
cout<<s;
}
}
return 0;
}
对思路:标记出现的卫星,然后选择方法计算
对代码:
#include <bits/stdc++.h>
using namespace std;
const int N=5e6+5;
int cnt[N];
int main(){
int t,n,c;
cin>>t;
while(t--){
int x,ans=0;
memset(cnt,0,sizeof cnt);
cin>>n>>c;
for(int i=1;i<=n;i++){
cin>>x;
cnt[x]++;
}
for(int i=1;i<=N;i++){
ans=ans+min(c,cnt[i]);
}
cout<<ans<<endl;
}
return 0;
}
4.反思
通过老师讲解后我深深的体会到了复赛的困难,所以我会尽我所能的学习。