zoukankan      html  css  js  c++  java
  • 2018“氢舞杯”编程挑战赛

    问题 F: 最小重量机器设计问题

    时间限制: 1Sec 内存限制: 128MB 提交: 115 解决: 0

    题目描述

    设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设Wij 是 
    从供应商j处购得的部件i的重量,Cij 是相应的价格。 
    试设计一个算法,给出总价格不超过c的最小重量机器设计。 
    ′编程任务: 
    对于给定的机器部件重量和机器部件价格,编程计算总价格不超过d的最小重量机器设 
    计。

    输入

    第一行有 3 个正整数 n ,m和 d。接下来的 2n 行,每 
    行m个数。前n行是c,后n行是w。

    输出

    将计算出的最小重量,以及每个部件的供应商输出

    样例输入
    3 3 4 
    1 2 3 
    3 2 1 
    2 2 2 
    1 2 3 
    3 2 1 
    2 2 2
    样例输出
    4 
    1 3 1 

     1 #include<bits/stdc++.h>
     2 #define MAX_N 4000
     3 
     4 int n,m,d,minW;
     5 int w[MAX_N][MAX_N];
     6 int c[MAX_N][MAX_N];
     7 int bf[MAX_N];            //buy from
     8 int r[MAX_N];            //result
     9 
    10 void determ(int i, int cc, int cw){
    11     if(i==n){
    12         minW = cw;
    13         for(i=0;i<n;i++){
    14             r[i] = bf[i];
    15         }
    16         return;
    17     }
    18     for(int j=0;j<m;j++){
    19         if(cc+c[i][j]<=d && cw+w[i][j]<minW){
    20             bf[i] = j;
    21             determ(i+1, cc+c[i][j], cw+w[i][j]);
    22         }
    23     }
    24 }
    25 
    26 int main(){
    27     int i,j;
    28     scanf("%d%d%d",&n,&m,&d);
    29     for(i=0;i<n;i++){
    30         for(j=0;j<m;j++){
    31             scanf("%d",&c[i][j]);
    32         }
    33     }
    34     for(i=0;i<n;i++){
    35         for(j=0;j<m;j++){
    36             scanf("%d",&w[i][j]);
    37         }
    38     }
    39     minW = INT_MAX;
    40     determ(0,0,0);
    41     if(minW != INT_MAX){
    42         printf("%d
    ",minW);
    43         for(i=0;i<n;i++){
    44             printf("%d ",r[i]+1);
    45         }
    46    }
    47 }

     理解2:

     1 #include<stdio.h>
     2 #define n 3    //部件数
     3 #define m 3    //供应商
     4 #define d 4    //总价格不超过d
     5 int w[n][n]={1,2,3,3,2,1,2,2,2},c[n][n]={1,2,3,3,2,1,2,2,2}; 
     6 int a[n]={0},final[n]={0}; //final记录部件的最终供应商,a记录过程中的供应商 
     7 int minweight=1000000;      //最终的最小质量
     8 int weight=0,value=0;     //两个过程值
     9 void traceback(int t){
    10     if(t==3&&value<=d){
    11         if(weight<minweight){
    12             minweight=weight;
    13             for(int k=0;k<n;k++){
    14                 final[k]=a[k];
    15             }
    16         } 
    17         return;
    18     }
    19     if(value<=d){
    20         for(int i=0;i<m;i++){  //遍历的是供应商 
    21             a[t]=i; //记录一下当前的这个部件是从哪个供应商购得
    22             weight+=w[t][i];    
    23             value+=c[t][i];
    24             traceback(t+1);
    25             value-=c[t][i];
    26             weight-=w[t][i];
    27             a[t]=0;
    28         }
    29     }
    30 } 
    31 
    32 int main(){
    33     traceback(0);           //t代表部件 
    34     printf("%d
    ",minweight); 
    35     for(int i=0;i<n;i++)
    36         printf("%d ",final[i]+1);
    37     printf("
    ");   
    38     return 0;
    39 }

    问题 D: 最多约数问题

    时间限制: 1Sec 内存限制: 128MB 提交: 67 解决: 14

    题目描述

    正整数x 的约数是能整除x 的正整数。正整数x 的约数个数记为div(x)。例如,1,2, 
    5,10 都是正整数10 的约数,且div(10)=4。设a 和b 是2 个正整数,a≤b,找出a 和b 
    之间约数个数最多的数x 

    输入

    输入2 个正整数a≤b≤5000000,编程计算a 和b 之间约数个数最多的数。

    输出

    程序运行结束时,找到a 和b 之间约数个数最多的数是x,将div(x)输出

    样例输入
    1 36
    
    样例输出
    9

    问题分析:任何一个数都能分解成几个素数乘积的形式,例如6的约数有1,2,3,6,且6分解成素数相乘6=2*3,
    在比如36的约数有1,2,3,4,6,9,12,18,36,且36分解成素数相乘36=2*2*3*3=2^2*3^2,通过规律我们可以发现
    一个数约数的个数等于它分解成素数相乘后各素数指数加一的乘积,像36约数指数的个数就直接可以以(2+1)*(2+1)=9个来计算。
     1 int prime(int n){//i注意上界
     2     for(int i=2;i*i<n;i++)
     3         if(n%i==0)
     4             return 0;
     5     return 1;
     6 }
     7 
     8 int main(){
     9     int a,b;
    10     int result,maxvalue=-9999;
    11     int temp,count;
    12     scanf("%d%d",&a,&b);
    13     for(int i=a;i<=b;i++){
    14         temp=i;
    15         result=1;
    16         for(int j=2;j<i;j++){
    17             if(prime(j)){
    18                 count=0;
    19                 while(temp%j==0){
    20                     count++;
    21                     temp/=j;
    22                 }//指数加一乘积
    23                 result*=count+1;
    24             }
    25         } 
    26         if(result>maxvalue)
    27             maxvalue=result;
    28     }
    29     printf("%d
    ",maxvalue);    
    30     return 0;
    31 }
    
    

    问题 E: 班级人数

    时间限制: 1Sec 内存限制: 128MB 提交: 29 解决: 22

    题目描述

    某班学生参加程序设计大赛,最后结果及格有超过P%但不足Q%的人。现在给你P和Q,你要算出该班最少有多少人。(数据弱了一点,所以好通过)。

    输入

    两个实数P,Q。用空格隔开。每个数最多有两位小数。0.00<=p<q<=99.99

    输出

    神风堂最少的人数。

    样例输入
    13    14.1
    67.73 67.92
    样例输出
    15
    28
    
    
     1 #include<stdio.h>
     2 int main()
     3 {
     4     float p,q;
     5     int i;
     6       while(scanf("%f%f", &p, &q)==2)
     7       {
     8     for(i = 1; ; i++) 
     9     {
    10          //求相等的时候 
    11         if((int)(i*q/100.0)-(int)(i*p/100.0) == 1) 
    12         {
    13             printf("%d
    ",i);
    14             break;
    15         }
    16     }
    17 }
    18  
    19     return 0;
    20 }





    问题 J: 战场的数目

    时间限制: 1Sec 内存限制: 128MB 提交: 24 解决: 15

    题目描述

    在上题中,假设战场的图形周长为p,一共有多少种可能的战场?

    例如,p<8时没有符合要求的战场,p=8时有2种战场:

     

    p=10有9种战场:

     

     

    要求输出方案总数模987654321的值。

    输入

    输入文件最多包含25组测试数据,每个数据仅包含一行,有一个整数p(1<=p<=109),表示战场的图形周长。p=0表示输入结束,你的程序不应当处理这一行。

    输出

     对于每组数据,输出仅一行,即满足条件的战场总数除以987654321的余数。

    样例输入
    7
    8
    9
    10
    0
    
    样例输出
    0
    2
    0
    9


    问题 I: 核电站问题

    时间限制: 1Sec 内存限制: 128MB 提交: 33 解决: 16

    题目描述

    一个核电站有N个放核物质的坑,坑排列在一条直线上。如果连续3个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质。现在,请你计算:对于给定的N,求不发生爆炸的放置核物质的方案总数。

    输入

    输入文件只有多行,每行对应一个正整数N<=40;

    输出

    输出文件有多行,每行只有一个正整数,表示方案总数

    样例输入
    1
    2
    3
    4
    10
    样例输出
    2
    4
    7
    13
    504



  • 相关阅读:
    【知识强化】第五章 中央处理器 5.3 数据通路的功能和基本结构
    【知识强化】第五章 中央处理器 5.5 指令流水线
    【知识强化】第五章 中央处理器 5.4 控制器的功能和工作原理
    【知识强化】第二章 数据的表示和运算 2.4 算术逻辑单元ALU
    【知识强化】第二章 数据的表示和运算 2.3 浮点数的表示与运算
    【知识强化】第五章 中央处理器 5.2 指令执行过程
    【知识强化】第七章 输入/输出系统 7.3 I/O接口
    【知识强化】第七章 输入/输出系统 7.2 外部设备
    【知识强化】第三章 存储系统 3.7 虚拟存储器
    【知识强化】第七章 输入/输出系统 7.1 I/O系统基本概念
  • 原文地址:https://www.cnblogs.com/dgwblog/p/9191664.html
Copyright © 2011-2022 走看看