【贪心】【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 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 3701.】A Pungent Problem【树链刨分】

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

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

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

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

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

poj-3468-A Simple Problem with Integers(树状数组更新区间查区间)

题目链接:http://poj.org/problem?id=3468 题意:  更新区间 查区间。 树状数组的 区间修改+区间查询 首先依旧是引入delta数组 delta[i]表示区...

[ACM] poj 3468 A Simple Problem with Integers(线段树,成段更新,懒惰标记)

A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Subm...

poj 3468 A Simple Problem with Integers(线段树成段更新,懒惰标记的使用)经典题目

1、http://poj.org/problem?id=3468 2、题目: A Simple Problem with Integers Time Limit: 5000MS   Memor...

【BJTU+A simple problem+异或+数位DP】

【题目描述】: 题面描述 求 0~n 中有多少个整数 k 满足 (2 * k) XOR (3 * k) == k, 其中 XOR 为异或操作。 输入数据 输入数据的第一行为一个正整数 T(T ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【贪心】【TOJ4107】【A simple problem】
举报原因:
原因补充:

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