子数整数
题目描述
对于一个五位数 a 1 a 2 a 3 a 4 a 5 ‾ \overline{a_1a_2a_3a_4a_5} a1a2a3a4a5,可将其拆分为三个子数:
s u b 1 = a 1 a 2 a 3 ‾ sub_1=\overline{a_1a_2a_3} sub1=a1a2a3
s u b 2 = a 2 a 3 a 4 ‾ sub_2=\overline{a_2a_3a_4} sub2=a2a3a4
s u b 3 = a 3 a 4 a 5 ‾ sub_3=\overline{a_3a_4a_5} sub3=a3a4a5
例如,五位数 20207 20207 20207 可以拆分成
s u b 1 = 202 sub_1=202 sub1=202
s u b 2 = 020 ( = 20 ) sub_2=020\ (=20) sub2=020 (=20)
s u b 3 = 207 sub_3=207 sub3=207
现在给定一个正整数 K K K,要求你编程求出 10000 10000 10000 到 30000 30000 30000 之间所有满足下述条件的五位数,条件是这些五位数的三个子数 s u b 1 , s u b 2 , s u b 3 sub_1,sub_2,sub_3 sub1,sub2,sub3 都可被 K K K 整除。
输入格式
一个正整数 K K K。
输出格式
每一行为一个满足条件的五位数,要求从小到大输出。不得重复输出或遗漏。如果无解,则输出 No
。
样例 #1
样例输入 #1
15
样例输出 #1
22555
25555
28555
30000
提示
0 < K < 1000 0<K<1000 0<K<1000
解题思路
直接暴力求出题目让求的对应位置的数字在进行判断
#include <iostream>
using namespace std;
int main()
{
int K;
cin >> K;
int a, b, c, d, e;
int sub1,sub2,sub3,n = 0;
int f;
for (int i = 10000; i <= 30000; i++)
{
a = i / 10000;//万位
b = i / 1000 % 10;//千位
c = i / 100 % 100 % 10;//百位
d = i / 10 % 1000 % 100 % 10;//十位
e = i % 10000 % 1000 % 100 % 10;//个位
sub1 = a * 100 + b * 10 + c;
sub2 = b * 100 + c * 10 + d;
sub3 = c * 100 + d * 10 + e;
if (sub1 % K == 0 && sub2 % K == 0 && sub3 % K == 0)
{
cout << i << endl;
f = 1;
}
}
if (f != 1) printf("No");
return 0;
}
欢乐的跳
题目描述
一个 n n n 个元素的整数数组,如果数组两个连续元素之间差的绝对值包括了 [ 1 , n − 1 ] [1,n-1] [1,n−1] 之间的所有整数,则称之符合“欢乐的跳”,如数组 { 1 , 4 , 2 , 3 } \{1,4,2,3\} {1,4,2,3} 符合“欢乐的跳”,因为差的绝对值分别为: 3 , 2 , 1 3,2,1 3,2,1。
给定一个数组,你的任务是判断该数组是否符合“欢乐的跳”。
输入格式
每组测试数据第一行以一个整数 n ( 1 ≤ n ≤ 1000 ) n(1 \le n \le 1000) n(1≤n≤1000) 开始,接下来 n n n 个空格隔开的在 [ − 1 0 8 , 1 0 8 ] [-10^8,10^8] [−108,108] 之间的整数。
输出格式
对于每组测试数据,输出一行若该数组符合“欢乐的跳”则输出 Jolly
,否则输出 Not jolly
。
样例 #1
样例输入 #1
4 1 4 2 3
样例输出 #1
Jolly
样例 #2
样例输入 #2
5 1 4 2 -1 6
样例输出 #2
Not jolly
提示
1 ≤ n ≤ 1000 1 \le n \le 1000 1≤n≤1000
#include <iostream>
using namespace std;
int q[1000];
int n;
int main()
{
cin >> n;
int num = 0;
for (int i = 0; i < n; i++)
{
cin >> q[i];
}
for (int i = 0; i < n; i++)
{
if ( abs(q[i + 1] - q[i]) > 1 && abs(q[i + 1] - q[i])) num++;
}
if (num == n - 1) printf("Jolly");
else printf("Not jolly");
return 0;
}
开灯
题目描述
在一条无限长的路上,有一排无限长的路灯,编号为 1 , 2 , 3 , 4 , … 1,2,3,4,\dots 1,2,3,4,…。
每一盏灯只有两种可能的状态,开或者关。如果按一下某一盏灯的开关,那么这盏灯的状态将发生改变。如果原来是开,将变成关。如果原来是关,将变成开。
在刚开始的时候,所有的灯都是关的。小明每次可以进行如下的操作:
指定两个数, a , t a,t a,t( a a a 为实数, t t t 为正整数)。将编号为 ⌊ a ⌋ , ⌊ 2 × a ⌋ , ⌊ 3 × a ⌋ , … , ⌊ t × a ⌋ \lfloor a\rfloor,\lfloor 2 \times a\rfloor,\lfloor3 \times a\rfloor,\dots,\lfloor t \times a\rfloor ⌊a⌋,⌊2×a⌋,⌊3×a⌋,…,⌊t×a⌋ 的灯的开关各按一次。其中 ⌊ k ⌋ \lfloor k \rfloor ⌊k⌋ 表示实数 k k k 的整数部分。
在小明进行了 n n n 次操作后,小明突然发现,这个时候只有一盏灯是开的,小明很想知道这盏灯的编号,可是这盏灯离小明太远了,小明看不清编号是多少。
幸好,小明还记得之前的 n n n 次操作。于是小明找到了你,你能帮他计算出这盏开着的灯的编号吗?
输入格式
第一行一个正整数 n n n,表示 n n n 次操作。
接下来有 n n n 行,每行两个数, a i , t i a_i,t_i ai,ti。其中 a i a_i ai 是实数,小数点后一定有 6 6 6 位, t i t_i ti 是正整数。
输出格式
仅一个正整数,那盏开着的灯的编号。
样例 #1
样例输入 #1
3
1.618034 13
2.618034 7
1.000000 21
样例输出 #1
20
提示
记 T = ∑ i = 1 n t i = t 1 + t 2 + t 3 + ⋯ + t n T=\sum \limits_{i=1}^n t_i = t_1+t_2+t_3+\dots+t_n T=i=1∑nti=t1+t2+t3+⋯+tn。
- 对于 30 % 30\% 30% 的数据,满足 T ≤ 1000 T \le 1000 T≤1000;
- 对于 80 % 80\% 80% 的数据,满足 T ≤ 200000 T \le 200000 T≤200000;
- 对于 100 % 100\% 100% 的数据,满足 T ≤ 2000000 T \le 2000000 T≤2000000;
- 对于 100 % 100\% 100% 的数据,满足 n ≤ 5000 n \le 5000 n≤5000, 1 ≤ a i < 1000 1 \le a_i<1000 1≤ai<1000, 1 ≤ t i ≤ T 1 \le t_i \le T 1≤ti≤T。
数据保证,在经过 n n n 次操作后,有且只有一盏灯是开的,不必判错。而且对于所有的 i i i 来说, t i × a i t_i\times a_i ti×ai 的最大值不超过 2000000 2000000 2000000。
#include <iostream>
using namespace std;
int q[2000010];
int n,t,idx;
double a;
int main()
{
cin >> n;
int q[2000010] = { 0 };
//操作n次
for (int i = 0; i < n; i++)
{
cin >> a >> t;//输入实数a和正整数t
//对哪几个等进行操作
for (int x = 1; x <= t; x++)
{
idx = x * a;
q[idx]++;
}
}
for (int i = 1; i <= 2000010; i++)
{
if (q[i] % 2 == 1)
{
printf("%d", i);
break;
}
}
return 0;
}
[NOIP2002 普及组] 级数求和
题目描述
已知: S n = 1 + 1 2 + 1 3 + … + 1 n S_n= 1+\dfrac{1}{2}+\dfrac{1}{3}+…+\dfrac{1}{n} Sn=1+21+31+…+n1。显然对于任意一个整数 k k k,当 n n n 足够大的时候, S n > k S_n>k Sn>k。
现给出一个整数 k k k,要求计算出一个最小的 n n n,使得 S n > k S_n>k Sn>k。
输入格式
一个正整数 k k k。
输出格式
一个正整数 n n n。
样例 #1
样例输入 #1
1
样例输出 #1
2
提示
【数据范围】
对于 100 % 100\% 100% 的数据, 1 ≤ k ≤ 15 1\le k \le 15 1≤k≤15。
【题目来源】
NOIP 2002 普及组第一题
#include <iostream>
using namespace std;
int main()
{
int k,i = 0;
double num = 0.0;
cin >> k;
while (num <= k)
{
num += 1.0 / ++i;
}
printf("%d",i);
return 0;
}
[NOIP2005 普及组] 陶陶摘苹果
题目描述
陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 10 10 10 个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个 30 30 30 厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。
现在已知 10 10 10 个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。
输入格式
输入包括两行数据。第一行包含 10 10 10 个 100 100 100 到 200 200 200 之间(包括 100 100 100 和 200 200 200)的整数(以厘米为单位)分别表示 10 10 10 个苹果到地面的高度,两个相邻的整数之间用一个空格隔开。第二行只包括一个 100 100 100 到 120 120 120 之间(包含 100 100 100 和 120 120 120)的整数(以厘米为单位),表示陶陶把手伸直的时候能够达到的最大高度。
输出格式
输出包括一行,这一行只包含一个整数,表示陶陶能够摘到的苹果的数目。
样例 #1
样例输入 #1
100 200 150 140 129 134 167 198 200 111
110
样例输出 #1
5
提示
【题目来源】
NOIP 2005 普及组第一题
#include <iostream>
using namespace std;
int main()
{
int re = 0;
int q[20];
for (int i = 0; i < 10; i++)
cin >> q[i];
int a;
cin >> a;
for (int i = 0; i < 10; i++)
{
if (a + 30 >= q[i])
re++;
}
printf("%d",re);
return 0;
}