洛谷 P1765 手机 P1876 开灯 题解

题目目录:

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!)

这篇博客就到这里啦,我们下篇博客见!

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值