您的位置:首页 > 其它

CodeForces Round #283 Div.2

2014-12-18 04:48 141 查看
A. Minimum Difficulty

题意:

有一个递增序列a,现在要去掉除了第一项和最后一项元素外的某一项,使新数列中相邻元素之差的最大值最小。

分析:

先求出原序列a中,相邻两项元素之差的最大值m。

枚举去掉ai,则新序列相邻元素差的最大值为max{ m, ai+1 - ai },然后记录最小值即可。

#include <cstdio>

const int maxn = 100 + 10;
bool bad[maxn], equ[maxn];//equ标记当前字符串中相邻两行是否相等
//bad标记该列是否被去掉,作为答案的统计

char table[maxn][maxn];

int main()
{
//freopen("in.txt", "r", stdin);

int n, m;
scanf("%d%d", &n, &m);
for(int i = 0; i < n; ++i) scanf("%s", table[i]);

if(n <= 1)
{
puts("0");
return 0;
}

int st = 0;//找到字符串的开头
for(; st < m; ++st)
{
int i;
for(i = 0; i < n-1; ++i)
if(table[i][st] > table[i+1][st])
break;
if(i == n-1) break;
}
if(st == m)
{
printf("%d\n", m);
return 0;
}

int ans = st;
for(int i = 0; i < n-1; ++i)
{
if(table[i][st] == table[i+1][st])
equ[i] = true;
}
for(int i = st+1; i < m; ++i)
{
for(int j = 0; j < n-1; ++j)
{
if(equ[j] && table[j][i] > table[j+1][i])//只有原来字符串相等且后面接的字符不满足顺才去掉该列
bad[i] = true;
}
if(bad[i])
ans++;//统计被去掉的行数
else
{
for(int j = 0; j < n-1; ++j)
{
if(equ[j] && table[j][i] < table[j+1][i])//更新equ
equ[j] = false;
}
}
}

printf("%d\n", ans);

return 0;
}


代码君
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: