洛谷的打卡系统与其他网站的打卡系统一样,连续”打卡天数越多,每次打卡获得的奖励也就越多,同时连续天数加上一天。然而,于其他网站只要一天不打卡,连续天数就要清零。与其他网站不同的是,洛谷的打卡更具有人性化,如果多天不打卡,连续天数仅仅只是减少,当遗漏天数越少,减少的天数也就越少。规则是减少 2n−12n−1 天,nn 为连续遗漏天数。连续天数在下一次打卡时清算,打卡连续天数不会小于 00。也就是说,如果每隔一天打卡,那么连续天数就不会变了。
当连续天数达到以下天数时,给予不同的活跃值奖励:
11 天:奖励 11(千里之行,始于足下)
33 天:奖励 22(坚持 33 天了,加油!)
77 天:奖励 33(曜日轮回)
3030 天:奖励 44(月圆月缺,习惯养成)
120120 天:奖励 55(坚持四个月了!)
365365 天:奖励 66(一年四季都坚持下来了!真不容易!)
小 a NN 天前在洛谷注册了一个账号,虽然当时立志每天都要打卡,但发现这不太容易做到。现在知道他 NN 天的的打卡记录,小 a 希望得知他通过打卡,在 NN 天能获得多少活跃值?
#include<stdio.h>
#include<math.h>
int p(int t)
{
if (t == 1 || t == 2)
return 1;
else if (t < 7)
return 2;
else if (t < 30)
return 3;
else if (t < 120)
return 4;
else if (t < 365)
return 5;
else
return 6;
}
int sum = 0, days = 0, noday = 0;
int main()
{
int n;
scanf("%d", &n);
while (n--)
{
int t;
scanf("%d", &t);
if (t)
{
if(noday)
{
days -= pow(2, noday - 1);
if (days < 0)
days = 0;
noday = 0;
}
days++;
sum += p(days);
}
else
{
noday++;
}
}
printf("%d", sum);
return 0;
}
给定一个正整数 nn,对 nn 分解质因数。
设 n=p1×p2×p3×⋯×pxn=p1×p2×p3×⋯×px,其中 pipi 均为质数。
如果 pipi 均为奇数,则称 nn 为『只因数』。
现在,给出若干个 nn,请你判断 nn 是不是『只因数』。
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
while (n--)
{
long long t;
scanf("%lld", &t);
if (t % 2 == 0)
printf("No\n");
else
printf("Yes\n");
}
return 0;
}
值得说明的是,本次比赛就是采用团队私有题目+邀请比赛的机制。
洛谷的运营组决定,如果一名 OIer 向他的教练推荐洛谷,并能够成功的使用(成功使用的定义是:该团队有 2020 个或以上的成员,上传 1010 道以上的私有题目,布置过一次作业并成功举办过一次公开比赛),那么他可以浪费掉 kkksc03 的一些时间的同时消耗掉 kkksc03 的一些金钱以满足自己的一个愿望。
kkksc03 的时间和金钱是有限的,所以他很难满足所有同学的愿望。所以他想知道在自己的能力范围内,最多可以完成多少同学的愿望?
#include<stdio.h>
int main()
{
int n, M, T;
scanf("%d %d %d", &n, &M, &T);
int m[201], t[201], f[300][300];
for (int i = 1; i <= n; i++)
scanf("%d %d", &m[i], &t[i]);
for(int k=1;k<=n;k++)
for (int i = M; i >= m[k]; i--)
for (int j = T; j >= t[k]; j--)
f[i][j] = f[i][j] > f[i - m[k]][j - t[k]] + 1 ? f[i][j]: f[i - m[k]][j - t[k]]+1;
printf("%d", f[M][T]);
return 0;
}
第一行有两个整数 nn,pp,代表学生数与增加分数的次数。
第二行有 nn 个数,a1∼ana1∼an,代表各个学生的初始成绩。
接下来 pp 行,每行有三个数,xx,yy,zz,代表给第 xx 个到第 yy 个学生每人增加 zz 分
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int a[5000001] = { 0 };
int b[5000001] = { 0 };
int n, p, x, y, z;
int min = 100;
int main()
{
scanf("%d %d", &n, &p);
for (int i = 1; i <= n; i++)
{
scanf("%d", &b[i]);
a[i] = b[i] - b[i - 1];
}
for (int i = 1; i <= p; i++)
{
scanf("%d %d %d", &x, &y, &z);
a[x] += z;
if (y + 1 <= n)
{
a[y + 1] -= z;
}
}
for (int i = 1; i <= n; i++)
{
a[i] += a[i - 1];
if (a[i] <= min)
{
min = a[i];
}
}
printf("%d\n", min);
return 0;
}