S11004张皓泽补题报告

啊,又逝多么美好的一天啊!

一,考试分数

        第一题AC,第二题80分,第三题10分,第四题20分。已补题。总分自己算。

二,内心历程

        看到题的那一刻,我两眼一翻,差点没晕过去,这叫简单!我先做了最后一个题,好,做不出来,再看第三个题,好,没思路,第二个题,有点思路,写不出来,第一个题,总算是写出来了,不好,肚子疼!去和一位二百五蹲坑去了,啊!又过去了半个小时。总算是写出来第二个题,没时间了,三四题只能打暴力了。

三,题目分析

        T1.独木桥

        题目描述

        长度为 L的独木桥上有 n 个人,他们每个人都想以最快的时间离开危险的独木桥。已知每个人在独木桥上的行走速度为 1米 / 秒 ,每个人只要能走到独木桥的两个端点中的其中一个就可以离开独木桥。
        由于独木桥的桥面宽度很窄,只能容纳一个人通过,当两个人相遇时,他们无法交错通过,只能各自调转方向,继续沿反方向行走。
        给你独木桥上的人数 nn ,独木桥的长度 L , 第 i 个人的初始位置到独木桥左端点的距离a​i​​ 米(每个人开始的朝向未知,但他们可以根据需要随时调转行走的方向)。
        请计算出所有人同时出发,全部都离开独木桥所需的最短时间。

        输入格式

        第一行一个整数 n ,表示人数。
        第二行一个整数 L ,表示独木桥的长度(米)。
        第三行是a_1​​,a_2​​ …a_n​​ ,其中 a_i​ 表示第 i 个人初始位置到独木桥左端点 的距离。

        输出格式

        输出一行一个整数,表示所有人都离开独木桥所需的最短时间。

       “这个题十分的水啊”(老逝语),也是轻松拿到AC,就是,遍历代码,求最小值最大化,代码双手奉上!

        100分代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define endl "\n";
using namespace std;
const int N=1e6+10;
long long a[N],b[N],n,l,m=0;
int main() {
//	freopen("bridge.in","r",stdin);
//	freopen("bridge.out","w",stdout);
	cin>>n>>l;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i]=abs(a[i]-l);
	}
	for(int i=1;i<=n;i++){
		if(a[i]<b[i]){
			if(a[i]>m){
				m=a[i];
			}
		}else{
			if(b[i]>m){
				m=b[i];
			}
		}
	}
	cout<<m;
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}

T2.移动棋子

        题目描述

        一维的棋盘上有无限多个格子,每个格子都有一个编号,最中间的格子编号为 0 ,0 号格子向右依次编号为 1,2,3,… ,向左依次编号为 −1, −2, −3,… 。
        小明的目标是要将一枚棋子从 xx 号格子移动到 yy 号格子。
        每一次操作有两种选择:
        操作 1 :向右移动 1 个格子。
        操作 2 :从当前棋子所在的 a 号格子,直接跳到 −a 号格子(如:可以从 6 直接跳到 −6 ,也可以从 -6 直接跳到 6 )。
        可以证明,无论整数 x 和 y 的值是多少,目标总是可以实现的。
        请你设计程序,帮小明计算把棋子从 x 号格子移动到 y 号格子需要的最少操作次数。

        输入格式

        一行,两个整数 x 和 y , 表示要将棋子从 x 号格子移动到  y 号格子。

        输出格式

        一个整数,表示小明把棋子从 x 号格子移动到 y 号格子需要的最少操作次数。

        这个题就单纯一个比较,我错主要是两个原因,是样例测试不够和情况没考虑全,来吧上代码!

        80分代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define endl "\n";
using namespace std;
long long x,y,xx,yy;
int main() {
//	freopen("chess.in","r",stdin);
//	freopen("chess.out","w",stdout);
	cin>>x>>y;
	xx=abs(x);
	yy=abs(y);
	if(xx==yy){
		if(x==xx&&y==yy){
			cout<<0;
		}else if(x!=xx&&y!=yy){
			cout<<0;
		}else{
			cout<<1;
		}
	}else if(x==xx&&y==yy){
		cout<<(abs(xx-yy));
	}else if(x!=xx&&y!=yy){
		cout<<(abs(xx-yy)+2);
	}else{
		cout<<(abs(xx-yy)+1);
	}
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}
        100分代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define endl "\n";
using namespace std;
long long x,y,ans;
int main() {
//	freopen("chess.in","r",stdin);
//	freopen("chess.out","w",stdout);
	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++;
		}
	}
	cout<<ans;
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}

T3.动物园

        题目描述

        某动物园里有n个场馆和m种动物(m≤n)。

        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 号场馆的动物。

        小明希望看到动物园内所有种类的动物,同时小明是个非常节约(抠门)的孩子,他希望花最少的钱买门票。 请你帮小明计算:他最少需要花费多少钱买门票才能看到所有种类的动物(同
一种动物他可能不止看一个)。注意:小明只能买一张门票。

        输入格式

        第一行两个整数 n,m,分别表示动物园内的场馆数量及动物种类数量。

        第二行是 x​1​​,x​2​​,⋯,x​n​​,其中x_i表示第i个场馆中的动物种类编号。

        输出格式

        一行一个整数p,表示小明的门票费用。

        这个题要请出我们亲爱的老朋友,有请双指针上场,oi,今天,酱有他来为我没带来一段精彩绝伦的表演之抠门的小明!

        我们只需要定义两个头指针,在遍历就可以帮助抠门的小明了。这个题我直接写的暴力,对输出进行了调整,没想到还有十分。

        10分代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define endl "\n";
using namespace std;
int n,m,x[1000005],a,b,y[2005],ans;
int main() {
//	freopen("zoo.in","r",stdin);
//	freopen("zoo.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>x[i];
	}
	int k=m;
	while(b!=n){
		bool f=0;
		a=1;
		b=a+k;
		k++;
		for(int i=a;i<=b;i++){
			y[x[i]]=1;
		}
		for(int i=1;i<=m;i++){
			if(y[i]==0){
				f=1;
			}
		}
		if(f==0){
			ans=b-a+1;
		}
	}
	cout<<ans*10/2;
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}
        100分代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define endl "\n";
using namespace std;
long long n,m,a[1000005],vis[1000005],l=1,r,cnt,ans=0x3f3f3f3f;
int main() {
//	freopen("zoo.in","r",stdin);
//	freopen("zoo.out","w",stdout);
	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);
//			cout<<r<<"<<"<<l<<endl;
			vis[a[l]]--;
			if(vis[a[l]]==0) cnt--;
			l++;
		}
	}
	cout<<ans*10;
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}

T4.摧毁

        题目描述

        坐地日行八万里,巡天遥看一千河。

        2077年,人类不仅仅是赛博科技得到了发展,太空技术也已经得到了极大的发展。地球的不同外轨道上已经充斥着各种功能用途的人造卫星。因为一个轨道上的卫星数量是有上限的,且卫星更新换代速度很快,如果想要发射新的卫星,需要把所有旧的卫星摧毁。

        人类有两种不同的武器可以摧毁卫星,具体如下(其中PW为新的能量单位):
        (1)使用定点激光武器花费 1 PW 的代价摧毁任意轨道上指定的一个卫星。
        (2)使用脉冲轨道武器花费 c PW 的代价把某一轨道上的所有卫星摧毁。

        现在有n个旧卫星分布在不同的外轨道上,你的任务是摧毁这些旧卫星。给出这n个卫
星的轨道编号,求将这些卫星全部摧毁的最小代价是多少?

        输入格式

        第一行一个正整数T,表示测试数据组数。

        接下来对于每组测试数据(注意:每组测试数据有2行数据,以下共2*T行数据):

        第一行两个正整数n和c表示需要摧毁的卫星数量和使用脉冲轨道武器的代价。

        第二行 是x​1​​,x​2​​,⋯,x​n​​,其中x​i​​表示第i个卫星的轨道编号。

        输出格式

        输出T行答案,对于每组测试数据,输出一行一个整数表示摧毁所有卫星的代价。

        在考试中,我把卫星看作美食,可以花1元钱吃1个美食,也可以花c元吃一条线上的美食,但最后我还是因为代码出了小问题才拿了20分,也逝十分简单啊,来,三,二,一,上代码!!!

20分代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define endl "\n";
using namespace std;
long long t,n,c,a[1005],x[1005],maxx,j,ans;
int main() {
//	freopen("destroy.in","r",stdin);
//	freopen("destroy.out","w",stdout);
	cin>>t;
	cin>>n>>c;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		x[a[i]]++;
	}
	for(int i=1;i<=1000;i++){
		if(maxx<=x[i]){
			maxx=x[i];
//			cout<<maxx<<"      ";
			j=i;
		}
		if(maxx>c){
			x[j]=0;
			ans+=c;
		}else{
			ans+=x[i];
		}
	} 
	cout<<ans;
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}
100分代码
#include<iostream>
#include<cstdio>
#include<cstring>
#define endl "\n";
using namespace std;
long long t,n,c,a,x[5000010],maxx,j,ans;
int main() {
//	freopen("destroy.in","r",stdin);
//	freopen("destroy.out","w",stdout);
	cin>>t;
	while(t--) {
		cin>>n>>c;
		ans=0;
		memset(x,0,sizeof x);
		for(int i=1; i<=n; i++) {
			cin>>a;
			x[a]++;
		}
		for(int i=1;i<=5000005;i++){
			ans+=min(c,x[i]);
		}
		cout<<ans<<endl;
	}
//	fclose(stdin);
//	fclose(stdout);
	return 0;
}

四,总结

这此考试成绩还行吧,争取下次烤得更香。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值