三星ADV考试题(充气问题)

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

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

#include <stdio.h>
#include <stdlib.h>
#define SIZE 20

//int a[5][2]={{50,60},{90,80},{70,30},{40,10},{60,20}};
int a[SIZE][SIZE] = {};//输入数组
int limit = 0;
int max_num = 0;//一共有多少种排列方法
int value=0;//目前胎压
int init;//初始胎压
int min=100;//最小值
int max = 0;//最大值
int op[SIZE]={0};//数组脚标原始数组
int op_out[SIZE]={0};//数组脚标全排列以后的数组
int minout;//最小气压输出值
int N;//有多少个case

bool issafe(int x,int y){//x代表当前行数,y代表当前行的列号
bool ret = true;
for(int i =0;i<x;i++){
if(op[y]==op_out[i])//i代表之前排过的所有元素,y代表正在操作的数
ret = false;
}
return ret;
}
void handle(){
for(int i=0;i<N;i++){
value = init + a[op_out[N]][0] - a[op_out[N]][1];
if(value<min)
min = value;
if(value>max)
max = value;
}
if(min>=0&&max<=limit){minout=0;}
if(min<0){
minout = -min;
if(minout+max<=limit){
minout =min;}
}

}
int sort(int step){
if(step == N){
handle();
max_num++;
return 1;
}
for(int i=0;i<N;i++){
if(issafe(step,i)){
op_out[step] = op[i];
sort(step+1);
}
}
}
void main(){
printf("Please input the numbers of case:\n");
scanf("%d",&N);
printf("Please input the numbers of limit:\n");
scanf("%d",&limit);
printf("Please input the numbers of array:(enter to input)\n");
for(int i=0;i<N;i++){
for(int j=0;j<2;j++)
scanf("%d",&a[i][j]);
}

for(int i=0;i<N;i++){
op[i] = i;
}
sort(0);//把OP数组进行全排列
//printf("%d",max_num);
printf("%d\n",minout);//最终输出
system("pause");
}

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

大多数想法要么平庸,要么更糟糕,这很大程度上因为绝妙的想法难得一见,而且他们还要在我们身边这个充斥了各种恶俗的所谓常识的环境中孕育生长。
永不止步步 发表于01-09 10:21 浏览65535次
分享到:

已有0条评论

暂时还没有回复哟,快来抢沙发吧

添加一条新评论

只有登录用户才能评论,请先登录注册哦!

话题作者

永不止步步
金币:67410个|学分:308467个
立即注册
畅学电子网,带你进入电子开发学习世界
专业电子工程技术学习交流社区,加入畅学一起充电加油吧!

x

畅学电子网订阅号