前言:西工大noj刷题记录
代码在CodeBlocks16.01环境下编译通过
25题-羊羊的聚会
/*
*题目:见上图
*/
#include <iostream>
using namespace std;
int noj_025()
{
int myyPosi, fyyPosi, myySpeed, fyySpeed, len, hour = 1;
cout << "请依次输入美羊羊坐标,沸羊羊坐标,美羊羊速度,沸羊羊速度,纬度线总长:";
cin >> myyPosi >> fyyPosi >> myySpeed >> fyySpeed >> len;
if (myySpeed == fyySpeed)
{
cout << "impossible";
return 0;
}
while ((myyPosi + myySpeed) % len != (fyyPosi + fyySpeed) % len)
{
myyPosi = (myyPosi + myySpeed) % len;
fyyPosi = (fyyPosi + fyySpeed) % len;
hour++;
}
cout << hour << endl;
return 0;
}
26题-最大乘积子序列(动态规划,暴力法不可取)
/*
*题目:输入n个元素组成的序列,找出一个乘积最大的连续子序列,如果这个最大的乘积不是正数,输出-1表示无解,1<=n<=18,-10<=Si<=10
* 第一行输入n,整数。第二行输入n给元素的序列S,均为整型。
*备注:本题用动态规划解法
*/
#include <iostream>
using namespace std;
int maxNum(int a, int b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
int minNum(int a, int b)
{
if (a < b)
{
return a;
}
else
{
return b;
}
}
int noj_026()
{
int num;
int *itemArray = new int[num];
int minPrdct, maxPrdct, result;
cout << "请输入序列的元素个数:";
cin >> num;
cout << "请输入序列的元素:";
for (int i = 0; i < num; ++i)
{
cin >> itemArray[i];
}
minPrdct = itemArray[0]; //当前遍历到的序列中最小乘积(负数)
maxPrdct = itemArray[0]; //当前遍历到的序列中最大乘积(正数)
result = itemArray[0];
for (int i = 1; i < num; ++i)
{
int maxTemp = maxPrdct;
int minTemp = minPrdct;
/*
*当前遍历到的最大乘积为当前的数,前一次遍历的最大乘积乘以当前数(正数)和前一次遍历的最小乘积乘以当前数(负数)这三个数其中之一
*当前遍历到的最小乘积同理
*/
maxPrdct = maxNum(itemArray[i], maxNum(itemArray[i] * minTemp, itemArray[i] * maxTemp));
minPrdct = minNum(itemArray[i], minNum(itemArray[i] * minTemp, itemArray[i] * maxTemp));
result = maxNum(maxPrdct, result);
}
if (result <= 0)
{
cout << "-1";
}
else
{
cout << result;
}
delete[] itemArray;
return 0;
}