首页 > 其他分享 >CSP-J 2023 题解

CSP-J 2023 题解

时间:2024-03-25 13:56:16浏览次数:38  
标签:题解 LL dis CGfm 2023 CGfz lld CSP define

T1

这么水?!

赛时AC。

思路:小学数学题,我孙子都会做

认真点。

就是余数和商,小学二年级的知识(毕导:亻尔女子)

代码:

#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL n,sum;
LL t(LL a)
{
	if(a!=1)return 1+t(a-((a-1)/3+1));
	else return 1;
}
int main()
{
   scanf("%lld",&n);
	printf("%lld ",t(n));
	while((n-1)%3!=0)
	{
		sum++;
		n-=(n-1)/3+1;
	}
	printf("%lld",sum+1);
	return 0;
}

T2

贪心。

赛时打挂了,15分。

正解:每次当跑不到下一个站点的时候就“跑回”目前遇到的最便宜的站点加油。

错因:看代码:

#include<stdio.h>
#include<bits/stdc++.h>
#define N 100010
#define MOD 998244353
#define esp 1e-8
#define INF 999999999999999999
#define LL long long
#define rep(i,a,b,g) for(LL i=a;i<=b;i+=g)
#define rem(i,a,b,g) for(LL i=a;i>=b;i-=g)
#define repn(i,a,b,g) for(LL i=a;i<b;i+=g)
#define remn(i,a,b,g) for(LL i=a;i>b;i-=g)
#define pll pair<LL,LL>
#define mkp(x,y) make_pair(x,y)
#define i128 __int128
#define lowbit(x) ((x)&(-(x)))
#define lc (u<<1)
#define rc (u<<1|1)
using namespace std;
void read(i128 &x)
{
	i128 f=1;
	x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	x*=f;
}
void write(i128 x)
{
	if(x>=10)write(x/10);
	putchar(x%10+'0');
}
LL n,d,v[N],a[N],lama=INF,dis,sum;
int main()
{
	cin>>n>>d;
	rep(i,1,n-1,1)cin>>v[i];
	rep(i,1,n,1)cin>>a[i];
	rep(i,1,n-1,1)
	{
		if(lama>a[i])
		{
			lama=a[i];
		}
		if(dis<v[i])
		{
			LL t=v[i]-dis;
			t=(t/d)+((t%d)>0);
			sum+=t*lama;
			dis+=t*d;
		}
		dis-=v[i];//这里,我赛时放在if里面了...
	}
	cout<<sum<<endl;
	return 0;
}

T3

还真是大模拟?!小周老师是不是偷题了?!

就按照题目说的做啊。

没有任何思维难度。

哦有个坑就是正负号的问题。

赛时60分。

错因:见代码:

#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL t,m,a,b,c,CGfz,CGfm,f;
LL CGfz1,CGfz2,CGfm1,CGfm2;
double CG1,CG2;
int pf[10004200];
void init()
{
	for(int i=0;i<=3030;i++)pf[i*i]=i;//这里,2000不够啊
}
LL CGd(LL a,LL b)
{
	if(b==0)return a;
	return CGd(b,a%b);
}
int main()
{
    init();
    scanf("%lld%lld",&t,&m);
    while(t--)
    {
    	scanf("%lld%lld%lld",&a,&b,&c);
    	LL s=b*b-4*a*c;
    	if(s<0)
    	{
    		printf("NO\n");
    		continue;
		}
		if(s==0)
		{
			CGfz=-b;
			CGfm=2*a;
			f=CGd(CGfz,CGfm);
			CGfz/=f;
			CGfm/=f;
			if(CGfm<0&&CGfz>0)
			{
				CGfm=-CGfm;
				CGfz=-CGfz;
			}
			if(CGfm==1)
			{
				printf("%lld\n",CGfz);
			}
			else
			{
				printf("%lld/%lld\n",CGfz,CGfm);
			}
			continue;
		}
		if(pf[s])
		{
			CGfz1=-b-pf[s];
			CGfz2=-b+pf[s];
			CGfm1=2*a;
			CGfm2=2*a;
			f=CGd(CGfz1,CGfm1);
			CGfz1/=f;
			CGfm1/=f;
			if(CGfm1<0&&CGfz1>0)
			{
				CGfm1=-CGfm1;
				CGfz1=-CGfz1;
			}
			f=CGd(CGfz2,CGfm2);
			CGfz2/=f;
			CGfm2/=f;
			if(CGfm2<0&&CGfz2>0)
			{
				CGfm2=-CGfm2;
				CGfz2=-CGfz2;
			}
			CG1=CGfz1*1.0/CGfm1;
			CG2=CGfz2*1.0/CGfm2;
			if(CG1>CG2)CGfm=CGfm1,CGfz=CGfz1;
			else CGfm=CGfm2,CGfz=CGfz2;
			if(CGfm==1)
			{
				printf("%lld\n",CGfz);
			}
			else
			{
				printf("%lld/%lld\n",CGfz,CGfm);
			}
			continue;
		}
		if(b!=0)
		{
			CGfz=-b;
			CGfm=2*a;
			f=CGd(CGfz,CGfm);
			CGfz/=f;
			CGfm/=f;
			if(CGfm<0&&CGfz>0)
			{
				CGfm=-CGfm;
				CGfz=-CGfz;
			}
			if(CGfm==1)
			{
				printf("%lld+",CGfz);
			}
			else
			{
				printf("%lld/%lld+",CGfz,CGfm);
			}
		}
		CGfz=1;
		CGfm=2*a;
		for(int i=2;i<=3030;i++)
		{
			while(s%(i*i)==0)
			{
				s/=(i*i);
				CGfz*=i;
			}
		}
		f=CGd(CGfz,CGfm);
		CGfz/=f;
		CGfm/=f;
		if(CGfz==CGfm)
		{
			printf("sqrt(%lld)\n",s);
			continue;
		}
		if(CGfz%CGfm==0)
		{
			CGfz=labs(CGfz/CGfm);
			if(CGfz==1)printf("sqrt(%lld)\n",s);
			else printf("%lld*sqrt(%lld)\n",CGfz,s);
			continue;
		}
		if(CGfz==1)
		{
			CGfm=labs(CGfm);
			printf("sqrt(%lld)/%lld\n",s,CGfm);
			continue;
		}
		printf("%lld*sqrt(%lld)/%lld\n",labs(CGfz),s,labs(CGfm));
	}
	return 0;
}

T4

赛时没正解,骗了10分。

由于作者懒放个同学写的题解链接

代码:

#include<stdio.h>
#include<bits/stdc++.h>
#define N 1000010
#define MOD 998244353
#define esp 1e-8
#define INF 999999999999999999
#define LL long long
#define rep(i,a,b,g) for(LL i=a;i<=b;i+=g)
#define rem(i,a,b,g) for(LL i=a;i>=b;i-=g)
#define repn(i,a,b,g) for(LL i=a;i<b;i+=g)
#define remn(i,a,b,g) for(LL i=a;i>b;i-=g)
#define pll pair<LL,LL>
#define mkp(x,y) make_pair(x,y)
#define i128 __int128
#define lowbit(x) ((x)&(-(x)))
#define lc (u<<1)
#define rc (u<<1|1)
using namespace std;
void read(i128 &x)
{
	i128 f=1;
	x=0;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	x*=f;
}
void write(i128 x)
{
	if(x>=10)write(x/10);
	putchar(x%10+'0');
}
LL n,m,k,dis[10010][110];
bool f[10010][110];
vector<pll >e[10010];
priority_queue<pll,vector<pll >,greater<pll > >q;//赛时这里是普通queue,然后TLE力
void add(LL u,LL v,LL w)
{
	e[u].push_back({v,w});
}
void dij(LL s)
{
	dis[s][0]=0;
	q.push({0,s});
	while(!q.empty())
	{
		LL u=q.top().second,p=q.top().first;
		q.pop();
		if(f[u][p%k])continue;
		f[u][p%k]=1;
		for(auto d:e[u])
		{
			LL v=d.first,w=d.second,t=(p+1)%k;
			if(p>=w)t=p;
			else
			{
				t=((w-p+k-1)/k)*k+p;
			}
			if(dis[v][(t+1)%k]>t+1)
			{
				dis[v][(t+1)%k]=t+1;
				q.push({t+1,v});
			}
		}
	}
}
int main()
{
	memset(dis,0x3f,sizeof(dis));
	cin>>n>>m>>k;
	rep(i,1,m,1)
	{
		LL u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
	}
	dij(1);
	if(!f[n][0])cout<<-1<<endl;
	else cout<<dis[n][0]<<endl;
	return 0;
}

闲话:TB认为用queue能AC但我TLE10分了,傻逼TB。

标签:题解,LL,dis,CGfm,2023,CGfz,lld,CSP,define
From: https://www.cnblogs.com/cppom/p/-/CSPJ2023tijie

相关文章

  • AT_arc175_a [ARC175A] Spoon Taking Problem 题解
    题目翻译link有\(N\)人围坐在一张圆桌旁,按逆时针顺序编号为\(1\)至\(N\)。每个人都有一个惯用手圆桌上有\(N\)把勺子,编号为\(1\)到\(N\),每对相邻的人之间放一把勺子给你一个\((1,\dots,N)\)的排列组合\((P_1,\dots,P_N)\)。在\(i=1,\dots,N\)的顺序中,人......
  • 题解:AT_abc345_c [ABC345C] One Time Swap
    求过审题面翻译给定一个字符串$s$,求执行以下操作一次可以产生的字符串的个数设$N$为$s$的长度。选择一对整数$(i,j)$,使$1≤i<j≤N$,交换$s$的第$i$个和第$j$个字符可以证明,在这个问题的约束条件下,你总是可以得到它思路暴力做法我们可以......
  • JavaScript:void(0) 用法及常见问题解析
    JavaScript:void(0)用法及常见问题解析javascript:void(0);是一种在JavaScript和网页开发中经常使用的技术,尤其在处理链接的行为时。本文将深入探讨javascript:void(0);的用法,以及在使用过程中可能遇到的常见问题和解决方法。什么是javascript:void(0);?javascript:v......
  • LeetCode第390场周赛题解(c++)
    真的无语了,早上怎么都提交不了,显示未知错误。。。结果晚上就可以提交了。唉100245.每个字符最多出现两次的最长子字符串给你一个字符串 s ,请找出满足每个字符最多出现两次的最长子字符串,并返回该子字符串的 最大 长度。示例1:输入: s="bcbbbcba"输出: 4解释:以......
  • [题解]HDU1024 Max Sum Plus Plus
    HDU1024这道题是一道很巧妙的\(dp\)题(虽然优化成一维,可是究其本质算不算二维\(dp\)?如果有明白的麻烦在评论说一下多谢),在上一篇文章——线性\(dp\)模型中也提到过,因为其前身其实就是上一篇写到的「最大连续子段和」。只不过这一题问的不是一段,而是\(m\)段,所以较上一题我们的选择......
  • AtCoder Beginner Contest 346 题解
    A-AdjacentProductQuestion给你\(N\)个整数\(A_1,A_2,\dots,A_N\)。同时,定义\(B_i=A_i\timesA_{i+1}\(1\leqi\leqN-1)\)按此顺序打印\(B_1,B_2,\dots,B_{N-1}\)Solution按照题意模拟Code#include<bits/stdc++.h>usingnamespacestd;intmain......
  • AT_abc344_D-String Bags 题解
    明显是DP。然后就开始分析:状态:\(dp_{ij}=\)有\(i\)个袋子且匹配\(T\)的前缀的长度为\(j\)时所需的最少钱数。匹配\(T\)的前缀的长度为\(j\)就是前\(j\)个字符与\(T\)的前\(j\)个字符相同。相对简单。然后看转移。为了方便,咱不妨令\(|S|\)为字符串\(S......
  • P10111 [GESP202312 七级] 纸牌游戏 题解
    看标签知道要用DP。于是开始分析。状态:$dp(i,j,k)=$前\(i\)轮中,第\(i\)轮出\(j\),一共换了\(k\)次牌的最大钱数。很好理解。转移也不难,不就是不换和换两种吗!所以,转移就是:\[dp(i,j,k)=\max\begin{cases}dp(i-1,j,k)+\operatorname{pk}(j,c_i)\times......
  • [暴力题解系列]2023年蓝桥杯-整数删除(30分)
    这题暴力最多30分,但是30分也是分,做暴力的人不能贪心,拿到分就是赚了。​ 这题核心烦人点在于他数据分层断崖,就只有前3个点能做到稳过。用的思路就是链表,但不是用指针存的,而是用数组下标为标记存的,只是我觉得因为这样好写一些。链表方便修改左右连接位置,所以越到后面就越能省下查询......
  • 0318-0324题解
    成信大天梯赛L1-6二进制因为二进制是逢二进一,所以我们只要用cnt记录一下每一位上的数并给它加起来,然后cnt%2便是其和这一位上的数,注意要从右往左开始点击查看代码#include<bits/stdc++.h>usingnamespacestd;typedefpair<int,int>pii;voidsolve(){stringa,b......