标签:测试 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 }
注意全排列的用法,刚开始编写代码的时候没有考虑到数据相同的情况。比如有充气数据是一样的就没法进行正确的全排列了。所以需要一个一维数组的辅助。
标签:测试 min include can 维数 scan 全排列 不能 考试题
原文地址:http://www.cnblogs.com/linux0537/p/6066638.html