洛谷题解小合集

兄弟们,终于写上题解了,555(bushi


一,P1724 东风谷早苗

题目传送门

废话不多说,直接开整。

首先,我们拿到这一道题肯定立马模拟。那就写吧!

#include<bits/stdc++.h>
using namespace std;
char a[5055];
long long T,n,x,y;
int main()
{
	long long i,j; //看看数据范围
	cin>>a;
	n=strlen(a); //长度
	cin>>T;
	j=0;
	for(i=1;i<=T;i++)   //模拟
	{
		if(j==n)
		{
			j=0;
		}
		if(a[j]=='N')
		{
			y=y+1;
		}
		if(a[j]=='E')
		{
			x=x+1;
		}
		if(a[j]=='S')
		{
			y=y-1;
		}
		if(a[j]=='W')
		{
			x=x-1;
		}
		j++;
	}
	cout<<x<<" "<<y;
	return 0;
}
呵,别人暴力模拟60分,我80分

代码注释里写了,只有80分。该怎么优化呢?

只能说这道题的数据范围是真感人呐!

假设字符串长度为N,那么我们可以把N个操作看成一轮,剩下的TmodN个操作的单独枚举。

建议特判一下1。这样我觉得优化效果更棒。

AC code:

#include<bits/stdc++.h>
using namespace std;
char a[5055];
long long T,n,x,y,o,k;
int main()
{
	long long i,j;
	cin>>a;
	n=strlen(a);
	cin>>T;
	if(n==1) //特判
	{
		if(a[0]=='N')
		{
			cout<<0<<" "<<T;
			return 0;
		}
		if(a[0]=='E')
		{
			cout<<T<<" "<<0;
			return 0;
		}
		if(a[0]=='S')
		{
			cout<<0<<" "<<-T;
			return 0;
		}
		if(a[0]=='W')
		{
			cout<<-T<<" "<<0;
			return 0;
		}
	}
	for(i=0;i<n;i++)   //一轮
	{
		if(a[i]=='N')
		{
			y=y+1;
		}
		if(a[i]=='E')
		{
			x=x+1;
		}
		if(a[i]=='S')
		{
			y=y-1;
		}
		if(a[i]=='W')
		{
			x=x-1;
		}
	}
	o=T/n;k=T%n;  //要执行的轮数和剩下的操作个数
	x=x*o;y=y*o;  //x和y的状态
	for(i=0;i<k;i++)   //剩下的操作
	{
		if(a[i]=='N')
		{
			y=y+1;
		}
		if(a[i]=='E')
		{
			x=x+1;
		}
		if(a[i]=='S')
		{
			y=y-1;
		}
		if(a[i]=='W')
		{
			x=x-1;
		}
	}
	cout<<x<<" "<<y;
	return 0;
}

二,P9752 [CSP-S 2023] 密码锁

题目传送门

这道题被广大OIers们称为最水的提高组题目。

是的,我也认同。我这个普及组蒟蒻瞎凑什么热闹

洛谷题解区的方法没看太懂,自己想了个方法:

(这道题水就水在n实在太小了但凡大一点点我觉得都过不了

你给出的不是正确密码的n种状态吗?我就把每一个错误密码可能对应的正确密码存到一个五维数组里,最后统计哪些正确密码出现了n次不就行了。桶排思想,至少我觉得是。

AC code:

最近正在练cstdio,呵呵

#include<bits/stdc++.h>
using namespace std;
int n,a,c,d,e,r,b[10][10][10][10][10];
int main()
{
	int i,j,k,f,p;
	scanf("%d",&n);//输入
	for(i=1;i<=n;i++)
	{
		scanf("%d%d%d%d%d",&a,&c,&d,&e,&r);  //输入
		for(j=1;j<=9;j++)  //最多转九次
		{
			for(f=1;f<=2;f++)  //可以转一个或相邻两个
			{
				if(f==1)   //一个
				{
                    //所有可能的状态,模10是因为可能大于10
					b[(a+j)%10][c][d][e][r]++;
					b[a][(c+j)%10][d][e][r]++;
					b[a][c][(d+j)%10][e][r]++;
					b[a][c][d][(e+j)%10][r]++;
					b[a][c][d][e][(r+j)%10]++;
				}
				if(f==2)  //相邻两个
				{
					b[(a+j)%10][(c+j)%10][d][e][r]++;
					b[a][(c+j)%10][(d+j)%10][e][r]++;
					b[a][c][(d+j)%10][(e+j)%10][r]++;
					b[a][c][d][(e+j)%10][(r+j)%10]++;
				}
			}
		}
	}
	int ans=0;
    //统计,这个虽然五重,但O(100000)的时间复杂度,呵呵
	for(i=0;i<=9;i++)
	{
		for(j=0;j<=9;j++)
		{
			for(k=0;k<=9;k++)
			{
				for(f=0;f<=9;f++)
				{
					for(p=0;p<=9;p++)
					{
						if(b[i][j][k][f][p]==n)  //n种状态都包含
						{
							ans++;
						}
					}
				}
			}
		}
	}
	printf("%d",ans); //这里没有&好吧
	return 0;
}

三,P1125 [NOIP2008 提高组] 笨小猴

题目传送门

这道题比密码锁还水吧

直接5min写出代码

AC code:

桶排的思想YYDS,剩下没什么说的

#include<bits/stdc++.h>
using namespace std;
int a[400],maxn=-0x3f3f3f3f,minn=0x3f3f3f3f;
char s[155];
int main()
{
	int n,i,j,cnt=0,c;
	cin>>s;
	n=strlen(s);
	for(i=0;i<n;i++)
	{
		a[(int)s[i]]++;
	}
	for(i=1;i<=300;i++)
	{
		if(a[i]==0)
		{
			continue;
		}
		if(a[i]>maxn)
		{
			maxn=a[i];
		}
		if(a[i]<minn)
		{
			minn=a[i];
		}
	}
	c=maxn-minn;
	for(i=1;i<=c;i++)
	{
		if(c%i==0)
		{
			cnt++;
		}
	}
	if(cnt==2)
	{
		cout<<"Lucky Word"<<endl<<c;
	}
	else
	{
		cout<<"No Answer"<<endl<<0;
	}
	return 0;
}

四,P1234 小 A 的口头禅

题目传送门

(1234,呵呵,真顺溜)

这是我的第一份代码,很浅显易懂,不多解释

#include<bits/stdc++.h>
using namespace std;
char a[1055][1055];
int n,m,ans=0;
int main()
{
	int i,j;
	cin>>n>>m;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
			cin>>a[i][j];
		}
	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
			if(a[i][j]=='h')
			{
				if(a[i][j+1]=='e'&&a[i][j+2]=='h'&&a[i][j+3]=='e')
				{
					ans++;
					break;
				}
				if(a[i][j-1]=='e'&&a[i][j-2]=='h'&&a[i][j-3]=='e')
				{
					ans++;
					break;
				}
				if(a[i+1][j]=='e'&&a[i+2][j]=='h'&&a[i+3][j]=='e')
				{
					ans++;
					break;
				}
				if(a[i-1][j]=='e'&&a[i-2][j]=='h'&&a[i-3][j]=='e')
				{
					ans++;
					break;
				}
			}
		}
	}
	cout<<ans*2;
	return 0;
}

美汁汁提交一下:

悲伤往事

洛谷测评器红彤彤的热情,我收到了

你猜哪里错了?哎,不应该加break。就**错这了。

AC code:

#include<bits/stdc++.h>
using namespace std;
char a[1055][1055];
int n,m,ans=0;
int main()
{
	int i,j;
	cin>>n>>m;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
			cin>>a[i][j];
		}
	}
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		{
			if(a[i][j]=='h')
			{
				if(a[i][j+1]=='e'&&a[i][j+2]=='h'&&a[i][j+3]=='e')
				{
					ans++;
				}
				if(a[i][j-1]=='e'&&a[i][j-2]=='h'&&a[i][j-3]=='e')
				{
					ans++;
				}
				if(a[i+1][j]=='e'&&a[i+2][j]=='h'&&a[i+3][j]=='e')
				{
					ans++;
				}
				if(a[i-1][j]=='e'&&a[i-2][j]=='h'&&a[i-3][j]=='e')
				{
					ans++;
				}
			}
		}
	}
	cout<<ans;
	return 0;
}

五,P8738 [蓝桥杯 2020 国 C] 天干地支

题目传送门

哎,该说不说还是一道水题

我们学校自己比赛时就出了这道题,我的赛时AC代码(以下代码很恐怖,胆小慎入)

#include<bits/stdc++.h>
using namespace std;
int main()
{
//	freopen("era.in","r",stdin);
//	freopen("era.out","w",stdout);
	int n;
	int i,j;
	cin>>n;
	if(n%60==4)
	{
		cout<<"jiazi";
		return 0;
	}
	if(n%60==5)
	{
		cout<<"yichou";
		return 0;
	}
	if(n%60==6)
	{
		cout<<"bingyin";
		return 0;
	}
	if(n%60==7)
	{
		cout<<"dingmao";
		return 0;
	}
	if(n%60==8)
	{
		cout<<"wuchen";
		return 0;
	}
	if(n%60==9)
	{
		cout<<"jisi";
		return 0;
	}
	if(n%60==10)
	{
		cout<<"gengwu";
		return 0;
	}
	if(n%60==11)
	{
		cout<<"xinwei";
		return 0;
	}
	if(n%60==12)
	{
		cout<<"renshen";
		return 0;
	}
	if(n%60==13)
	{
		cout<<"guiyou";
		return 0;
	}
	if(n%60==14)
	{
		cout<<"jiaxu";
		return 0;
	}
	if(n%60==15)
	{
		cout<<"yihai";
		return 0;
	} 
	if(n%60==16)
	{
		cout<<"bingzi";
		return 0;
	}
	if(n%60==17)
	{
		cout<<"dingchou";
		return 0;
	}
	if(n%60==18)
	{
		cout<<"wuyin";
		return 0;
	}
	if(n%60==19)
	{
		cout<<"jimao";
		return 0;
	}
	if(n%60==20)
	{
		cout<<"gengchen";
		return 0; 
	}
	if(n%60==21)
	{
		cout<<"xinsi";
		return 0;
	}
	if(n%60==22)
	{
		cout<<"renwu";
		return 0;
	}
	if(n%60==23)
	{
		cout<<"guiwei";
		return 0;
	}
	if(n%60==24)
	{
		cout<<"jiashen";
		return 0;
	}
	if(n%60==25)
	{
		cout<<"yiyou";
		return 0;
	}
	if(n%60==26)
	{
		cout<<"bingxu";
		return 0;
	}
	if(n%60==27)
	{
		cout<<"dinghai";
		return 0;
	}
	if(n%60==28)
	{
		cout<<"wuzi";
		return 0;
	}
	if(n%60==29)
	{
		cout<<"jichou";
		return 0;
	}
	if(n%60==30)
	{
		cout<<"gengyin";
		return 0;
	}
	if(n%60==31)
	{
		cout<<"xinmao";
		return 0; 
	}
	if(n%60==32)
	{
		cout<<"renchen";
		return 0;
	}
	if(n%60==33)
	{
		cout<<"guisi";
		return 0;
	}
	if(n%60==34)
	{
		cout<<"jiawu";
		return 0;
	}
	if(n%60==35)
	{
		cout<<"yiwei";
		return 0;
	}
	if(n%60==36)
	{
		cout<<"bingshen";
		return 0;
	}
	if(n%60==37)
	{
		cout<<"dingyou";
		return 0;
	}
	if(n%60==38)
	{
		cout<<"wuxu";
		return 0;
	}
	if(n%60==39)
	{
		cout<<"jihai";
		return 0;
	}
	if(n%60==40)
	{
		cout<<"gengzi";
		return 0;
	}
	if(n%60==41)
	{
		cout<<"xinchou";
		return 0;
	}
	if(n%60==42)
	{
		cout<<"renyin";
		return 0;
	}
	if(n%60==43)
	{
		cout<<"guimao";
		return 0;
	}
	if(n%60==44)
	{
		cout<<"jiachen";
		return 0;
	}
	if(n%60==45)
	{
		cout<<"yisi";
		return 0;
	} 
	if(n%60==46)
	{
		cout<<"bingwu";
		return 0;
	}
	if(n%60==47)
	{
		cout<<"dingwei";
		return 0;
	}
	if(n%60==48)
	{
		cout<<"wushen";
		return 0;
	}
	if(n%60==49)
	{
		cout<<"jiyou";
		return 0;
	}
	if(n%60==50)
	{
		cout<<"gengxu";
		return 0; 
	}
	if(n%60==51)
	{
		cout<<"xinhai";
		return 0;
	}
	if(n%60==52)
	{
		cout<<"renzi";
		return 0;
	}
	if(n%60==53)
	{
		cout<<"guichou";
		return 0;
	}
	if(n%60==54)
	{
		cout<<"jiayin";
		return 0;
	}
	if(n%60==55)
	{
		cout<<"yimao";
		return 0;
	}
	if(n%60==56)
	{
		cout<<"bingchen";
		return 0;
	}
	if(n%60==57)
	{
		cout<<"dingsi";
		return 0;
	}
	if(n%60==58)
	{
		cout<<"wuwu";
		return 0;
	}
	if(n%60==59)
	{
		cout<<"jiwei";
		return 0;
	}
	if(n%60==0)
	{
		cout<<"gengshen";
		return 0;
	}
	if(n%60==1)
	{
		cout<<"xinyou";
		return 0; 
	}
	if(n%60==2)
	{
		cout<<"renxu";
		return 0;
	}
	if(n%60==3)
	{
		cout<<"guihai";
		return 0;
	}
}

310行我太有实力了哈哈哈

好了打住,这道题的正解是用俩字符数组存天干地支,再取模。

正解AC code:

#include<bits/stdc++.h>
using namespace std;
char tiangan[11][11]={"jia","yi","bing","ding","wu","ji","geng","xin","ren","gui"};
char dizhi[13][13]={"zi","chou","yin","mao","chen","si","wu","wei","shen","you","xu","hai"};
int n;
int main()
{
	cin>>n;
	cout<<tiangan[((n%10)+6)%10]<<dizhi[((n%12)+8)%12];//这里取模的数字需要自己推导一下
	return 0;
}
很简洁的感觉有木有?

六,P1177 【模板】排序

题目传送门  (之所以放这道题是我想让大家学完排序算法后能在这道题上测一下)

这道题的做法也是炒鸡多,作为超级懒人当然用sort。真的是模板中的模版。

AC code:

#include<bits/stdc++.h>
using namespace std;
int a[100001];
int n;
int main()
{
	int i;
	cin>>n;
	for(i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	sort(a,a+n+1);
	for(i=1;i<=n;i++)
	{
		cout<<a[i]<<" ";
	}
	return 0;
}

 

今个儿咱就写这么多,敬请期待下一篇!

感谢你的阅览,thanks!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值