解题为什么需要清晰的思路#创作计划#
2024-01-28 15:24:55
发布于:广东
解题为什么要清晰的思路?
因为有了清晰的思路,你便可以做出一些逾越你所学知识的题。
准备一波
在做寒假集训的时候,我的老师给了我一道这样的题目(同期营可以直接点这里):
这是最后一题,但是我前几道题都写完了,并且还剩下1个小时。
哇,剩那么多时间!那我不得试一试?
简单确定了思路后,我就开始写了。
(当然,这道题超纲了(才学到字符串),这道题全班只有我做得出来)
挑战过程
1.先把开头搞定
首先,确定一下需求。
什么个需求呢?
......
先把输入的几个字符写好再在中途添加吧。
和不用说,找到最多的得用一个变量吧,
然后呢?
坏了,好像每个字母都得循环一次,加上。
再来一个数组,存一波每个值,最后算个最大值。先这个样子。
int k,lengths[26]={},max_chong=INT_MIN;
string s,letter="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
然后,每个都得查的话,26个字母先循环一遍。
for(int i = 0;i<26;i++){//26个字母都循环一遍
}
2.循环套循环套循环
每一次都有个改动的位置,那得有一个临时变量。同时,根据这个思路,我得改的值,也要临时变量。
lins=s;
link=k;//定义临时变量
把k个改动位循环搞定,可以用临时的,随便造。
while(link--){//有k个改动位
}
根据提示,我发现,可以先找出离那个字母最近的量,进行改动,好家伙,一大段的思路都出来了。
找出的话,用一个新的变量找最接近符号,再来一个确定下标,后面再想一下吧。
char z='!';
int zhu=0;
for(int j = 0;j<lins.length();j++){//先找出最接近位置的字母,先改这个字母
if(abs(lins[j]-letter[i])<abs(z-letter[i])&&lins[j]!=letter[i]){
z=lins[j];
zhu=j;
}
}
注意这里我找的方法:如果 这个字母与要找字母的距离比与的距离多的话就把变成这个字母。
3.做改动与找最多
现在我找到了最大值,灵感来了,冲冲冲!
直接开始更改!如果这个字母比大就减少这个字母的大小,反之亦然。
if(z>letter[i])lins[zhu]-=1;//如果比规定字母大就减少大小趋向于规定字母,下一行相反
if(z<letter[i])lins[zhu]+=1;
好!到这里,while(--)在每次循环中都会不断减少直到=0结束,而也更改完了,现在统计相同的数量就完了。
for(int j = 0;j<lins.length();j++){//写入重复数量
if(lins[j]==letter[i])lengths[i]++;
}
最后,从数组中找到最多的就行了!还记得开头的_ 变量吗?现在派上用场了,最后输出的就是他!
for(int i = 0;i<26;i++){
if(lengths[i]>max_chong)max_chong=lengths[i];
}
cout<<max_chong;//输出
总程序
(可能和上面的有些出入,但功效应该差不多......吧)
(内含原注释)
#include<bits/stdc++.h>
using namespace std;
int main(){
int k,lengths[26]={},suan,link,zhu;
string s,letter="ABCDEFGHIJKLMNOPQRSTUVWXYZ",lins;
//k和s不用说,我想找到26个字母中重复最多的,就用了letter和lengths,link和lins是临时的k和s
char z;
cin>>k>>s;//输入
for(int i = 0;i<26;i++){//26个字母都循环一遍
lins=s;
link=k;//定义临时变量
while(link--){//有k个改动位
z='!';
zhu=0;
for(int j = 0;j<lins.length();j++){//先找出最接近位置的字母,先改这个字母
if(abs(lins[j]-letter[i])<abs(z-letter[i]/*具体找出方法*/)&&lins[j]!=letter[i]){
z=lins[j];
zhu=j;
}
}//每次做出的改动
if(z>letter[i])lins[zhu]-=1;//如果比规定字母大就减少大小趋向于规定字母,下一行相反
if(z<letter[i])lins[zhu]+=1;
}
for(int j = 0;j<lins.length();j++){//写入重复数量
if(lins[j]==letter[i])lengths[i]++;
}
}
int max_chong=INT_MIN;//准备找最多重复的
for(int i = 0;i<26;i++){
if(lengths[i]>max_chong)max_chong=lengths[i];
}
cout<<max_chong;//输出
return 0;
}
结束
一口气做完,中途没测试(别学我),怀着忐忑的心情点击了提交。
噔噔噔噔噔噔噔噔~
全部正确!
当时,距离考试结束还有40分钟。
我竟然AC了?
......
我不太擅长写文章,可能看起来思路没这么清晰,其实在过程中是一直很清晰的。
我一般不写注释,竟然为这篇文章专门写了
可能这是一座使山,但我实力就摆在这了,都是超纲的题,大佬勿喷。
这里空空如也
有帮助,赞一个