一、题目报告
第一题AC,第二题80分,第三题10分,第四题AC
二、赛中概况
首先做的第一题,第一题很简单,大概做了15分钟左右。第二题有一些思路,但不够全面,只得了10%的分数。第三题只考虑了片面的情况,预估20分左右。最后一题比较简单,只用了20分钟,时间安排的还算合理。
三、题目正解
T1 独木桥(bridge)
题目情况
比赛时AC
题目大意
给定每一个人距左端点的长度,每人速度为1m/s,求最少经过多少秒后所有人都可以走到左端点或右端点。
题目解析
观察题目,可以想到离哪个端点近就向哪一个端点走。
(1)求中点
(2)比较大小,求长度中最长的
正解代码
#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
long long n,k,a[1000005],maxx;
int main(){
freopen("bridge.in","r",stdin);
freopen("bridge.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int mid=(k+1)/2;
for(int i=1;i<=n;i++){
if(a[i]<=mid){
maxx=max(maxx,a[i]);
}else{
maxx=max(maxx,k-a[i]);
}
}
cout<<maxx;
fclose(stdin);
fclose(stdout);
return 0;
}
T2 移动棋子(chess)
题目情况
比赛时80分,比赛后AC
题目大意
一维的棋盘上有无限多个格子,每个格子都有一个编号,最中间的格子编号为 0 ,0 号格子向右依次编号为 1,2,3, . . . ,向左依次编号为 −1, − 2, − 3, . . . 。
目标是要将一枚棋子从 x号格子移动到 y号格子。每一次操作有两种选择:
操作 1 :向右移动 1 个格子。
操作 2 :从当前棋子所在的 x 号格子,直接跳到 −x号格子(如:可以从 6 直接跳到 −6 ,也可以从 −6 直接跳到 6 )。
求棋子从 x 号格子移动到 y号格子需要的最少操作次数。
题目解析
观察题目,需要分情况讨论。
(1)x,y同号
(2)x,y异号
正解代码
#include<iostream>
#include<cmath>
using namespace std;
long long x,y,ans;
int main(){
cin>>x>>y;
long long len=abs(abs(x)-abs(y));
if(x*y>0){
if(x>y) ans=len+2;
else ans=len;
}else if(x*y<0){
ans=len+1;
}else{
if(x<y) ans=len;
else ans=len+1;
}
cout<<ans;
return 0;
}
T3 动物园(zoo)
题目情况
比赛时10分,比赛后AC
题目大意
某动物园里有 n 个场馆和 m 种动物(n ≤ m)。
n 个场馆的编号分别用 1,2,3, . . , n 表示;m 种动物的编号分别用 1,2,3, . . , m表示。每一个场馆中只饲养了一只动物,不同的场馆可能饲养着相同种类的动物。
这个动物园的门票比较特殊,游客在购买门票时必须说明要参观的场馆的起止编号 a 和 b(起止编号会打印到游客购买的门票上),代表游客只能参观动物园的第 a个场馆至第 b 个场馆(包含 a, b)里的动物,其他的场馆不能去。门票按一个场馆十元收费。
如果你购买的门票的起止场馆编号是 3 到 8,那么你需要花 60 元钱购买门票,只能观看3,4,5,6,7,8 号场馆的动物。
小明希望看到动物园内所有种类的动物,同时小明是个非常节约的孩子,他希望花最少的钱买门票。 请你帮小明计算:他最少需要花费多少钱买门票才能看到所有种类的动物(同一种动物他可能不止看一个)。注意:小明只能买一张门票。
题目解析
题目就是要找连续的一段
(1)利用双指针
(2)比较出最小
正解代码
#include<iostream>
using namespace std;
long long n,m,a[1000005],vis[1000005],l=1,r=0,cnt,ans=0x3f3f3f3f;
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
while(r<n){
while(cnt<m&&r<n){
r++;
vis[a[r]]++;
if(vis[a[r]]==1) cnt++;
}
while(cnt==m){
ans=min(ans,r-l+1);
vis[a[l]]--;
if(vis[a[l]]==0) cnt--;
l++;
}
}
cout<<10*ans;
return 0;
}
T4 摧毁(destroy)
题目情况
比赛时AC
题目大意
人类有两种不同的武器可以摧毁卫星,具体如下(其中 PW 为新的能量单位):(1)使用定点激光武器花费 1 PW 的代价摧毁任意轨道上指定的一个卫星。
(2)使用脉冲轨道武器花费 c PW 的代价把某一轨道上的所有卫星摧毁。
现在有 n 个旧卫星分布在不同的外轨道上,你的任务是摧毁这些旧卫星。给出这 n 个卫星的轨道编号,求将这些卫星全部摧毁的最小代价是多少?
题目解析
题目就是要求最小代价
(1)利用桶即可
(2)比较出最小
正解代码
#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
long long t,n,a[1000005],c,q,sum=0,maxx=0;
int main(){
freopen("destroy.in","r",stdin);
freopen("destroy.out","w",stdout);
cin>>t;
while(t--){
sum=0;
cin>>n>>c;
for(int i=1;i<=n;i++){
cin>>q;
maxx=max(maxx,q);
a[q]++;
}
for(int i=1;i<=maxx;i++){
sum+=min(a[i]*1,c);
}
cout<<sum<<"\n";
}
fclose(stdin);
fclose(stdout);
return 0;
}