【贪心】【TOJ4107】【A simple problem】

原创 2015年07月09日 18:22:44

Given three integers n(1n1018)m(1m105)k(1k1018). you should find a list of integer A1,A2,,Am which satisfies three conditions:
1. A1+A2++Am=n.
2. 1Aik1 for each (1im).
3. GCD(A1,A2,,Am)=1.GCD means the greatest common divisor
4. if i<j then AiAj.
As the author is too lazy to write a special judge, if there's no answer ouput "I love ACM", And if there's more than one answer, output the one has the minimum A1, and if there still multiple answer make theA2 as small as possible, then A3,A4






m=1  直接 “I love ACM”

m=2

均摊 第二个给第一个不断给1

m=3 

均摊 最后一个给第一个1个1


很多边界数据注意下

3 3 1

1 1 1

1 1 4

等等..



代码如下:

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <ctime>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#define oo 0x13131313
using namespace std;
long long n,m,k;
long long gcd(long long a,long long b)
{
    long long r;
    while(b>0)
    {
         r=a%b;
         a=b;
         b=r;
    }
    return a;
}
long long A[100000+5];
void do1()
{
    if(n%2==1)
    {
        long long p=n/2+1;
        if(p<=k-1) printf("%lld %lld\n",p,p-1);
        else printf("I love ACM\n");
    }
    else
    {
        int ok=1;
        long long a=n/2,b=n/2;
        while(a+1<=k-1&&b-1>=1)
        {
            a++;
            b--;
            if(gcd(a,b)==1)
            {
                ok=0;
                printf("%lld %lld\n",a,b);
                break;
            }
        }
        if(ok)
        printf("I love ACM\n");
    }
}
void do2()
{
    memset(A,0,sizeof(A));
    for(int i=1;i<=m;i++)
    {
        A[i]=n/m;
    }
    for(int i=1;i<=n%m;i++)
    {
        A[i]++;
    }
    if(n%m==0&&n!=m)
    {
        A[1]++;A[m]--;
    }
    if(A[1]<=k-1&&A[m]>=1)
    {
     for(int i=1;i<=m;i++)
    {
        printf("%lld",A[i]);
        if(i!=m) printf(" ");
    }
    printf("\n");
    }
    else printf("I love ACM\n");
}
int main()
{
    while(cin>>n>>m>>k)
    {
        if(m==1&&n!=1||k==1) printf("I love ACM\n");
        else if(m==1&&n==1) printf("1\n");
        else
        {
                if(m==2) do1();
                else if(m>=3) do2();
        }
    }
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

TOJ 2896.Antimonotonicity(贪心)

题目链接:http://acm.tju.edu.cn/toj/showp2881.html 2881.   Biased Standings Time Limit: 3.0 Seconds  ...

【TOJ 1163】Gone Fishing【贪心+枚举】

题意:给出n个湖,还有渔夫这次行钓的总时间,

TOJ 1283 A DP Problem 字符串处理,搜索

这个题,很多细节需要处理。  思路比较简单讲=号两边的 算式 整理为 ax+b=cx+d 的形式,这样再来计算; 总体来说难度不大。 记得结果为负号并且是浮点数的时候,与正数不一样; 比如 3x= -...

TOJ 2867.Picking Problem(最大区间调度)

题目链接:http://acm.tju.edu.cn/toj/showp2762.html 2867.   Picking Problem Time Limit: 1.0 Seco...

TOJ 1115 POJ 1328 Radar Installation 贪心 C/C++

贪心思路: cor[i]数组保存覆盖到该岛的雷达能放置的区间,然后按照左端点从小到大对数组排序。 只要雷达放置在某岛的cor[i]保存的区间内,这个岛就能被这个雷达覆盖。 排序后,相邻的两个区间...

【TOJ 3701.】A Pungent Problem【树链刨分】

裸的树链刨分。 #include #include #include #include using namespace std; #define N 30009 #define lc (d<...

HDU 4267 A Simple Problem with Integers Regional Changchun Online

题目大意: 给定一个一段区间,让你执行两种操作,一种是加入一种是查询。 题解:根据k的值建立10类树状数组,每类中根据i%k的不同建立k棵树状数组,也就是55棵树状数组,这样每次修改操作只对其中1...

北大ACM3468——A Simple Problem with Integers~~线段树的应用

题目的意思很明确,有两种操作,一种是计算一个数列的第 a 到 第b的和,另一种是第 a 到 第 b 之间的数加上 c。由于这些操作的数目很大,用普通的办法无法办到,会超时。 对于这类问题,用线段树可以...

POJ 3468 A Simple Problem with Integers //线段树的成段更新

线段树的成段更新lazy操作

poj3468 A Simple Problem with Integers

区间求和,区间更新。 需要覆盖区间,延迟处理。 void PushSub(int rt,int m){ if(color[rt]){ color[rt<<1]+=color[rt];...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)