CSP-J 2023 题解

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。

posted @ 2024-03-25 13:51  cppom  阅读(16)  评论(0编辑  收藏  举报