input.txt
75 45 80
30 55 95
2 100
65 90
20 30
5 150
35 105 100 45 75
115 75 55 35 105
7 150
70 95 15 65 85 75 55
105 80 10 90 115 110 45
8 200
35 30 50 80 70 15 10 40
70 20 20 85 65 40 25 50
#include <stdio.h>
#include <stdlib.h>
//#define SIZE 8
//int Limit = 200;
int M;
int SIZE;
int Limit;//充气上限
int IN[20]={};
int OUT[20]={};
int OP[20]={};
//int IN[SIZE] = {35, 30, 50, 80, 70, 15, 10, 40};//充气
//int OUT[SIZE] = {70, 20, 20, 85, 65, 40, 25, 50 };//放气
////
//int OP[SIZE] = {0,1,2,3,4,5,6,7};//充放气方式全排
int count = 0;//充放气方式全排列次数
int minPressure = 0x7FFFFFFF;//最小气压
int minPressureNUM = 1000000;//最小气压 上限(不可能达到的值)
//int impossible = 1000000;
bool isSafe(int x,int y){
bool ret = true;
for(int i=0;i<x;i++){
if(y == OP[i])
ret = false;
}
return ret;
}
//void print(){
// for(int i=0;i<SIZE;i++){
// printf("%d\0",OP[i]);
//
// }
// printf("\n");
//}
int getMinPressure(int N){
int maxIN=0,minOUT=0x7FFFFFFF;
int curPressure = 0;
for(int i=0;i<N;i++){
curPressure += IN[OP[i]];
if(curPressure>maxIN)
maxIN = curPressure;
curPressure -= OUT[OP[i]];
if(curPressure <minOUT)
minOUT = curPressure;
}
if(minOUT >=0 && maxIN<=Limit ){
minPressure =0;
}
if(minOUT<0){
minOUT = -minOUT;
if(maxIN + minOUT<=Limit){
minPressure = minOUT;
}
}
return minPressure;
}
void func(int step){
if(step == SIZE){
//print();
//int a;
minPressure =getMinPressure(SIZE);
if(minPressure>0&&minPressure<minPressureNUM){//更新气压上限值
minPressureNUM = minPressure;
}
//printf("%d\n",minPressureNUM);
count++;
return;
}
for(int i=0;i<SIZE;i++){
if(isSafe(step,i)){
OP[step] = i;
func(step+1);
}
}
}
int main(){
freopen("input.txt","r",stdin);
scanf("%d",&M);
for(int i=0;i<M;i++){
scanf("%d",&SIZE);scanf("%d",&Limit);
for(int j=0;j<SIZE;j++){
scanf("%d",&IN[j]);
}
for(int m=0;m<SIZE;m++){
scanf("%d",&OUT[m]);
}
func(0);
if( minPressureNUM == 1000000){//若上限值未更新,则表示气压充暴,输出-1
minPressureNUM = -1;
}
printf("%d\n",minPressureNUM);
minPressureNUM = 1000000;
minPressure = 0x7FFFFFFF;
}
}
//int main(){
// func(0);
// if( minPressureNUM == 1000000){//若上限值未更新,则表示气压充暴,输出-1
// minPressureNUM = -1;
// }
// printf("%d\n",minPressureNUM);
//}