题目目录:
No.1 P1765 手机
No.2 P1876 开灯
第一道:
题目描述
一般的手机的键盘是这样的:
要按出英文字母就必须要按数字键多下。例如要按出 x 就得按 9 两下,第一下会出 w,而第二下会把 w 变成 x。0 键按一下会出一个空格。
你的任务是读取若干句只包含英文小写字母和空格的句子,求出要在手机上打出这个句子至少需要按多少下键盘。
输入格式
一行句子,只包含英文小写字母和空格,且不超过 200 个字符。
输出格式
一行一个整数,表示按键盘的总次数。
输入输出样例
输入 #1
i have a dream
输出 #1
23
说明/提示
NOI 导刊 2010 普及(10)
思路:
死算,反正其他方法我也不会
AC代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int sum=0;
string a;
getline(cin,a);
for(int i=0;i<a.size();i++)
{
if(a[i]=='a'||a[i]=='d'||a[i]=='g'||a[i]=='j'||a[i]=='m'||a[i]=='p'||a[i]=='t'||a[i]=='w'||a[i]==' ')
{
sum+=1;
}
if(a[i]=='b'||a[i]=='e'||a[i]=='h'||a[i]=='k'||a[i]=='n'||a[i]=='q'||a[i]=='u'||a[i]=='x')
{
sum+=2;
}
if(a[i]=='c'||a[i]=='f'||a[i]=='i'||a[i]=='l'||a[i]=='o'||a[i]=='r'||a[i]=='v'||a[i]=='y')
{
sum+=3;
}
if(a[i]=='s'||a[i]=='z')
{
sum+=4;
}
}
cout<<sum;
return 0;
}
第二道:
题目背景
该题的题目是不是感到很眼熟呢?
事实上,如果你懂的方法,该题的代码简直不能再短。
但是如果你不懂得呢?那。。。(自己去想)
题目描述
首先所有的灯都是关的(注意是关!),编号为 1 的人走过来,把是 1 的倍数的灯全部打开,编号为 2 的人把是 2 的倍数的灯全部关上,编号为 3 的人又把是33 的倍数的灯开的关上,关的开起来……直到第 N 个人为止。
给定 N,求 N 轮之后,还有哪几盏是开着的。
输入格式
一个数 N,表示灯的个数和操作的轮数。
输出格式
若干数,表示开着的电灯编号。
输入输出样例
输入 #1
5
输出 #1
1 4
说明/提示
【数据范围】
对于 100% 的数据,1≤N≤240。
【其他说明】
数学题!
思路:
【其他说明】里已经明确地说了:这题是道数学题!对于学过奥数的我来说,那可太简单了!输出1~N的完全平方数即可,证明:
既然最后要开着,那么开关就得被按奇数下,即这个数有奇数个因数,根据因数个数定理,只有每个数的幂次都是偶数,因数个数才是奇数,每个数的幂次都是偶数,那这个数就是完全平方数(此过程涉及到小学奥数,不懂勿踩)
AC代码1(数学):
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
for(int i=1;i<=sqrt(n);i++)
{
cout<<i*i<<" ";
}
return 0;
}
12行搞定
AC代码2(死枚举):
没有(很尴尬的发现,那个数据范围数组没法开......2^40都超过int了,已经1,099,511,627,776了,数组开这么大,小心CE!)
这篇博客就到这里啦,我们下篇博客见!