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

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

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

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

评论

  • 兰陵王
    哈哈
  • geekya215
    同被else这里坑了。。。
  • koori_sakura
    算法重复会被删帖……我和您做法一样
  • 李玉庭
  • _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的博客查看 举报    27  

/*这道题好像没有和我一样做的,打表打得漂亮,没有那么多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感谢大佬让我学到尖括号可以用双引号代替
  • 炼金法爷biu
    Orz感谢dalao让我学到strchr这个bug函数
  • 冬瓜皮
    看到双引号心里全是%%%%
  • 白雪公猪
    %%%%%%
  • jxdql2001
    其实我现在也写<>啦
作者: jxdql2001 更新时间: 2017-02-26 16:29  在Ta的博客查看 举报    12  

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

请看:

#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
作者: 俞科chen21 更新时间: 2017-09-10 21:01  在Ta的博客查看 举报    6  

本题需要分段考虑

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.

评论

  • 辛奕澄
    %%%%%Orz
  • 大神无敌222
    odkk
  • liyiqi117117
    线一点不华丽
作者: liuzhiyuan1234 更新时间: 2018-10-24 20:26  在Ta的博客查看 举报    3  

其实稍微暴力一点也是可以的qwq~

多做一点字符串的题,这类题目很容易出错的


华 丽 的 分 割 线

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
char keyboard[30][30]={"abc","def","ghi","jkl","mno","pqrs","tuv","wxyz","*"," ","/"};
int main()
{
    int ans=0;//记得初始时清零
    string s;
    getline(cin,s);//输入一整行字符串(注意此函数虽快,但会读空格,请慎用!)
    for(int i=0;i<s.length();i++)
    {
        for(int j=0;j<=10;j++)
        {
            for(int l=0;l<strlen(keyboard[j]);l++)
            if(keyboard[j][l]==s[i])ans+=l+1;//每个小序列从第零个储存
        }
    }
    cout<<ans<<endl;//~~愉快地输出答案qwq~~
    return 0;
}

评论

  • 提动Crazy
    真厉害
作者: heidoudou 更新时间: 2018-08-05 12:23  在Ta的博客查看 举报    2  

手动制表的你们累不累?

#include <iostream>
#include <string>

using namespace std;

int clicks[256] = { 0 };

void init_clicks()
{
    const string keyboard[12] = {
        "",     "abc",  "def", 
        "ghi",  "jkl",  "mno", 
        "pqrs", "tuv",  "wxyz", 
        "*",    " ",    "#"};

    for (int i = 0; i < 12; ++i)
        for (int j = 0; j < keyboard[i].length(); ++j)
            clicks[keyboard[i][j]] = j + 1;
}

int main()
{
    init_clicks();

    string s;
    getline(cin, s);

    int count = 0;

    for (int i = 0; i < s.length(); ++i)
        count += clicks[s[i]];

    cout << count;

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



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