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;
    }
}

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

相关文章推荐

第四次C程序设计实验报告

目标: 1.学习C语言调试方法 2.复习C语言基本语法、函数、选择和重复控制语句; 任务1:参考《C语言调试方法》掌握代码的调试和排错技巧.把调试过程出现的问题,写到报告中。 说明:学习编...

面向对象程序设计第四次实验课——socket初试

题目大意是使用socket实现一个聊天程序。server//#include "stdafx.h" #include "server.h" #include "serverDlg.h" #includ...

RBPF和PF的程序

  • 2009-03-13 14:05
  • 20KB
  • 下载

长虹彩电pf25118程序

2017"百度之星"程序设计大赛-资格赛-1004-度度熊的午饭时光

ACM模版描述题解我真想吐槽这次比赛出题人是多么的糙,题意难以理解也就算了,还有错别字……有强迫症的我十分痛苦。反正又是一个 dpdp,有些像 0101 背包,看看代码吧,没啥太大区别。虽然也有那么一...
  • f_zyj
  • f_zyj
  • 2017-08-07 16:18
  • 280

2009年校程序设计大赛五个题目

// Test_TianMo.cpp : Defines the entry point for the console application. // #include "stdafx.h"...

2006年百度之星程序设计大赛初赛题目2:蝈蝈式的记分

··题目名称:蝈蝈式的记分 ··内容描述:    蝈蝈小朋友刚刚学会了0-9这十个数字,也跟爸爸妈妈来参加百度每周进行的羽毛球活动。但是他还没有球拍高,于是大人们叫他记录分数。聪明的蝈蝈发现只...

河南省第四届程序设计大赛--Substring

描述 You are given a string input. You are to find the longest substring of input such that the revers...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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