【贪心】【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();
        }
    }
}


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

线段树模版—A Simple Problem with Integers

D - A Simple Problem with Integers Time Limit:5000MS     Memory Limit:131072KB     64bit IO Format:...
  • llzhh
  • llzhh
  • 2016年04月29日 00:03
  • 161

A Simple Problem with Integers----线段树

C - A Simple Problem with Integers Time Limit:5000MS     Memory Limit:131072KB     64bit IO Format:...
  • bless924295
  • bless924295
  • 2016年06月02日 18:55
  • 424

hdu4267--A Simple Problem with Integers(树状数组)

题目链接:点击打开链接 题目大意:有一个n个数的序列,有两种操作1 a b k c 在区间[a,b]内的i,如果满足(i-a)%k == 0 那么第i个数就加上c, 2 a问第a个数的值是什么,首...
  • u013015642
  • u013015642
  • 2015年08月26日 08:53
  • 1263

PAT(A) - 1078. Hashing (25)

The task of this problem is simple: insert a sequence of distinct positive integers into a hash tabl...
  • flx413
  • flx413
  • 2016年10月10日 22:04
  • 162

HDU 4267 A Simple Problem with Integers(树状数组)

A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 ...
  • yeguxin
  • yeguxin
  • 2015年08月26日 10:46
  • 596

POJ 3468 A Simple Problem with Integers Splay tree&Segment tree

转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents           by---cxlove N年前用线段树做的,比较简单...
  • ACM_cxlove
  • ACM_cxlove
  • 2012年07月27日 14:38
  • 3006

078. Hashing (25)

提供Msize大小的哈希表(编号从0~Msize-1) 有N个要填入的值 接着是N个要填入的值 key1 key2 …… 首先找到一个质素,prime>=Msize;这个质素是最接近Msize的;...
  • u014646950
  • u014646950
  • 2015年08月17日 00:32
  • 591

HDU1757 A Simple Math Problem

#include #include using namespace std; int mod; typedef struct {     long long m[10][10]; }...
  • AC_Gibson
  • AC_Gibson
  • 2014年08月04日 15:08
  • 317

poj 3468 A Simple Problem with Integers(splay tree模板题)

A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Subm...
  • zuihoudebingwen
  • zuihoudebingwen
  • 2012年10月03日 15:13
  • 2324

A simple problem

Problem Description There is a simple problem. Given a number N. you are going to calculate N%1+N...
  • u011123263
  • u011123263
  • 2014年06月12日 22:58
  • 587
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【贪心】【TOJ4107】【A simple problem】
举报原因:
原因补充:

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