兄弟们,终于写上题解了,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!