【问题标题】:ACM ICPC -Number TheoryACM ICPC-数论
【发布时间】:2012-04-07 18:30:36
【问题描述】:

我在练习 ACM ICPC 过去的问题http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1030

我无法解决这个问题,并且完全不知道如何在 3 秒的时间限制内以有效的方式完成它。 我认为这个问题是基于数论的,但不知道该怎么做。 谢谢!

【问题讨论】:

  • 没有人想通过链接了解您的问题;请在此处总结问题描述。
  • 好吧,Gauss-Jordan 的整数版本似乎很合适。也可以添加一些动态编程习语。
  • 我认为N = 1000的高斯肯定会超过3秒。

标签: c++ algorithm number-theory


【解决方案1】:

虽然转化成向量问题,但是三维向量和这么多变量有点棘手,所以我们可以先降维,把原方程改成: A[1]* (s[1][2]-s[1][1], s[1][3]-s[1][1]) + a[2]* (s[2][2]- s[2][1], s[2][3]- s[2][1]) +.....+a[n]* (s[n][2]- s[n][1],..+a[n]*) = (())。 二维向量被认为是平面坐标系中从原点开始的向量。如果只有两个向量,因为a[i]是一个非负数,所以只有两个向量时,角度一定是PI。如果两个相邻向量之间的夹角不大于PI,则N个向量可以满足上式。代码不长,但需要一个数学思维T_T 这是正确的代码。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;

const int maxn=1000+5;
const double PI=acos(-1);
int main()
{
    int n;
    double A[maxn];
    while(scanf("%d",&n),n)
    {
        int s1,s2,s3;
        for(int i=0;i<n;i++)
        {
            scanf("%d%d%d",&s1,&s2,&s3);
            A[i]=atan2(s2-s1,s3-s1);
        }
        sort(A,A+n);
        double tmp=0;
        for(int i=1;i<n;i++)
            tmp=max(tmp,A[i]-A[i-1]);
        tmp=max(tmp,A[0]-A[n-1]+2*PI);
        if(tmp<=PI)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}

【讨论】:

    【解决方案2】:

    所以我相信:

    (a1,b1,c1), (a2,b2,c2) ... (an,bn,cn)
    

    你需要决定是否存在非负系数:

    X = (x1,x2,...,xn)
    

    这样

    x1*a1 + x2*a2 + ... + xn*an == 
    x1*b1 + x2*b2 + ... + xn*bn == 
    x1*c1 + x2*c2 + ... + xn*cn
    

    只需要一点线性代数。

    提示:尝试构造一个 n == 4 的输入,这样所有 4 个 xi 都必须为正才能解决问题(仅用 3 个无法解决)。这可能吗?

    【讨论】:

    • 这并不完全正确:您不必使用所有 a1, ..., an - 任何子集都可以。
    • @IVlad:在这种情况下,xi 是 0
    • 哦,对了。能详细说明一下解决过程吗?对于 n ,我没有看到一种明显的快速处理方法。
    • @Andrew Tomazos - Fatho:: 我不明白一件事 - 如果 x1>0 && x2>0 ...&& Xn>0 回答是,如果 (x1, x2,x3..xn) 是否为负数?
    • @Jack:嗯……一个有效的答案意味着(x1,x2,...,xn) &gt;= (0,0,...,0)。当且仅当存在有效答案时才回答是。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-17
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多