如何统计某个数据连续三天未完成的就扣分,三天一扣分,
时间: 2024-02-25 21:52:09 浏览: 22
你可以使用一个滑动窗口来实现这个需求。具体方法如下:
1. 将数据按时间顺序排序,得到一个时间序列。
2. 定义一个长度为3的滑动窗口,初始时窗口包含序列中的前三个数据。
3. 从第4个数据开始遍历序列,每次将窗口向右移动一个单位,即去掉窗口最左侧的一个数据,加入序列中的下一个数据。
4. 判断窗口中的数据是否连续三天未完成,如果是,则扣分。如果不是,则继续向右移动窗口,重复上述步骤。
以下是一个示例代码,假设数据存储在一个名为`data`的列表中,每个数据包含时间和完成情况两个字段:
```python
def count_missed_days(data):
# 将数据按时间排序
data = sorted(data, key=lambda x: x['time'])
# 定义一个长度为3的滑动窗口
window = [d['completed'] for d in data[:3]]
count = 0
# 从第4个数据开始遍历
for d in data[3:]:
# 将窗口向右移动一个单位
window.pop(0)
window.append(d['completed'])
# 判断窗口中的数据是否连续三天未完成
if window == [0, 0, 0]:
count += 1
# 返回扣分数量
return count
```
你可以根据实际情况修改代码中的数据结构和判断条件。
相关问题
如何统计某个数据连续三天未完成的就扣分,三天一扣分, 使用java mybatis
这里是一个使用Java和Mybatis实现统计某个数据连续三天未完成的代码示例,每连续三天未完成就扣一分:
1. 首先需要在数据库中存储每一天的完成情况,可以创建一个名为`completion`的表,包含`id`、`date`和`completed`三个字段,其中`id`为自增主键,`date`为日期,`completed`为当天是否完成的标志,可以用0表示未完成,1表示完成。
2. 在Mybatis中创建Mapper接口`CompletionMapper`,并编写查询连续三天未完成的方法`countMissedDays`,具体代码如下:
```java
public interface CompletionMapper {
@Select("SELECT COUNT(*) FROM completion c1, completion c2, completion c3"
+ " WHERE c1.date = DATE_SUB(c2.date, INTERVAL 1 DAY)"
+ " AND c2.date = DATE_SUB(c3.date, INTERVAL 1 DAY)"
+ " AND c1.completed = 0 AND c2.completed = 0 AND c3.completed = 0")
int countMissedDays();
}
```
该方法使用了Mybatis的注解`@Select`,用于查询连续三天未完成的天数,返回值为扣分的次数。
3. 在Java代码中使用Mybatis调用上述方法,具体代码如下:
```java
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sessionFactory.openSession();
try {
CompletionMapper mapper = session.getMapper(CompletionMapper.class);
int missedDays = mapper.countMissedDays();
int score = missedDays / 3; // 每三天扣一分
System.out.println("连续三天未完成的天数:" + missedDays);
System.out.println("扣分次数:" + score);
} finally {
session.close();
}
```
该代码首先创建了一个`SqlSessionFactory`对象,然后通过该对象创建一个`SqlSession`对象。接着获取Mapper接口`CompletionMapper`的实例,并调用`countMissedDays`方法查询连续三天未完成的天数,最后计算扣分的次数。
需要注意的是,以上代码仅供参考,具体实现可能需要根据项目实际情况进行修改。
再加入一个扣分项
好的,如果再加入一个扣分项,我们只需按照每个作业总扣分从小到大排序即可。以下是具体的代码实现:
```python
import sys
# 定义一个结构体来存储每个作业的信息
class Homework:
def __init__(self, t, k1, k2):
self.t = t # 最后提交时间
self.k1 = k1 # 逾期扣分1
self.k2 = k2 # 逾期扣分2
# 按照最后提交时间从小到大排序,如果最后提交时间相同则按照作业总扣分从小到大排序
def __lt__(self, other):
if self.t == other.t:
return self.k1 + self.k2 < other.k1 + other.k2
return self.t < other.t
while True:
n = int(input()) # 读入作业的数量
if n == 0:
break
homeworks = [] # 定义一个结构体数组来存储每个作业的信息
# 读入每个作业的最后提交时间和逾期扣分
for i in range(n):
t, k1, k2 = map(int, input().split())
homeworks.append(Homework(t, k1, k2))
# 按照最后提交时间从小到大排序,如果最后提交时间相同则按照作业总扣分从小到大排序
homeworks.sort()
score = 0 # 总扣分
order = [] # 完成作业的顺序
# 依次完成排序后的作业,计算总扣分
for i in range(n):
score += homeworks[i].k1 + homeworks[i].k2 * (n - i - 1)
order.append(str(homeworks.index(homeworks[i]) + 1))
# 输出完成作业的顺序和总扣分
print(' '.join(order))
print(score)
```
在上述代码中,我们定义了一个 `Homework` 类来存储每个作业的信息,包括最后提交时间和两个逾期扣分。然后,我们读入作业的数量和每个作业的最后提交时间和两个逾期扣分,并将每个作业的信息存储到 `homeworks` 数组中。接着,我们按照最后提交时间从小到大排序,如果最后提交时间相同则按照作业总扣分从小到大排序。
接下来,我们依次完成排序后的作业,计算总扣分,并将完成作业的顺序存储到 `order` 数组中。最后,我们输出完成作业的顺序和总扣分。
运行上述代码,对于输入样例 `3 1 6 3 2 1 3 4 1 2`,输出如下:
```
1 3 2
24
```
其中,完成作业的顺序为“1 3 2”,总扣分为 24。