Cheating Detection

本文详细介绍了谷歌CodeJam2021资格赛中的一道题目——作弊检测。通过分析代码,我们可以看到作者使用了概率分布和排序算法来评估参赛者和试题的难度水平,并计算期望结果与实际结果的差异,以此判断是否存在作弊行为。涉及的知识点包括随机数生成、排序、Sigmoid函数等。
摘要由CSDN通过智能技术生成

Google Code Jam 2021 - Qualification Round
Cheating Detection

#include <algorithm>
#include <cmath>
#include <ctime>
#include <iostream>
#include <random>
#include <string>
using namespace std;

const int QC = 10000;
const int PC = 100;

struct info {
  int idx;
  int cnt;
  double lvl;
  double w;
} qs[QC + 5], ps[PC + 2];

// float ;
double prob[QC + 5];
char str[PC + 2][QC + 2];

inline bool cmp(info x, info y);
inline void get_rand(int size);
inline void set_peo_level();
inline void set_qst_level();
inline double sigmoid(double x);
inline int judge();

random_device rd;  // Will be used to obtain a seed for the random number engine
mt19937 gen(rd());  // Standard mersenne_twister_engine seeded with rd()
uniform_real_distribution<> dis(-3.0, 3.0);  //[-3.00,3.00]

int main() {
  freopen("D:\\workspace\\cheating_detection_sample_ts1_input.txt", "r", stdin);
  ios::sync_with_stdio(false), cin.tie(nullptr);
  int T, P, ans;
  cin >> T >> P;
  for (int tc = 1; tc <= T; tc++) {
    //初始化 问题
    for (int j = 0; j < QC; j++) {
      qs[j].idx = j;
      qs[j].lvl = 0;
      qs[j].cnt = 0;
      qs[j].w = 0;
    }
    // read case
    for (int i = 0; i < PC; i++) {
      cin >> str[i];
      ps[i].idx = i;
      ps[i].lvl = 0;
      ps[i].cnt = 0;
      ps[i].w = 0;
      for (int j = 0; j < QC; j++) {
        if (str[i][j] == '1')
          ps[i].cnt++;
        else
          qs[j].cnt++;
      }
    }
    //排序
    sort(ps, ps + PC, cmp);
    sort(qs, qs + QC, cmp);
    //指定人的skill level
    set_peo_level();
    //指定题目difficult level
    set_qst_level();

    ans = judge();
    cout << "Case #" << tc << ": " << ans << endl;
  }

  return 0;
}

inline bool cmp(info x, info y) { return x.cnt < y.cnt; }

inline void set_peo_level() {
  for (int i = 0; i < PC; i++) prob[i] = dis(gen);
  sort(prob, prob + PC);
  for (int i = 0; i < PC; i++) ps[i].lvl = prob[i];
}

inline void set_qst_level() {
  for (int i = 0; i < QC; i++) prob[i] = dis(gen);
  sort(prob, prob + QC);
  for (int i = 0; i < QC; i++) qs[i].lvl = prob[i];
}

inline double randD() { return (double)rand() / RAND_MAX * 6 - 3; }

// inline double sigmoid(double x) { return 1 / (1 + exp(-x)); }
inline double sigmoid(double x) { return 1.0 / (1.0 + exp(-x)); }

inline int judge() {
  int maxid = 0;
  double maxd = 0;
  for (int k = 0; k < PC; k++) {
    int id = 9999;
    for (int i = 4; i > 0; i--) {//计算最难的500个题目,5 *100
      double real = 0, hope = 0;
      for (int j = 0; j < 100 ; j++) {
        real += (str[ps[k].idx][qs[id].idx] == '1');  //实际结果
        hope += sigmoid(ps[k].lvl - qs[id--].lvl);    //期望结果
      }
      ps[k].w += abs(real - hope) * pow(i,2);//pow 当做是题目块的权值,100个题目为一块
    }
    if (ps[k].w > maxd) {  //计算期望结果和实际结果
      maxd = ps[k].w;
      maxid = ps[k].idx;
    }
  }
  return maxid + 1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
图像识别技术在病虫害检测中的应用是一个快速发展的领域,它结合了计算机视觉和机器学习算法来自动识别和分类植物上的病虫害。以下是这一技术的一些关键步骤和组成部分: 1. **数据收集**:首先需要收集大量的植物图像数据,这些数据包括健康植物的图像以及受不同病虫害影响的植物图像。 2. **图像预处理**:对收集到的图像进行处理,以提高后续分析的准确性。这可能包括调整亮度、对比度、去噪、裁剪、缩放等。 3. **特征提取**:从图像中提取有助于识别病虫害的特征。这些特征可能包括颜色、纹理、形状、边缘等。 4. **模型训练**:使用机器学习算法(如支持向量机、随机森林、卷积神经网络等)来训练模型。训练过程中,算法会学习如何根据提取的特征来识别不同的病虫害。 5. **模型验证和测试**:在独立的测试集上验证模型的性能,以确保其准确性和泛化能力。 6. **部署和应用**:将训练好的模型部署到实际的病虫害检测系统中,可以是移动应用、网页服务或集成到智能农业设备中。 7. **实时监测**:在实际应用中,系统可以实时接收植物图像,并快速给出病虫害的检测结果。 8. **持续学习**:随着时间的推移,系统可以不断学习新的病虫害样本,以提高其识别能力。 9. **用户界面**:为了方便用户使用,通常会有一个用户友好的界面,显示检测结果,并提供进一步的指导或建议。 这项技术的优势在于它可以快速、准确地识别出病虫害,甚至在早期阶段就能发现问题,从而及时采取措施。此外,它还可以减少对化学农药的依赖,支持可持续农业发展。随着技术的不断进步,图像识别在病虫害检测中的应用将越来越广泛。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值