码迷,mamicode.com
首页 > 其他好文 > 详细

三星ADV考试题

时间:2016-11-15 19:19:25      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:测试   min   include   can   维数   scan   全排列   不能   考试题   

有一条轮胎,起始气压未定,每次进行一次加压和一次减压。一共进行的加压和减压次数由测试用例输入,同时每一次的加压数据和减压的数据也由测试用例输入决定。轮胎的气压要保持在0到limit之间,否则轮胎会爆炸。求为了保证轮胎不爆炸轮胎最小的初始气压。

先由一个二维数组存储充放气的数据,同时需要一个数组进行全排列。因为考虑到全排列的时候前后两组充放气可能有数据是一样的,所以不能直接对二维数组进行全排列。需要用一个一维数组进行辅助。

 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #define SIZE 20
 4 
 5 //int a[5][2]={{50,60},{90,80},{70,30},{40,10},{60,20}};
 6 int a[SIZE][SIZE] = {};//输入数组
 7 int limit = 0;
 8 int max_num = 0;//一共有多少种排列方法
 9 int value=0;//目前胎压
10 int init;//初始胎压
11 int min=100;//最小值
12 int max = 0;//最大值
13 int op[SIZE]={0};//数组脚标原始数组
14 int op_out[SIZE]={0};//数组脚标全排列以后的数组
15 int minout;//最小气压输出值
16 int N;//有多少个case
17 
18 bool issafe(int x,int y){//x代表当前行数,y代表当前行的列号
19     bool ret = true;
20     for(int i =0;i<x;i++){
21         if(op[y]==op_out[i])//i代表之前排过的所有元素,y代表正在操作的数
22             ret = false;
23     }
24     return ret;
25 }
26 void handle(){
27     for(int i=0;i<N;i++){
28         value = init + a[op_out[N]][0] - a[op_out[N]][1];
29         if(value<min)
30             min = value;
31         if(value>max)
32             max = value;
33     }
34     if(min>=0&&max<=limit){minout=0;}
35     if(min<0){
36         minout = -min;
37         if(minout+max<=limit){
38             minout =min;}
39     }
40 
41 }
42 int sort(int step){
43     if(step == N){
44         handle();
45         max_num++;
46         return 1;
47     }
48     for(int i=0;i<N;i++){
49         if(issafe(step,i)){
50             op_out[step] = op[i];
51             sort(step+1);
52         }
53     }
54 }
55 void main(){
56     printf("Please input the numbers of case:\n");
57     scanf("%d",&N);
58     printf("Please input the numbers of limit:\n");
59     scanf("%d",&limit);
60     printf("Please input the numbers of array:(enter to input)\n");
61     for(int i=0;i<N;i++){
62         for(int j=0;j<2;j++)
63             scanf("%d",&a[i][j]);
64     }
65 
66     for(int i=0;i<N;i++){
67       op[i] = i;
68     }
69     sort(0);//把OP数组进行全排列
70     //printf("%d",max_num);
71     printf("%d\n",minout);//最终输出
72     system("pause");
73 }

注意全排列的用法,刚开始编写代码的时候没有考虑到数据相同的情况。比如有充气数据是一样的就没法进行正确的全排列了。所以需要一个一维数组的辅助。

三星ADV考试题

标签:测试   min   include   can   维数   scan   全排列   不能   考试题   

原文地址:http://www.cnblogs.com/linux0537/p/6066638.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!