今天这个,一天五道题,就是四天的成果了,打算用python和C写。
题目来源:https://www.luogu.com.cn/training/102#problems
题目链接:https://www.luogu.com.cn/problem/P5718
给出 n n n 和 n n n 个整数 a i a_i ai,求这 n n n 个整数中最小值是什么。
第一行输入一个正整数 n n n,表示数字个数。
第二行输入 n n n 个非负整数,表示 a 1 , a 2 … a n a_1,a_2 \dots a_n a1,a2…an,以空格隔开。
输出一个非负整数,表示这 n n n 个非负整数中的最小值。
8
1 9 2 6 0 8 1 7
0
数据保证, n ≤ 100 n\le100 n≤100 且 0 ≤ a i ≤ 1000 0\le a_i \le 1000 0≤ai≤1000。
num = int(input())
a = list(map(int, input().split()))
a.sort()
print(a[0])
#include
#include
#include
#include
int main()
{
int n;
scanf("%d",&n);
int min = 1000;
for(int i = 1;i <= n;i++)
{
int num;
scanf("%d",&num);
if(num < min)
{
min = num;
}
}
printf("%d\n",min);
return 0;
}
题目链接:https://www.luogu.com.cn/problem/P5719
给定 n n n 和 k k k,将从 1 到 n n n 之间的所有正整数可以分为两类:A 类数可以被 k k k 整除(也就是说是 k k k 的倍数),而 B 类数不能。请输出这两类数的平均数,精确到小数点后 1 1 1 位,用空格隔开。
数据保证两类数的个数都不会是 0 0 0。
输入两个正整数 n n n 与 k k k。
输出一行,两个实数,分别表示 A 类数与 B 类数的平均数。精确到小数点后一位。
100 16
56.0 50.1
数据保证, 1 ≤ n ≤ 10000 1 \leq n\leq 10000 1≤n≤10000, 1 ≤ k ≤ 100 1 \leq k \leq 100 1≤k≤100。
# num = int(input())
#
# a = list(map(int, input().split()))
# a.sort()
# print(a[0])
n, k = map(int, input().split(" "))
i = 1
B_num = 0
B_sum = 0
A_num = 0
A_sum = 0
while i <= n:
if i % k == 0:
A_num += 1
A_sum += i
i += 1
else:
B_sum += i
B_num += 1
i += 1
print(round(A_sum/A_num, 1),round(B_sum/B_num, 1))
#include
#include
#include
#include
int main()
{
int n, k;
scanf("%d%d",&n,&k);
int x = 0,y = 0;
int sum = 0,num = 0;
for(int i = 1;i <= n;i++)
{
if(i % k == 0)
{
sum = sum + i;
x++;
}
if(i % k != 0)
{
num = num + i;
y++;
}
}
double a = 1.0*sum/x*1.0;
double b = 1.0*num/y*1.0;
printf("%.1lf %.1lf",a,b);
return 0;
}
题目链接:https://www.luogu.com.cn/problem/P5720
《庄子》中说到,“一尺之棰,日取其半,万世不竭”。第一天有一根长度为 a a a 的木棍,从第二天开始,每天都要将这根木棍锯掉一半(每次除 2 2 2,向下取整)。第几天的时候木棍的长度会变为 1 1 1?
输入一个正整数 a a a,表示木棍长度。
输出一个正整数,表示要第几天的时候木棍长度会变为 1 1 1。
100
7
数据保证, 1 ≤ a ≤ 1 0 9 1 \le a\le 10^9 1≤a≤109。
# num = int(input())
#
# a = list(map(int, input().split()))
# a.sort()
# print(a[0])
import math
n = int(input())
sum = 1
half = n
while half != 1:
half = int(half / 2)
sum += 1
print(sum)
#include
#include
#include
#include
int main()
{
long long n;
scanf("%lld",&n);
int sum = 1;
long long half = n;
while(half !=1)
{
half = half/2;
sum++;
}
printf("%d\n",sum);
return 0;
}
题目链接:https://www.luogu.com.cn/problem/P5721
给出 n n n,请输出一个直角边长度是 n n n 的数字直角三角形。所有数字都是 2 2 2 位组成的,如果没有 2 2 2 位则加上前导 0 0 0。
输入一个正整数 n n n。
输出如题目要求的数字直角三角形。
5
0102030405
06070809
101112
1314
15
数据保证, 1 ≤ n ≤ 13 1\le n\le13 1≤n≤13。
# num = int(input())
#
# a = list(map(int, input().split()))
# a.sort()
# print(a[0])
import math
n = int(input())
i = n
x = 1
while i >= 0:
j = i - 1
# print("i:",i)
while j >= 0:
# print("j:", j)
if x < 10:
print("0%d" % x, end="")
x += 1
else:
print("%d" % x, end="")
x += 1
j -= 1
print("")
i -= 1
#include
#include
#include
#include
int main()
{
int n;
scanf("%d",&n);
int x = 1;
for(int i = n;i >= 0;i--)
{
for(int j = i-1;j >= 0;j--)
{
if(x < 10)
{
printf("0%d",x);
x++;
}
else
{
printf("%d",x);
x++;
}
}
printf("\n");
}
return 0;
}
题目链接:https://www.luogu.com.cn/problem/P1009
用高精度计算出 S = 1 ! + 2 ! + 3 ! + ⋯ + n ! S = 1! + 2! + 3! + \cdots + n! S=1!+2!+3!+⋯+n!( n ≤ 50 n \le 50 n≤50)。
其中 !
表示阶乘,定义为 n ! = n × ( n − 1 ) × ( n − 2 ) × ⋯ × 1 n!=n\times (n-1)\times (n-2)\times \cdots \times 1 n!=n×(n−1)×(n−2)×⋯×1。例如, 5 ! = 5 × 4 × 3 × 2 × 1 = 120 5! = 5 \times 4 \times 3 \times 2 \times 1=120 5!=5×4×3×2×1=120。
一个正整数 n n n。
一个正整数 S S S,表示计算结果。
3
9
【数据范围】
对于 100 % 100 \% 100% 的数据, 1 ≤ n ≤ 50 1 \le n \le 50 1≤n≤50。
【其他说明】
注,《深入浅出基础篇》中使用本题作为例题,但是其数据范围只有 n ≤ 20 n \le 20 n≤20,使用书中的代码无法通过本题。
如果希望通过本题,请继续学习第八章高精度的知识。
n = int(input())
b = 0
for i in range(1, n + 1):
c = i
a = 1
while c != 0:
a = a * c
c = c - 1
b = b + a
print(b)
#include
int main() {
int n;
int temp;
int i, j;//进行阶乘和求和时的临时变量
while(scanf("%d", &n)!=EOF){
int m[100] = {0};//存储阶乘结果
int num[1000] = {0};//存储求和结果
int len = 1, count = 0, C = 0, D = 0;//len为阶乘结果的位数,count为求和结果的位数;C为求阶乘时的进位,D为求和时的进位
m[0] = 1;//0的阶乘为1
for (i = 1; i <= n; i++) {
for (j = 0; j < len; j++) {
temp = m[j];
m[j] = (temp * i + C) % 10;
C = (temp * i + C) / 10;
}
while (C != 0) {
m[len] = C % 10;
C = C / 10;
len++;
}//以上两个循环用来求阶乘结果
for (count = 0; count < len; count++) {//求完阶乘直接加
temp = num[count];
num[count] = (temp + m[count] + D) % 10;
D = (temp + m[count] + D) / 10;
}
while (D != 0) {
m[count + 1] += D % 10;
D = D / 10;
count++;
}//以上两个循环用来求阶乘之和结果
}
for (i = count - 1; i >= 0; i--)
printf("%d", num[i]);
printf("\n");
}
return 0;
}
题目链接:https://www.luogu.com.cn/problem/P1980
试计算在区间 1 1 1 到 n n n 的所有整数中,数字 x x x( 0 ≤ x ≤ 9 0\le x\le9 0≤x≤9)共出现了多少次?例如,在 1 1 1 到 11 11 11 中,即在 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 1,2,3,4,5,6,7,8,9,10,11 1,2,3,4,5,6,7,8,9,10,11 中,数字 1 1 1 出现了 4 4 4 次。
2 2 2 个整数 n , x n,x n,x,之间用一个空格隔开。
1 1 1 个整数,表示 x x x 出现的次数。
11 1
4
对于 100 % 100\% 100% 的数据, 1 ≤ n ≤ 1 0 6 1\le n\le 10^6 1≤n≤106, 0 ≤ x ≤ 9 0\le x \le 9 0≤x≤9。
n,x = list(map(int,input().split()))
# 计数的量
c = 0
# 整数序列
for i in range(1,n+1):
# count() 计数
c += str(i).count(str(x))
print(c)
#include
#include
#include
#include
int main(){
int n, m;
scanf("%d%d",&n,&m);
int num, sum;
for(int i = 1;i <= n;i++)
{
int pot = i;
while(pot != 0)
{
num = pot%10;
pot = pot/10;
if(num == m) sum++;
}
}
printf("%d",sum);
return 0;
}
题目链接:https://www.luogu.com.cn/problem/P1035
已知: 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
2
【数据范围】
对于 100 % 100\% 100% 的数据, 1 ≤ k ≤ 15 1\le k \le 15 1≤k≤15。
【题目来源】
NOIP 2002 普及组第一题
Sn = 0
k = int(input())
i = 1
while True:
Sn = Sn+1.0/i
if Sn > k:
print(i)
break
i += 1
#include
int main(){
double Sn=0;
int k;
scanf("%d",&k);
int i=1;
while (1)
{
Sn = Sn+1.0/i;
if(Sn>k)
{
printf("%d",i);
break;
}
i++;
}
题目链接:https://www.luogu.com.cn/problem/P2669
NOIP2015 普及组 T1
国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连续 n n n 天每天收到 n n n 枚金币后,骑士会在之后的连续 n + 1 n+1 n+1 天里,每天收到 n + 1 n+1 n+1 枚金币。
请计算在前 k k k 天里,骑士一共获得了多少金币。
一个正整数 k k k,表示发放金币的天数。
一个正整数,即骑士收到的金币数。
6
14
1000
29820
【样例 1 说明】
骑士第一天收到一枚金币;第二天和第三天,每天收到两枚金币;第四、五、六天,每天收到三枚金币。因此一共收到 1 + 2 + 2 + 3 + 3 + 3 = 14 1+2+2+3+3+3=14 1+2+2+3+3+3=14 枚金币。
对于 100 % 100\% 100% 的数据, 1 ≤ k ≤ 1 0 4 1\le k\le 10^4 1≤k≤104。
k = int(input())
n,m = 1,0
while k > 0:
k -= n
if k > 0:
m += n*n
n += 1
else:
m += n*(k+n)
print(m)
#include
#include
#include
#include
int sqr[101];
int app[20001];
int main()
{
int k;//k天
scanf("%d",&k);
int num = 0;
int n = 0;
while(k > num)
{
n++;
num = (n+1)*n/2;
}
long long sum = 0;
if(num != k){
for(int i = 1;i < n;i++)
{
sum = sum + i*i;
}
int m = (n-1)*n/2;
sum = (k - m)*n + sum;
printf("%lld\n",sum);
}
else if(num == k)
{
for(int i = 1;i <= n;i++)
{
sum = sum + i*i;
}
printf("%d\n",sum);
}
return 0;
}
题目链接:https://www.luogu.com.cn/problem/P5722
计算 1 + 2 + 3 + ⋯ + ( n − 1 ) + n 1+2+3+\cdots+(n-1)+n 1+2+3+⋯+(n−1)+n 的值,其中正整数 n n n 不大于 100。由于你没有高斯聪明,所以你不被允许使用等差数列求和公式直接求出答案。
输入一个正整数 n n n。
输出一个正整数,表示最后求和的答案。
100
5050
数据保证, 1 ≤ n ≤ 100 1 \leq n \leq 100 1≤n≤100。
n = int(input())
sum1 = 0
for i in range(1, n+1):
sum1 = sum1 + i
print(sum1)
#include
#include
#include
#include
int main()
{
int n;
scanf("%d",&n);
int sum = 0;
for(int i = 1;i <= n;i++)
{
sum = sum + i;
}
printf("%d",sum);
return 0;
}
题目链接:https://www.luogu.com.cn/problem/P5723
小 A 有一个质数口袋,里面可以装各个质数。他从 2 2 2 开始,依次判断各个自然数是不是质数,如果是质数就会把这个数字装入口袋。
口袋的负载量就是口袋里的所有数字之和。
但是口袋的承重量有限,装的质数的和不能超过 L L L。给出 L L L,请问口袋里能装下几个质数?将这些质数从小往大输出,然后输出最多能装下的质数的个数,数字之间用换行隔开。
一行一个正整数 L L L。
将这些质数从小往大输出,然后输出最多能装下的质数个数,所有数字之间有一空行。
100
2
3
5
7
11
13
17
19
23
9
5
2
3
2
11
2
3
5
3
数据保证, 1 ≤ L ≤ 10 5 1 \le L \le {10}^5 1≤L≤105。
lena = 0
cnt = 0
prime = [1 for i in range(100010)]
lena = int(input())
prime[1] = 0
prime[0] = 0
for i in range(2, 100010):
if prime[i] == 1:
j = i * 2
while j < 100010:
prime[j] = 0
j += i
for i in range(2, 100010):
if prime[i] == 1:
if lena >= i:
print(i)
lena -= i
cnt += 1
else:
break
print(cnt)
#include
#include
int n,x;
long long sum=0;
int pd(int y) {
int i;
for(i=2; i*i<=y; ++i) {
if(y%i==0) return 0;
}
return 1;
}
int main() {
scanf("%d",&n);
if(n<2) {
printf("0\n");
return 0;
} else if(n==2) {
printf("2\n1\n");
return 0;
}
int i;
for(i=2; i<=n; ++i) {
if(i%2==0&&i!=2) continue;
if(sum+i>n) {
printf("%d\n",x);
return 0;
}
if(pd(i)) {
printf("%d\n",i);
sum+=i;
x++;
}
}
return 0;
}
题目链接:https://www.luogu.com.cn/problem/P1217
因为 151 151 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 151 151 151 是回文质数。
写一个程序来找出范围 [ a , b ] ( 5 ≤ a < b ≤ 100 , 000 , 000 ) [a,b] (5 \le a < b \le 100,000,000) [a,b](5≤a<b≤100,000,000)(一亿)间的所有回文质数。
第一行输入两个正整数 a a a 和 b b b。
输出一个回文质数的列表,一行一个。
5 500
5
7
11
101
131
151
181
191
313
353
373
383
Hint 1: Generate the palindromes and see if they are prime.
提示 1: 找出所有的回文数再判断它们是不是质数(素数).
Hint 2: Generate palindromes by combining digits properly. You might need more than one of the loops like below.
提示 2: 要产生正确的回文数,你可能需要几个像下面这样的循环。
题目翻译来自NOCOW。
USACO Training Section 1.5
产生长度为 5 5 5 的回文数:
for (d1 = 1; d1 <= 9; d1+=2) { // 只有奇数才会是素数
for (d2 = 0; d2 <= 9; d2++) {
for (d3 = 0; d3 <= 9; d3++) {
palindrome = 10000*d1 + 1000*d2 +100*d3 + 10*d2 + d1;//(处理回文数...)
}
}
}
# 输入范围
begin, end = map(int, input().split())
# 定义一个筛选素数的函数,时间复杂度为根号n/3
def prime_number(number):
if number <= 3:
return True
elif number % 2 == 0 or number % 3 == 0:
return False
else:
i = 5
while i * i <= number:
if number % i == 0 or number % (i + 2) == 0:
return False
i += 6
return True
# 定义生成回文数的函数
from itertools import product
def palind(n):
digit_palind = []
half = product(*([range(1, 10, 2)] + [range(10)] * ((n - 1) // 2)))
for i in half:
digit_palind.append(n * '%s' % tuple(list(i) + list(i[-(n % 2) - 1::-1])))
return digit_palind
# 判断终点的数位
numerical_digit = 1
while 10 ** numerical_digit < end:
numerical_digit += 1
for i in range(1, numerical_digit + 1):
for str_num in palind(i):
num = int(str_num)
if num >= begin and num <= end and prime_number(num):
print(num)
#include
#include
long long a,b;
//判断是否是质数
int pd(long long y) {
long long i;
for(i=2; i*i<=y; ++i) {
if(y%i==0) return 0;
}
return 1;
}
//判断是否是回文数
int hui(long long n)
{
long long num = n;
long long m = 0, a;
while(1){
a = n%10;
m = m*10 + a;
n = n/10;
if( n == 0){
break;
}
}
if(m == num)
return 1;
else
return 0;
}
int main()
{
scanf("%d %d",&a,&b);
long long i = a;
if(a%2 ==0)
a ++;
for(i = a;i <= b;i+=2)
{
if(i%3 != 0)
{
int y = hui(i);
if(y == 1)
{
int x = pd(i);
if(x ==1)
printf("%lld\n",i);
}
}
}
return 0;
}
#include
#include
int prime(int n) {//判定素数
if(n==1)//特判1
return 0;
if(n%2==0)//2的倍数就回家吧
return 0;
else {//不然就暴力枚举
int i;
for(i=2; i<=sqrt(n); i++) {
if(n%i==0)
return 0;
}
return 1;
}
}
int hw(int n) {//判定回文,不懂请参考数字反转
int sum=0;
int k=n;
while(n!=0) {
sum=sum*10+n%10;
n/=10;
}
if(sum==k)//判断是否回文
return 1;
else
return 0;
}
int main() {
int i,n,sum=0,m;
scanf("%d %d",&n,&m); //读入两个数
for(i=n; i<=m; i++) {
if(i==9989900) //如果到了这个数,就break
break;
if(hw(i)&&prime(i))//否则判断是否回文和素数
printf("%d\n",i);//输出每个回文质数
}
return 0;//结束程序
}
题目链接:https://www.luogu.com.cn/problem/P1423
小玉开心的在游泳,可是她很快难过的发现,自己的力气不够,游泳好累哦。已知小玉第一步能游 2 2 2 米,可是随着越来越累,力气越来越小,她接下来的每一步都只能游出上一步距离的 98 % 98\% 98%。现在小玉想知道,如果要游到距离 s s s 米的地方,她需要游多少步呢。请你编程解决这个问题。
输入一个实数 s s s(单位:米),表示要游的目标距离。
输出一个整数,表示小玉一共需要游多少步。
4.3
3
数据保证, 0 ≤ s < 100 0 \leq s < 100 0≤s<100,且 s s s 小数点后最多只有一位。
s = float(input())
num = 0
step = 2
while s > 0:
s = s - step
step = step *0.98
num += 1
print(num)
#include
int main()
{
float a,b=2,k=2;/*距离可能非整*/
int i=1;/*由于数据弱就int即可*/
scanf("%f",&a);/*输入目标*/
for(i=1;i<=99999999;i++)
{if(k>a) break;/*判断是否游到目标*/
else
{
b=b*0.98;/*每步能游的距离*/
k=b+k;/*每步结束后的已游总距离*/
}}
printf("%d",i);/*输出步数*/
return 0;
}
题目链接:https://www.luogu.com.cn/problem/P1307
给定一个整数 N N N,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零(参见样例 2)。
一个整数 N N N。
一个整数,表示反转后的新数。
123
321
-380
-83
【数据范围】
$-1,000,000,000\leq N\leq 1,000,000,000 $。
noip2011 普及组第一题
num = input()
if num[0] == "-":
print("-", end="")
print(int(num[:0:-1]))
else:
print(int(num[::-1]))
#include
#include
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
int n;
while(scanf("%d",&n)!=EOF){
int m = 0, a;
while(1){
a = n%10;
m = m*10 + a;
n = n/10;
if( n == 0){
break;
}
}
printf("%d\n",m);
}
return 0;
}
题目链接:https://www.luogu.com.cn/problem/P1720
(本道题目木有隐藏歌曲……不用猜了……)
《爱与愁的故事第一弹·heartache》最终章。
吃完 pizza,月落乌啼知道超出自己的预算了。为了不在爱与愁大神面前献丑,只好还是硬着头皮去算钱……
算完钱后,月落乌啼想着:“你 TMD 坑我,(以下用闽南语读)归粒靠杯靠亩诶,(以下用英读)是伊特游!”于是当爱与愁大神问多少钱时,月落乌啼说了一堆乱码。爱与愁大神说:“算了算了,我只问第 n n n 样菜价格多少?”月落乌啼写出了:
F n = ( 1 + 5 2 ) n − ( 1 − 5 2 ) n 5 F_n=\dfrac{\left(\frac{1+\sqrt{5}}{2}\right)^n-\left(\frac{1-\sqrt{5}}{2}\right)^n}{\sqrt{5}} Fn=5(21+5)n−(21−5)n
由于爱与愁大神学过编程,于是就用 1 1 1 分钟的时间求出了 F n F_n Fn 的结果。月落乌啼为此大吃一惊。你能学学爱与愁大神求出 F n F_n Fn 的值吗?
一行一个自然数 n n n。
只有 1 1 1 行一个实数 F n F_n Fn,保留两位小数。
6
8.00
对于所有数据: 0 ≤ n ≤ 48 0 \leq n\leq 48 0≤n≤48。
import math
def jia( n ):
num = float((1 + math.sqrt(5)) / 2)
sum = 1
while n > 0:
sum = float(sum * num)
n -= 1
return sum
def jian( n ):
num = float((1 - math.sqrt(5)) / 2)
sum = 1
while n > 0:
sum = float(sum * num)
n -= 1
return sum
if __name__ == '__main__':
n = int(input())
a = jia(n)
b = jian(n)
num = float((a-b)/math.sqrt(5))
# print(round(num,3))
print("{:.2f}".format(num))
#include
#include
#include
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//函数
double HANSHU(int n){
double num = (pow(((1 + sqrt(5.0))/2.0),n) - (pow(((1 - sqrt(5.0))/2.0),n)))/sqrt(5.0);
return num;
}
int main(int argc, char *argv[]) {
int n;
while(scanf("%d",&n)!=EOF){
double num;
num = HANSHU(n);
printf("%.2lf\n",num);
}
return 0;
}
题目链接:https://www.luogu.com.cn/problem/P5724
给出 n n n 和 n n n 个整数 a i a_i ai,求这 n n n 个整数中的极差是什么。极差的意思是一组数中的最大值减去最小值的差。
第一行输入一个正整数 n n n,表示整数个数。
第二行输入 n n n 个整数 a 1 , a 2 … a n a_1,a_2 \dots a_n a1,a2…an,以空格隔开。
输出一个整数,表示这 n n n 个整数的极差。
6
4 1 5 1 4 1
4
数据保证, 1 ≤ n ≤ 100 1 \leq n\leq 100 1≤n≤100, 0 ≤ a i ≤ 1000 0\le a_i \le 1000 0≤ai≤1000。
n = int(input())
num = list(input().split(" "))
max1 = int(num[0])
min1 = int(num[0])
for i in range(0,n-1):
if int(num[i]) > max1:
max1 = int(num[i])
if int(num[i]) < min1:
min1 = int(num[i])
print(max1 - min1)
#include
#include
#include
#include
int main()
{
int n;
scanf("%d",&n);
int min = 1000, max = 1;
for(int i = 1;i <= n;i++)
{
int num;
scanf("%d",&num);
if(num < min)
{
min = num;
}
if(num > max)
{
max = num;
}
}
printf("%d",max - min);
return 0;
}
题目链接:https://www.luogu.com.cn/problem/P1420
输入长度为 n n n 的一个正整数序列,要求输出序列中最长连号的长度。
连号指在序列中,从小到大的连续自然数。
第一行,一个整数 n n n。
第二行, n n n 个整数 a i a_i ai,之间用空格隔开。
一个数,最长连号的个数。
10
1 5 6 2 3 4 5 6 8 9
5
对于 100 % 100\% 100% 的数据,保证 1 ≤ n ≤ 1 0 4 1 \leq n \leq 10^4 1≤n≤104, 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1≤ai≤109。
maxn = 0
n = int(input())
a = list(map(int, input().split()))
lena = len(a)
for i in range(n):
s = 0
for j in range(i + 1, n):
if a[j] == a[j - 1] + 1:
s += 1
else:
break
maxn = max(maxn, s)
print(maxn + 1)
#include
#include
#define M 10000
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[]) {
int n, i, j, count = 0,sum = 0;
scanf("%d",&n);
long long int NUM[M];
for(i = 0;i < n;i++){
scanf("%lld",&NUM[i]);
}
for(j = 0;j <= n;j++){
if(NUM[j] == NUM[j+1] - 1){
count++;
if(count > sum)
sum = count;
}
else count = 0;
}
printf("%d\n",sum+1);
return 0;
}
题目链接:https://www.luogu.com.cn/problem/P1075
已知正整数 n n n 是两个不同的质数的乘积,试求出两者中较大的那个质数。
输入一个正整数 n n n。
输出一个正整数 p p p,即较大的那个质数。
21
7
1 ≤ n ≤ 2 × 1 0 9 1 \le n\le 2\times 10^9 1≤n≤2×109
NOIP 2012 普及组 第一题
n = int(input())
m = 2
while n % m != 0:
m += 1
p = int(n / m)
if p <= m:
p = m
print(p)
#include
int main()
{
int n;
scanf("%d",&n);
int m = 2;
while(n%m != 0)
{
m++;
}
int p = n/m;
if(p <= m) p = m;
printf("%d",p);
return 0;
}
题目链接:https://www.luogu.com.cn/problem/P5725
模仿例题,打印出不同方向的正方形,然后打印三角形矩阵。中间有个空行。
输入矩阵的规模,不超过 9 9 9。
输出矩形和正方形
4
01020304
05060708
09101112
13141516
01
0203
040506
07080910
cnt = 0
n = int(input())
i = 1
while i <= n * n:
if i % n == 1 and i != 1:
print()
# print("\n")
if i < 10:
print("0", end="")
print(i, end="")
i += 1
print()
print()
# print("\n\n")
i = 2 * n
while i > 0:
i -= 2
for j in range(i):
print(" ", end="")
j = 0
while j < (2 * n - i) // 2:
cnt += 1
if cnt < 10:
print("0", end="")
print("%d" % cnt, end="")
j += 1
print()
# print("\n")
#include
#include
#include
#include
int main()
{
int n;
scanf("%d",&n);
int x = 1;
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= n;j++)
{
if(x < 10)
{
printf("0%d",x);
x++;
}
else
{
printf("%d",x);
x++;
}
}
printf("\n");
}
printf("\n");
int m = 1;
for(int i = n-1;i >= 0;i--)
{
for(int j = 0;j < i;j++)
{
printf(" ");
}
for(int t = i;t <= n-1;t++)
{
if(m < 10)
{
printf("0%d",m);
m++;
}
else
{
printf("%d",m);
m++;
}
}
printf("\n");
}
return 0;
}
现在有 n ( n ≤ 1000 ) n(n \le 1000) n(n≤1000) 位评委给选手打分,分值从 0 0 0 到 10 10 10。需要去掉一个最高分,去掉一个最低分(如果有多个最高或者最低分,也只需要去掉一个),剩下的评分的平均数就是这位选手的得分。现在输入评委人数和他们的打分,请输出选手的最后得分,精确到 2 2 2 位小数。
第一行输入一个正整数 n n n,表示有 n n n 个评委。
第二行输入 n n n 个正整数,第 i i i 个正整数表示第 i i i 个评委打出的分值。
输出一行一个两位小数,表示选手的最后得分。
5
9 5 6 8 9
7.67
数据保证, 3 ≤ n ≤ 1000 3 \leq n \leq 1000 3≤n≤1000,每个评委打出的分值为为 0 0 0 到 10 10 10(含 0 0 0 与 10 10 10)之间的整数。
n = int(input())
grades = list(map(int, input().split()))
new = sorted(grades)
sum = 0
for i in range (1,n-1):
sum = sum + new[i]
print(float(round(sum/(n-2),2)))
题目链接:https://www.luogu.com.cn/problem/P4956
在征服南极之后,Davor 开始了一项新的挑战。下一步是在西伯利亚、格林兰、挪威的北极圈远征。他将在 2018 2018 2018 年 12 12 12 月 31 31 31 日开始出发,在这之前需要一共筹集 n n n 元钱。他打算在每个星期一筹集 x x x 元,星期二筹集 x + k x+k x+k 元,……,星期日筹集 x + 6 k x+6k x+6k 元,并连续筹集 52 52 52 个星期。其中 x , k x,k x,k 为正整数,并且满足 1 ≤ x ≤ 100 1 \le x \le 100 1≤x≤100。
现在请你帮忙计算 x , k x,k x,k 为多少时,能刚好筹集 n n n 元。
如果有多个答案,输出 x x x 尽可能大, k k k 尽可能小的。注意 k k k 必须大于 0 0 0。
After successfully conquering the South Pole, Davor is preparing for new challenges. Next up is the Arctic expedition to Siberia, Greenland and Norway. He begins his travels on 31 December 2018, and needs to collect N kunas (Croatian currency) by then. In order to do this, he has decided to put away X (X ≤ 100) kunas every Monday to his travel fund, X + K kunas every Tuesday, X + 2* K every Wednesday, and so on until Sunday, when he will put away X + 6* K kunas. This way, he will collect money for 52 weeks, starting with 1 January 2018 (Monday) until 30 December 2018 (Sunday).
If we know the amount of money N, output the values X and K so that it is possible to collect the exact money amount in the given timespan. The solution will always exist, and if there are multiple, output the one with the greatest X and smallest K .
The first line of input contains the integer N (1456 ≤ N ≤ 145600), the number from the task.
The first line of output must contain the value of X (0 < X ≤ 100 ), and the second the value of
K (K > 0 ).
1456
1
1
6188
14
1
40404
99
4
num = int(input())
n = 1
k = 1
price = int(num / 364)
n = price - 3 * k
k += 1
while n > 100:
n = price - 3 * k
k += 1
print(n)
print(k - 1)
#include
#include
#include
#include
int main()
{
int n, k = 1;
long long num;
scanf("%lld",&num);
int price = num / 364;
do
{
n = price - 3*k;
k++;
}
while(n > 100);
printf("%d\n",n);
printf("%d\n",k - 1);
return 0;
}
题目链接:https://www.luogu.com.cn/problem/P1089
津津的零花钱一直都是自己管理。每个月的月初妈妈给津津 300 300 300 元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同。
为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里,到了年末她会加上 20 % 20\% 20% 还给津津。因此津津制定了一个储蓄计划:每个月的月初,在得到妈妈给的零花钱后,如果她预计到这个月的月末手中还会有多于 100 100 100 元或恰好 100 100 100 元,她就会把整百的钱存在妈妈那里,剩余的钱留在自己手中。
例如 11 11 11月初津津手中还有 83 83 83 元,妈妈给了津津 300 300 300 元。津津预计 11 11 11月的花销是 180 180 180 元,那么她就会在妈妈那里存 200 200 200 元,自己留下 183 183 183 元。到了 11 11 11 月月末,津津手中会剩下 3 3 3 元钱。
津津发现这个储蓄计划的主要风险是,存在妈妈那里的钱在年末之前不能取出。有可能在某个月的月初,津津手中的钱加上这个月妈妈给的钱,不够这个月的原定预算。如果出现这种情况,津津将不得不在这个月省吃俭用,压缩预算。
现在请你根据 2004 2004 2004 年 1 1 1 月到 12 12 12 月每个月津津的预算,判断会不会出现这种情况。如果不会,计算到 2004 2004 2004 年年末,妈妈将津津平常存的钱加上 20 % 20\% 20% 还给津津之后,津津手中会有多少钱。
12 12 12 行数据,每行包含一个小于 350 350 350 的非负整数,分别表示 1 1 1 月到 12 12 12 月津津的预算。
一个整数。如果储蓄计划实施过程中出现某个月钱不够用的情况,输出 − X -X −X, X X X 表示出现这种情况的第一个月;否则输出到 2004 2004 2004 年年末津津手中会有多少钱。
注意,洛谷不需要进行文件输入输出,而是标准输入输出。
290
230
280
200
300
170
340
50
90
80
200
60
-7
290
230
280
200
300
170
330
50
90
80
200
60
1580
x = 0
y = 0
save = 0
flag = 1
month = 0
for i in range(1, 13):
x += 300
y = int(input())
x -= y
if (x < 0):
flag = 0
month = i
break
save += int(x / 100)
x = x % 100
if (flag == 1):
print(120 * save + x)
else:
print(-month)
#include
int main()
{
int n;
int sum = 0; //初始化,用于记录每个月剩余有多少钱
int sum0 = 0; //如果中间没有出现缺钱的情况,那么就用这个sum0来存储每个月在妈妈手里有多少钞票
for (int i = 1; i <= 12; i++) //一年十二个月,不多做解释了
{
sum += 300; //妈妈给钱
scanf("%d", &n);
sum = sum - n;
if (sum < 0) //如果消费大于开支则为负数,直接输出ok
{
printf("-%d\n", i); //特别注意负号
return 0;
}
else
sum0 += sum / 100 * 100; //如果不是就往妈妈手里存钱
sum = sum - sum / 100 * 100; //每个孩子手里剩余多少钱
}
printf("%d\n", sum0 * 12 / 10 + sum); //如果上述未有输出,那么就可以打印输出多少钱了
return 0;
}