2023CSP-J2 VP记

One night , I burned all my memories , and since then my dreams have been transparent.

One morning , I threw away all my yesterdays , and since then I have been light on my feet.

有一个夜晚我烧毁了所有的记忆,从此我的梦就透明了,

有一个早晨我扔掉了所有的昨天,从此我的脚步就轻盈了。

前言

坐标SD,提高组的废物。此蒟蒻因为某些不可抗因素太弱了没去成二轮,于是在家里谔谔。上周决定暂时AFO,VP一下J组的题,反正大概也写不出几道。

64aacbda0e9127ad82c86ae2239aabe2.gif


试题传送门:

CSP-J2023第二轮(入门级)试题


题解

T1:

模拟,但是n<=eq?%2410%5E9%24,手动写了一遍样例,发现规律:

每一天减去拿的苹果数量,即减去向上取整n/3。然后你会发现标号为n的苹果数量将会在n%3==1时被拿。TAT

#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int n,cnt,ans;
int main()
{
	//freopen("apple.in","r",stdin);
	//freopen("apple.out","w",stdout);
	scanf("%d",&n);
	while(n)
	{
		cnt++;
		if(n%3==1&&ans==0) ans=cnt;
		n-=ceil(n/3.0); 
	}
	printf("%d %d",cnt,ans);
	//fclose(stdin);
	//fclose(stdout);
	return 0;
 } 

T1一如既往的代码量很少qwq。

发现小图灵有很多90pts的,会不会是暴力的锅.......阿哲。


T2:

一眼贪心,有点像洛谷P1016 [NOIP1999 提高组] 旅行家的预算,像原题弱化版awa

每次买够正好能到达下一个油价小于当前站点的站点的油。

预处理:用f储存每次行程需要在哪个站点购买油,用minn储存这个站点的油价。

一次循环:sum表示需要走的距离,x表示当前剩余油能够走的距离。

计算油量时需要向上取整,可以函数ceil(),或者手写。

#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
const int N=100000+10;
int n,d,v[N],a[N];
int minn[N],f[N];
long long ans;
int main()
{
	//freopen("road.in","r",stdin);
	//freopen("road.out","w",stdout);
	scanf("%d %d",&n,&d);
	for(int i=2;i<=n;i++) scanf("%d",&v[i]);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	minn[1]=a[1],f[1]=1;
	for(int i=2;i<n;i++)
    {
		if(a[i]<minn[i-1]) f[i]=i;
		else f[i]=f[i-1];
		minn[i]=min(minn[i-1],a[i]);
	}
	minn[n]=minn[n-1],f[n]=f[n-1];
	//for(int i=1;i<=n;i++) cout<<minn[i]<<" "<<f[i]<<endl;
	int i=1,x=0;
	while(i<n)
	{
		long long sum=0;
		int j;
		for(j=i+1;j<=n&&f[i]==f[j-1];j++) sum+=v[j];
		sum-=x;
		x=ceil(sum*1.0/d)*d-sum;
		ans+=ceil(sum*1.0/d)*minn[i];
		i=--j;
    }
	printf("%lld\n",ans); 
	//fclose(stdin);
	//fclose(stdout);
	return 0;
} 

调了两小时,总算过了。

200pts到手,T1+T2估计用时2h30min,还剩1h,感觉还能写T3。

注意:ans和sum都要开long long!十年OI一场空,不开long long见祖宗。qwq


T3:

CCF是懂大模拟的......

意料之中的大模拟,有点缺氧。

看到题目,这周数学刚学了一元二次方程(喜)

通过观察数据范围,我们发现6个点是特殊性质为C,即a、b都是整数(有理数),故我们可以光写出这一部分的解。

#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
void solve(int a,int b,int c)
{
	int dlt=b*b-4*a*c;
	double x1=(-1.0*b-sqrt(dlt))/(2.0*a);
	double x2=(-1.0*b+sqrt(dlt))/(2.0*a);
	if(sqrt(dlt)*sqrt(dlt)==b*b-4*a*c)//有理数 
	{
		int d=2*a,u;
		if(x1>x2) u=-1*b-sqrt(dlt);
		else u=-1*b+sqrt(dlt);
		u/=__gcd(abs(u),abs(d)),d/=__gcd(abs(u),abs(d));//约分
		if(u<0&&d<0) u*=-1,d*=-1;
		else if(u>0&&d<0) u*=-1,d*=-1;
		if(u%d==0) printf("%d\n",u/d);
		else printf("%d/%d\n",u,d);
	}
	else printf("\n");
}
int main()
{
	//freopen("uqe.in","r",stdin);
	//freopen("uqe.out","w",stdout);
	int T,M;
	scanf("%d %d",&T,&M);
	while(T--)
	{
		int a,b,c;
		scanf("%d %d %d",&a,&b,&c);
		int dlt=b*b-4*a*c;
		if(dlt<0) printf("NO\n");
		else solve(a,b,c);
	}
	//fclose(stdin);
	//fclose(stdout);
	return 0;
} 

洛谷上60pts。非有理数部分写不动了。 


T4:

万万没想到,今年J组竟然会出最短路qaq,不过这道题似乎可以用BFS做。题目好抽象,看了一会感觉写不出来(我图论学了s),然后我就摆了。T_T

b1569633ddca4ec5b42f4541975bf234.jpeg

 来自kkksc03的认证。

于是

#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int n,m,k; 
int u,v,a;
int main()
{
	//freopen("bus.in","r",stdin);
	//freopen("bus.out","w",stdout);
	scanf("%d %d %d",&n,&m,&k);
	while(m--) scanf("%d %d %d",&u,&v,&a);
	printf("-1\n");
	//fclose(stdin);
	//fclose(stdout);
	return 0;
}

写了个骗分......嘻嘻


完结。民间数据100+100+60+10=270pts。实际预计250pts+,大概能1=。我是废物qwq

31901d8826694b6cacf9f84d2a401d8b.png

on 2023/10/21

-EOF- 


Update on 2023/10/22

看了S组的题,就能写出T1(我太菜了qwq)而且不一定对。话说今年T1似乎有点像水题,难道是幻觉???

希望明年能RP++。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FFTcwlath

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值