P1765 手机_NOI导刊2010普及(10) 题解

以下题解仅供学习参考使用。

抄袭、复制题解,以达到刷AC率/AC数量或其他目的的行为,在洛谷是严格禁止的。

洛谷非常重视学术诚信。此类行为将会导致您成为作弊者。具体细则请查看洛谷社区规则

评论

  • 兰陵王
    哈哈
  • geekya215
    同被else这里坑了。。。
  • koori_sakura
    算法重复会被删帖……我和您做法一样
  • liyuting_233
  • _Wolverine
    打表6666666666666666666666
  • WuShangxuan
    666
  • Brave_poi_king
    想法完全一样2333
  • 花满楼_繁星
    想法完全一样
  • Edmund_YDS50
    众所周知,NOIP是打表竞赛(雾)
  • chensj
    为什么不能ans+=(a[i]-'a'+1)%3
作者: Drifterming 更新时间: 2017-07-10 11:12  在Ta的博客查看 举报    32  

/*这道题好像没有和我一样做的,打表打得漂亮,没有那么多if和case,简洁美观呵呵呵呵呵*/

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
int ans;
string a;
int num[26]={1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,4,1,2,3,1,2,3,4};        //26个字母打表需要按几次 
int main()
{
    getline(cin,a);
    for(int i=0;i<a.length();i++)
    {
        if(a[i]>='a'&&a[i]<='z') ans+=num[a[i]-'a'];        //不能写a[i]!=' ',因为还有'\n'和'\r' 
        if(a[i]==' ') ans++;    //不能写else因为也有'\n'和'\r',这就是这个题的坑点,我交了好几次,欲哭无泪 
    }
    printf("%d",ans);
    return 0;
}

评论

  • 13813812138lalala
    Orz 感谢dalao让我学到了EOF这个很bug的东西
  • Zerosking
    Orz感谢大佬让我学到尖括号可以用双引号代替
  • Yukhoi
    Orz感谢dalao让我学到strchr这个bug函数
  • 冬瓜皮
    看到双引号心里全是%%%%
  • 白雪公猪
    %%%%%%
  • jxdql2001
    其实我现在也写<>啦
  • Henry_in_out
    Orz感谢大佬让我学到s%t%r%c%h%r%这个%%%的方法
作者: jxdql2001  更新时间: 2017-02-26 16:29  在Ta的博客查看 举报    11  

很水的题,懂得常量数组的妙用代码可以很简单

请看:

#include"iostream"
#include"cstdio"
#include"cstring"//为用strchr查找函数
using namespace std;
char s1[]={" adgjmptw"},s2[]={"behknqux"},s3[]={"cfilorvy"},s4[]={"sz"};//可以望文生义,分别开按1~4次键盘的常量数组
int main()
{
 char c;
 int s=0;
 while((c=getchar())!=EOF) //!=EOF表示还没输入结束  
  {
  //在s1~s4中依次找,找到就加上1~4
   if(strchr(s1,c)) s++;
   else if(strchr(s2,c)) s+=2;
   else if(strchr(s3,c)) s+=3;
   else if(strchr(s4,c)) s+=4; //注意这里不能写成else,因为还会有\n等字符                       
  }  
 cout<<s<<endl;
 return 0;  
}

评论

  • 缘,为何物?
    DALAO
  • 我VC太菜了
    pascal选手!
  • 俞科chen21
    已经转c++了。
作者: 俞科chen21 更新时间: 2017-09-10 21:01  在Ta的博客查看 举报    7  

本题需要分段考虑

var
  s:string;
  i,j,k,n:longint;
begin
  readln(s);
  k:=length(s);
  for i:= 1 to k do
    case s[i] of 
      'a','d','g','j','m','p','t','w',' ':n:=n+1;//第一阶段,只需打一次键盘
      'b','e','h','k','n','q','u','x':n:=n+2;//第二阶段,需要打两次键盘
      'c','f','i','l','o','r','v','y':n:=n+3;//第三阶段,需要打三次键盘
      's','z':n:=n+4;//第四阶段,需要打四次键盘
    end;
    write(n);//将之前所有键盘次数相加,输出次数
end.

评论

  • 量子飞光
    强行预处理,但不错
  • constructor
    定义map,把char类型转化成int这句话并不严谨,往改正。
  • jins3599
    你这个初始化有必要?用的时候直接 x-'a'+1不就行了么
  • 缘,为何物?
    @jins3599 同意
  • aloner
    写得好!
  • Smallbasic
    ORZ!!!!!!
作者: WLZS 更新时间: 2017-11-05 10:51  在Ta的博客查看 举报    6  

这道题其实可以用map来做,map就是映射,在这里可以把一个字符映射成一个数,就是要按几次才能按出这个数

其实map的功能很强大,这里只用了他的基本性质

代码~

#include<cstdio>
#include<map>
#include<cstring>
#include<iostream> 
#include<string>
using namespace std;
map<char,int>ma;//定义map,把char类型转化成int
string word;
int ans=0;
void init()
{
    ma['a']=1;
    ma['b']=2;
    ma['c']=3;
    ma['d']=1;
    ma['e']=2;
    ma['f']=3;
    ma['g']=1;
    ma['h']=2;
    ma['i']=3;
    ma['j']=1;
    ma['k']=2;
    ma['l']=3;
    ma['m']=1;
    ma['n']=2;
    ma['o']=3;
    ma['p']=1;
    ma['q']=2;
    ma['r']=3;
    ma['s']=4;
    ma['t']=1;
    ma['u']=2;
    ma['v']=3;
    ma['w']=1;
    ma['x']=2;
    ma['y']=3;
    ma['z']=4;
    ma[' ']=1;

}//初始化

int main()
{
    init();
    getline(cin,word);//读入
    for(int i=0;i<word.length();i++)
    {
        ans+=ma[word[i]];
    }
    cout<<ans<<endl;
}

评论

  • Leoeight
    还没有评论
  • Henry_in_out
    Leoeight
  • JYOIWYC
    神tm素质三连(真以为这是B站啊?)
作者: xmmlj 更新时间: 2019-08-13 20:10  在Ta的博客查看 举报    2  

大家好!欢迎来到蒟蒻小课堂第16讲

题目详细讲解请上B站查看

B站帐号与前15讲内容都在博客里

好了,进入正题

这道题看上去很难(怎么又是这句活,下一句保证是其实很简单)

其实只要我们有耐心,这道题还是很简单的(看,我就说吧,这个蒟蒻,每次都用这几句话)

我用的是打表(又称暴力枚举,模拟过程......)

那么,上我的打表代码

#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int a[10005],totals=0;
string s;
int main()
{
    //这......就是我的打表大法
    //把每一个字母对应的ascll码值在数组中的位置标记成需要按多少次
    a[int('a')]=1;
    a[int('b')]=2;
    a[int('c')]=3;
    a[int('d')]=1;
    a[int('e')]=2;
    a[int('f')]=3;
    a[int('g')]=1;
    a[int('h')]=2;
    a[int('i')]=3;
    a[int('j')]=1;
    a[int('k')]=2;
    a[int('l')]=3;
    a[int('m')]=1;
    a[int('n')]=2;
    a[int('o')]=3;
    a[int('p')]=1;
    a[int('q')]=2;
    a[int('r')]=3;
    a[int('s')]=4;
    a[int('t')]=1;
    a[int('u')]=2;
    a[int('v')]=3;
    a[int('w')]=1;
    a[int('x')]=2;
    a[int('y')]=3;
    a[int('z')]=4;
    getline(cin,s);
    for(int i=0;i<=s.size()-1;i++)
    {
        if(s[i]==' ')//空格特殊处理
        {
            totals+=1;
        }
        else
        {
            totals+=a[int(s[i])];
        }
    }
    cout<<totals;
    return 0;
}

打表不易,希望支持!!!(素质三联暗示)

 
反馈
如果你认为某个题解有问题,欢迎向洛谷反馈,以帮助更多的同学。



请具体说明理由,以增加反馈的可信度。