这一题虽然是放在“贪心算法”专题里,但是其实只要深刻的理解题意,不用贪心算法更加容易。
思路:
由于房间是奇偶分开的,所以先把他们换成连续的自然数,即n=(n+1)/2.然后再统计经过某段走廊的次数就好了。。最多的次数在乘以10就是所求的时间了。
//模板开始
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <fstream>
#include <map>
#include <set>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include<iomanip>
#define SZ(x) (int(x.size()))
using namespace std;
int toInt(string s){
istringstream sin(s);
int t;
sin>>t;
return t;
}
template<class T> string toString(T x){
ostringstream sout;
sout<<x;
return sout.str();
}
typedef long long int64;
int64 toInt64(string s){
istringstream sin(s);
int64 t;
sin>>t;
return t;
}
template<class T> T gcd(T a, T b){
if(a<0)
return gcd(-a, b);
if(b<0)
return gcd(a, -b);
return (b == 0)? a : gcd(b, a % b);
}
//模板结束(通用部分)
//【练习12】 贪心算法 1003 Moving Tables
#define ARRAY_SIZE 205
int main()
{
int cases;
int n;
int start, end;
int temp;
int count[ARRAY_SIZE];
ifstream ifs("shuju.txt", ios::in);
//ifs>>cases;
cin>>cases;
for(int i = 0; i < cases; i++)
{
//ifs>>n;
cin>>n;
memset(count, 0, sizeof(count));
for(int j = 0; j < n; j++)
{
//ifs>>start>>end;
cin>>start>>end;
if(start > end)
{
temp = end;
end = start;
start = temp;
}
for(int k = (start + 1) / 2; k <= (end + 1) / 2; k++)
{
count[k]++;
}
}
for(int index = 0; index < ARRAY_SIZE - 1; index++)
{
if(count[index] > count[index + 1])
{
temp = count[index];
count[index] = count[index + 1];
count[index + 1] = temp;
}
}
cout<<count[ARRAY_SIZE - 1] * 10<<endl;
}
return 0;
}
本文探讨了一道看似适用于贪心算法的问题,但实际上通过深入理解题意,无需使用贪心策略即可简化求解过程。文章详细介绍了如何将问题转化为连续自然数形式,并计算经过特定走廊的最大次数,从而得出最终答案。
789

被折叠的 条评论
为什么被折叠?



