Problem Description
“想不出来”是一个贪心的孩子,他天天想着怎么让自己变的有钱,有一天他想到去做生意,他想用自己身上唯一的n元钱去买a物品,再用a物品按一定的比例换b物品。。。。。最后再把东西卖了。
比如Sample里的数据,想不出来先用10000买了12000个1物品,再用1物品换到了15600个2物品,再将2物品卖了得到21840元钱。
可是,想不出来不知道怎样才可以得到最多的钱,所以他请你来帮帮他。(任务物品可以分割为很细小的一块,同时,每个物品或钱最多只能进行一次买卖,特别请注意:一旦将物品转换为钱,则交易就结束了)
Input
每组数据第一行输入一个n(n <= 10000)(表示想不出来一开始有的钱数)和一个m(m <= 10000)(表示接下来有m组兑换关系)
接下来有m组数据a , b , c。
0<= a, b <= 1000000, 0 <= c <= 2;
输入过程中当a或b为0时表示为钱;
注意:输入中没给出的兑换关系表示不能兑换,兑换过程中物品都将全部兑换,兑换过程中不会出现循环。
Output
输出想不出来最后最多的钱数。(保留2位有效数字)(最后结果中不会超过2^31 - 1)。
Sample Input
10000 3
0 1 1.2
1 2 1.3
2 0 1.4
Sample Output
21840.00
代码: #include
#include //输入输出文件流
#include
#include
#define M 4
#define N 5
using namespace std;
double pow(double x,double y); //计算2^31的函数
int main() {
ifstream fs("d:\file.txt",ios::in|ios::out); //以写方式打开文件file.txt
while(fs.good ())
cout<<(char)fs.get (); //输出文件
fs.close ();
cout< pow(2,31); //调用pow()函数
float max; //临时储存一个值
max=pow(2,31)-1;
float n; //开始有的钱数
int m; //m组兑换关系
int i; //用于循环
cout scanf("%f%d",&n,&m); printf("n=%.0f,m=%d\n",n,m);
start: if(n>10000||m>10000) { printf("输入的数据不符合规定!\n");
printf("请重新输入n和m的值\n");
scanf("%f%d",&n,&m);
printf("n=%.0f,m=%d\n",n,m);
goto start; } else {
printf("下面请输入%d组物品名字及对应物品之间兑换关系
且关系比例大于等于1小于等于2\n",m); } if(m==4)
{ int a[N],b[N];
float w[N];
for(i=1;i<=m;i++)
{ scanf("%d",&a[i]); //存入物品名称
scanf("%d",&b[i]); //存入物品名称
scanf("%f",&w[i]); //存入物品兑换比例
}
n=n*w[1];
int j; //用于循环
float temp,temp1,temp2; //用于交换数值
temp=n; for(j=1;j { if(b[j]==a[j+2])
{
n=n*w[j+1];
temp1=n;
}
} for(j=1;j { if(b[j]==a[j+2])
{ n=temp;
n=n*w[j+2];
temp2=n;
}
}
if(temp1>=temp2)
n=temp1;
else n=temp2;
if(n<max) {
printf("%.2f\n",n); //输出赚的钱数
printf("¥¥¥¥\n");
printf("赚大钱啦!\n");
} else
{
printf("超出最大范围.\n");
",&b[i]); //存入物品名称
scanf("%f",&w[i]); }
n=n*w[1]; int j;
for(j=1;j<M-1;j++) {
if(b[j]==a[j+1])
n=n*w[j+1];
else {
break;
}
}
if(n<max)
{ printf("%.2f\n",n); //输出赚的钱数
printf("¥¥¥¥\n");
printf("赚大钱啦!\n");
}
else {
printf("超出最大范围.\n");
}
}
return 0; }