pf第四次程序大赛

原创 2006年06月05日 12:20:00

这次题目来自poj:
http://acm.pku.cn/JudgeOnline/showproblem?problem_id=1745
题意大致如下:

对N(1<=N<=10000)个数字,在数字之间添加加号或者减号,每个组合可以计算出一结果。判断这些结果中是否存在能够被K(2<=K<=100)除尽的数字。
比如对:17, 5, -21, 15这4个数字,添加加号或者减号可以得到:
17 + 5 + -21 + 15 = 16
17 + 5 + -21 - 15 = -14
17 + 5 - -21 + 15 = 58
17 + 5 - -21 - 15 = 28
17 - 5 + -21 + 15 = 6
17 - 5 + -21 - 15 = -24
17 - 5 - -21 + 15 = 48
17 - 5 - -21 - 15 = 18
如果K为7,那么可以说:存在17 + 5 + -21 - 15 = -14 能被7除尽。

输入格式:
这个题目有多组数据,每组数据第一行有两个整数,N(1<=N<=10000),K(2<=K<=100)。数字之间由空格分开。第二行是N个数字,他们的绝对值不超过10000,数字之间由空格分开。

输出格式:
对每组数据,如果存在一个组合能被K除尽,那么输出"Divisible",否则输出"Not divisible"。独占一行。

比赛时间:现在起,至11月7日凌晨。(48小时少20分钟)

关于OnlineJudge,熟悉的朋友请跳过:)
在online judge上题目都有测试的时间和空间限制,并对输入输出的格式有严格要求。
时间限制一般设置在足够过滤低效算法的尺度,对适应该题目的算法来说这个时间一般都是绰绰有余的。
输入输出使用的是标准输入输出流,也就是,对c语言使用scanf/printf/getchar/putchar等函数读写,对c++还可以使用cin/cout(但由于cin/cout使用缓冲,需要大量数据输入输出的题目时间开销比较明显)
注意本题中输入数据有多组,但没有提示何时结束输入。这样的情况一般是采取判断输入是否成功的方法。比如:
while(scanf("%d%d", &n, &k) == 2)
{
   /* ...读取n个数据,处理,输出 */
}
对c++:
while(cin>>n)
{
   cin>>k;
   // ...读取n个数据,处理,输出
}

本次比赛我建议(但不强求),参与比赛的朋友请先在poj提交您的代码,确认通过后在此贴出你的提交序号和代码。

最后,我要为LO几又VE同志宣布离开pfan表示遗憾。我觉得应该尊重你的决定,但我希望你有空还是回来看看。祝你实习顺利!

--

  1 楼  

 #include <iostream.h>//动态规划
#define MAX1 100
#define MAX2 10000

int main()
{
    int a[MAX1]={0},n,k;
    while(cin >> n >> k)
    {
        int temp;
        cin >> temp;
        a[(temp+MAX2*k)%k]=1;
        while(--n)
        {
            int b[MAX1]={0};
            cin >> temp;
            for(int i=0;i<k;i++)//新输入的数与上轮存在的余数进行加和减运算
            {
                if(a[i])
                {
                    b[(i+temp+MAX2*k)%k]=1;
                    b[(i-temp+MAX2*k)%k]=1;
                }
            }
            for(i=0;i<k;i++)a[i]=b[i];//某一轮输入结束后,所有存在的余数对应的a数组值取1,别的置0
        }
        if(a[0])cout << "Divisible" << endl;//最后一轮输入结束后,看是否有余数为0,即能整除的结果
        else cout << "Not divisible" << endl;
    }
    return 0;
}

  14 楼  

改进一下:

#include<stdio.h>
#include<stdlib.h>

int a[10000];
int N, K;
int solve(int s, int i);

int main(void)
{
    int i, flag;
        
   while(1)
    {
        printf("/ninput N and K, 0, 0 to quit:/n");
        scanf("%d%d", &N, &K);
        fflush(stdin);
        
        if(N == 0 && K ==0)
            break;
    
        printf("input the data:/n");
        for(i=0; i<N; i++)
            scanf("%d", &a[i]);
        fflush(stdin);
        for(i=0; i<N; i++)
            printf("%d/t", a[i]);
        
        flag = solve(a[0], 1);
        if(flag)
            printf("/n divisile ");
        else
            printf("/nNot divisible");    
    }
    system("pause");
    return 0;
}  

int solve(int s, int i)
{
    int s1, s2, flag1, flag2;  
    
    s1 = s + a[i];
    s2 = s - a[i];
    if(i < N-1)//分为两部分,不仅仅是1/2的提前
    {
        flag1 = solve(s1, i+1);
        if(flag1)
            return flag1;
        else
            flag2 = solve(s2, i+1);
        return flag2;
    }
    else if(s1 % K == 0 || s2 % K == 0)
        return 1;
    else
        return 0;     
}

 

 此帖被评10分

 #include <iostream.h>

#define maxnum 10000
#define maxmod 100

void main()
{
    int n,k,*pdata,len,modmask,i,j;
    
    int  tmpmod[maxmod] = {0};
    int  mod[maxmod]    = {0};
    
    while(cin >> n >> k)
    {
        modmask = maxnum * k;
        
        pdata = new int[n];
        
        pdata[0] = 0;
        pdata[1] = 0;
        
        len = 0;
        for (i = 0; i < n; i++)
        {
            cin >> pdata[len];
            if (pdata[len] % k != 0) len++;
        }
        n = len > 2 ? len : 2;
        
        mod[0] = (pdata[0] + modmask) % k;
        
        len = 1;
        for (j = 1; j < n - 1; j++)
        {
            char used[maxmod] = {1};
            
            int mod1   = 0;
            int mod2   = 0;
            int tmplen = 0;
            
            for (i = 0; i < len; i++)
            {
                mod1 = (mod[i] + pdata[j] + modmask) % k ;
                mod2 = (mod[i] - pdata[j] + modmask) % k ;
                
                if (!used[mod1]) { tmpmod[tmplen++] = mod1; used[mod1] = 1; }
                if (!used[mod2]) { tmpmod[tmplen++] = mod2; used[mod2] = 1; }
            }
            for (i = 0 ; i < tmplen; i++) mod[i] = tmpmod[i];        
            len = tmplen;
        }
        
        for (i = 0 ; i < len; i++)
            if ( ((mod[i] + pdata[n - 1]) % k == 0) || ((mod[i] - pdata[n - 1]) % k == 0) )
            {  cout << "Divisible" << endl; break; }
            
            if (i >= len)
                cout << "Not divisible" << endl;
            
            delete []pdata;
    }
}

计算机网络第四次作业

存储客户端与服务器对话内容的数据库如下图所示:     下面展示部分代码: 连接数据库 客户端部分代码: 服务器端: public class Server {     private DBU...
  • ABnanna
  • ABnanna
  • 2017年10月24日 21:10
  • 97

97年世界编程大赛一等奖作品代码--太牛了,偶像!

97年世界编程大赛一等奖作品代码--太牛了,偶像! 转载▼ 这个程序(omni.com)是97年的Mekka ’97 4K Intro比赛的一等奖作品, 整个程序全长40...
  • yippeelyl
  • yippeelyl
  • 2015年05月08日 07:29
  • 2952

河南省第十届ACM程序设计大赛参赛心得

今年上半年参加了好多比赛,从前到后有 天梯赛、 蓝桥杯 、自己学校的校赛、还有第十届ACM程序设计大赛。 省赛成绩不好啦,本来并不想写些什么,但是组织内部要求内部成员必须写一篇放到自己博客上。所以就...
  • wyxeainn
  • wyxeainn
  • 2017年05月09日 21:19
  • 503

粒子滤波(PF:Particle Filter)

粒子滤波(PF:Particle Filter)  与卡尔曼滤波(Kalman Filter)相比较   粒子滤波(PF: Particle Filter)的思想基于蒙特卡洛方法(Monte C...
  • zyh821351004
  • zyh821351004
  • 2015年08月10日 21:33
  • 1632

世界编程大赛第一名写的程序

世界编程大赛第一名写的程序 汇编语言所写的。 这个程序是97年Mekka ’97 4K Intro比赛的一等奖作品,汇编语言所写。整个程序全长4095字节, 生成.com程序只有4K,可是却实现了...
  • zhuofeng85
  • zhuofeng85
  • 2013年12月14日 23:41
  • 10420

mac电脑上遇到的坑,持续更新...

记录了用mac电脑开发时遇到的坑
  • thc1987
  • thc1987
  • 2016年12月15日 10:01
  • 1135

1987年C语言乱码大赛之最优秀单行代码

转自:http://blog.sina.com.cn/s/blog_6adee4450100m6o9.html 看这行代码: printf(&unix["\021%six\012\0"], (unix...
  • smstong
  • smstong
  • 2016年02月04日 19:24
  • 3069

区块链将成为引导第四次工业革命的重要力量

第四次工业革命正在深刻地改变着我们周围的所有事物,甚至是我们的生活方式。本次革命有望在所有工业领域创建更高的效率、为人类带来最大的福利。然而,第四次工业革命要想取得成功,必须要有一个开放、无国界的支付...
  • qq53016353
  • qq53016353
  • 2016年10月18日 12:34
  • 196

intel网卡-虚拟化中的SR-IOV教程

虚拟化环境中有很多的硬件加速技术,这些技术标准来源于行业内的领导者或各种组织机构,但是在实际项目落地时又有哪些会被启用呢?哪些启用的功能带来了性能上明显的提升呢?那么这些加速技术如果不痛不痒的话那么它...
  • nyemutou
  • nyemutou
  • 2015年10月13日 19:13
  • 4638

第八届ACM趣味程序设计竞赛第三场(正式赛)官方题解

UESTC 第八届ACM趣味程序设计竞赛第三场(正式赛)题解 若有疑问建议先看题解然后自己代码实现,实在不行再看文章最后的标程 A - 渐变字符串 B - 保护果实 C - Little_Pro的dr...
  • ProLightsfxjh
  • ProLightsfxjh
  • 2016年12月11日 17:01
  • 2955
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:pf第四次程序大赛
举报原因:
原因补充:

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