S06463尹一珩
总报告
2024.10.4尹一珩补题报告
270分,虽然比上次高,但是第一题应该AC的,下次要更细心.
题目得分
50,60,60,100
题目1:独木桥(bridge)
题目内容
时空限制
1s 128M
问题描述(简化版)
长度为 L 米的独木桥上有 n 个人,他们每个人都想以最快的时间离开独木桥。每个人在独木桥上的行走速度为 1 米 / 秒 ,每个人只要能走到独木桥的两个端点中的其中一个就可以离开独木桥。
由于独木桥只能容纳一个人通过,当两个人相遇时,他们无法交错通过。
给你独木桥上的人数 n ,独木桥的长度 L , 第 i 个人的初始位置到独木桥左端点的距离 Ai 米(每个人开始的朝向未知,但他们可以根据需要随时调转行走的方向)。
计算出所有人同时出发,全部离开独木桥所需的最短时间。
做题过程&结果
AC代码&AC思路
AC代码:
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
int n,l,maxx=-1,m;
int main(){
//freopen("bridge.in","r",stdin);
//freopen("bridge.out","w",stdout);
cin>>n>>l;
for(int i=1;i<=n;i++){
cin>>m;
if(min(m,l-m)>maxx) maxx=min(m,l-m);
}
cout<<maxx;
//fclose(stdin);
//fclose(stdout);
return 0;
}
思路较简单,即计算出离桥面中点最近的人离开桥的最快时间。
错误原因
错因其实很冤,第一遍敲完是可以直接AC的(哇真牛逼),手欠加了个“-1”,丢了50分啊!(看走眼了,这人是个XX)
总结
一定要认真读题,一失足成千古恨啊!
题目2:移动棋子(chess)
题目内容
时空限制
1s 128M
问题描述(简化版)
一维的棋盘上有无限个格子,每个格子都有一个编号,最中间的格子编号为 0 ,0 号格子向右依次编号为 1,2,3,… ,向左依次编号为 −1, −2, −3,…
小明的目标是要将一枚棋子从 x 号格子移动到 y 号格子。
每一次操作有两种选择:
操作 1 :向右移动 1 个格子。
操作 2 :从当前棋子所在的 a 号格子,直接跳到 −a 号格子(如:可以从 6 直接跳到 −6 ,也可以从 −6 直接跳到 6 )。
计算把棋子从 x 号格子移动到 y 号格子需要的最少操作次数。
做题过程&结果
AC代码&AC思路
AC代码:
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
long long x,y,cnt;
int main(){
//freopen("chess.in","r",stdin);
//freopen("chess.out","w",stdout);
cin>>x>>y;
if(abs(x)==abs(y)) cout<<1;
else if(x*y>=0&&y>x){
cout<<abs(y-x);
}else if(x>y&&x*y>=0){
cout<<abs(x-y)+2;
}else if(x*y<0){
cout<<abs(abs(x)-abs(y))+1;
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
本题将x,y两个数分成多种情况,虽然类似于骗分代码,但是的确是很好的思路
if:如果x的绝对值等于y的绝对值,直接操作2(数据范围规定x不会等于y);
else if:x与y同是正数或同是负数且y比x大,直接相减;
else if:x与y同是正数或同是负数但是y比x小,需要执行两次操作2,所以+2(先操作2再右移到0-y的位置,再操作2);
else if:x和y一正一负,执行一次操作2并右移即可。
错误原因
想简单了(丢了40分),下次必须要分类考虑(除非有公式或其他类型)
总结
多出样例,否则判题机会让你死无全尸(好吧,这次它给我留了个全尸,60分)
题目3:动物园(zoo)
题目内容
时空限制
1s 128M
问题描述(简化版)
有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 号场馆的动物。
小明希望看到动物园内所有种类的动物,同时他希望花最少的钱买门票。 请你最少需要花费多少钱买门票才能看到所有种类的动物(同一种动物可能不止看一个)。注意:只能买一张门票。
做题过程&结果
AC代码&AC思路
AC代码:
#include<iostream>
#include<cmath>
#include<string>
using namespace std;
int n,m,a[1000009],t[1000009],cnt,ans=1000009;
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];
int l=1,r=1;
while(r<=n){
t[a[r]]++;
if(t[a[r]]==1) cnt++;
while(t[a[l]]>=2){
t[a[l]]--;
l++;
}
r++;
if(cnt==m) ans=min(ans,r-l);
}
cout<<ans*10;
//cout<<'\n'<<"L:"<<ml<<" R:"<<mr-1;
//fclose(stdin);
//fclose(stdout);
return 0;
}
双~指~针~扫~描~
题目是求包含m个品种的最短子序列。
定义l,r,去扫描整个地图,不断右移右端点r,用while去看l的位置,随后求最小值即可。
时间复杂度为线性,很好用。
错误原因
我不太擅长双指针, 尽管我知道要用它,我就写了个双层for模拟,妄想卡过去,果然竟然被判题机制裁了,TLE了四个点。
总结
C++难题千千万,双指针扫描占一半。若想拒绝TLE,双指针扫描要学好。
到时候直接骗分吧
题目4:摧毁(destroy)
题目内容
时空限制
1s 128M
问题描述(简化版)
人类有两种不同的武器可以摧毁卫星,具体如下(PW为新的能量单位):
(1) 使用定点激光武器花费 1 PW
的代价摧毁任意轨道上指定的一个卫星。
(2) 使用脉冲轨道武器花费 c PW
的代价把某一轨道上的所有卫星摧毁。
现在有n个旧卫星分布在不同的外轨道上,你的任务是摧毁这些旧卫星。给出这n个卫
星的轨道编号,求将这些卫星全部摧毁的最小代价是多少?
做题过程&结果
AC代码&AC思路
AC代码:
#include<bits/stdc++.h>
using namespace std;
int t,n,c,x,nums[1000009],times[1000009],maxpos,cnt,pos,j;
bool cmp(int a,int b){
return a<b;
}
int main(){
//freopen("destroy.in","r",stdin);
//freopen("destroy.out","w",stdout);
cin>>t;
while(t--){
cin>>n>>c;
maxpos=1;
memset(times,0,sizeof(times));
for(int i=1;i<=n;i++){
cin>>x;
if(x!=nums[maxpos-1]) nums[maxpos++]=x;
times[x]++;
}
sort(nums+1,nums+maxpos,cmp);
cnt=0,pos=1;
for(int i=1;i<maxpos;i++){
if(times[i]>c) cnt+=c;
else cnt+=times[i];
}
cout<<cnt<<'\n';
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
看一看每个轨道上的卫星数,若用脉冲武器(连锁一条轨道)划算,计数器+=脉冲武器花费。否则就用定点激光一个一个打下来。
错误原因
一次AC,芜湖~
总结
第一题还是要好好做,第一题50第四题AC,啊真的没谁了。