zoukankan      html  css  js  c++  java
  • poj1809

    题意:给出一些顶点均为整数坐标,问能构成多少个面积为整数的三角形。给出公式:A=|x1y2 - y1x2 + x2y3 - y2x3 + x3y1 - y3x1|/2

    分析:面积是否为整数只需要看|x1y2 - y1x2 + x2y3 - y2x3 + x3y1 - y3x1|mod2是否为0,所以可以先对每个x,y都mod2,并不影响结果。所以总共有4种点,01,00,10,11。3重循环枚举三角形的3个顶点分别是哪种,并用公式计算其面积是否为整数,若为整数则用组合数学知识,通过每种顶点的个数计算能构成的三角形数。

    View Code
    #include <iostream>
    #include
    <cstdio>
    #include
    <cstdlib>
    #include
    <cstring>
    using namespace std;

    int n;
    long long f[4];

    void input()
    {
    scanf(
    "%d", &n);
    memset(f,
    0, sizeof(f));
    for (int i = 0; i < n; i++)
    {
    int x, y;
    scanf(
    "%d%d", &x, &y);
    f[((x
    & 1) << 1) + (y & 1)]++;
    }
    }

    void work()
    {
    long long ans = 0;
    for (int i = 0; i < 4; i++)
    for (int j = i; j < 4; j++)
    for (int k = j; k < 4; k++)
    {
    int x1 = i >> 1;
    int x2 = j >> 1;
    int x3 = k >> 1;
    int y1 = i & 1;
    int y2 = j & 1;
    int y3 = k & 1;
    if (!((x1 * y2 - y1 * x2 + x2 * y3 - x3 *y2 + x3 * y1 - x1 * y3) & 1))
    {
    if (i == j && j ==k)
    ans
    += f[i] * (f[i] - 1) * (f[i] - 2) / 6;
    else if (i == j)
    ans
    += f[i] * (f[i] - 1) * f[k] / 2;
    else if (j == k)
    ans
    += f[i] * (f[j] - 1) * f[j] / 2;
    else
    ans
    += f[i] * f[j] * f[k];
    }
    }
    printf(
    "%lld\n", ans);
    }

    int main()
    {
    //freopen("t.txt", "r", stdin);
    int t;
    scanf(
    "%d", &t);
    for (int i = 0; i < t; i++)
    {
    printf(
    "Scenario #%d:\n", i + 1);
    input();
    work();
    putchar(
    '\n');
    }
    return 0;
    }
  • 相关阅读:
    Flex 布局
    vue学习之用 Vue.js + Vue Router 创建单页应用的几个步骤
    vue学习起步:了解下
    vue学习一:新建或打开vue项目(vue-cli2)
    adb环境变量配置
    数据类型判断和数据类型转换代码工具
    日期工具集合
    postman变量的使用和设置
    浮点数运算和金额处理
    07- Linux常用命令
  • 原文地址:https://www.cnblogs.com/rainydays/p/2138542.html
Copyright © 2011-2022 走看看