模拟二补题报告

一、题目报告

第一题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;
} 

由于能力有限,代码可能不够完整,还请高人指教

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值