题目链接:http://codeforces.com/problemset/problem/402/B

题目意思:给出n个数和公差k,问如何调整使得ai + 1 - ai = k。(1 ≤ i < n),即等差数列,求出最少的调整次数。(调整的操作包括向一个数添加或者减少某个数,使得后一个数-前一个数 = 公差)。

方法一:

对于每一个数ai,求出以ai为基准,在ai之前和在ai之后不满足等差数列的个数。直到扫描整个序列结束,选出个数最少的,,即调整的次数最少,然后再一次扫描整个序列,算出每一个数需要调整的大小即可。要注意的是,每一个需要调整的数调整之后都需要满足>= 1!!

 #include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std; const int maxn = + ;
int a[maxn], rea[maxn][]; // a:原始输入序列 rea:保存需要调整的数的调整大小
char ch[maxn]; int main()
{
int d, n, i, j;
while (scanf("%d%d", &n, &d) != EOF)
{
for (i = ; i <= n; i++)
scanf("%d", &a[i]);
int ans = maxn, cnt = ;
int flag, rec = ;
for (i = ; i <= n; i++)
{
flag = ;
for (j = i-; j >= ; j--) // 扫描以ai为基准的前面的数
{
if (a[i] - (i-j)*d != a[j])
{
if (a[i] - (i-j)*d >= )
cnt++;
else // 调整后的数不满足 >= 1
{
flag = ;
break;
}
}
}
for (j = i+; j <= n && !flag; j++) // 扫描以ai为基准的后面的数
{
if (a[i] + (j-i)*d != a[j])
{
if (a[i] + (j-i)*d >= )
cnt++;
else
{
flag = ;
break;
}
}
}
if (cnt < ans && !flag) // ans保存最少的调整次数
{
ans = cnt;
rec = i; // 记录当前得出最少调整数量的以第i个数为基准的下标
}
cnt = ;
}
int l = ;
cnt = ;
for (j = rec-; j >= ; j--) // 前面开始调整
{
if (a[rec] - (rec-j)*d != a[j])
{
cnt++;
if (a[rec] - (rec-j)*d > a[j])
{
ch[l] = '+';
rea[l][] = j;
rea[l][] = a[rec] - (rec-j)*d - a[j];
}
else
{
ch[l] = '-';
rea[l][] = j;
rea[l][] = a[j] - (a[rec] - (rec-j)*d);
}
l++;
}
}
for (j = rec+; j <= n; j++) // 后面开始调整
{
if (a[rec] + (j-rec)*d != a[j])
{
cnt++;
if (a[rec] + (j-rec)*d > a[j])
{
ch[l] = '+';
rea[l][] = j;
rea[l][] = a[rec] + (j-rec)*d - a[j];
}
else
{
ch[l] = '-';
rea[l][] = j;
rea[l][] = a[j] - (a[rec] + (j-rec)*d);
}
l++;
}
}
printf("%d\n", l);
for (i = ; i < l; i++)
printf("%c %d %d\n", ch[i], rea[i][], rea[i][]);
}
}

方法二:

考虑到原始序列中每个数的范围是[1, 1000]。因此可以对a[1] 从 [1, 1000] 里依次取数,再根据公差算出对应的a[2]~a[n]的值,与输入序列的a[2] ~ a[n] 比较,累加不同的数cnt。直到a[1] 完全取尽[1, 1000]范围内的数。当然a[1]每取一个数,都有对应的cnt,求出最少的cnt还有对应的a[1]的值。最后根据最少cnt和a[1],对初始序列不符合项进行更改。

 #include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std; const int maxn = + ;
int a[maxn]; int main()
{
int n, k, i, j;
while (scanf("%d%d", &n, &k) != EOF)
{
for (i = ; i <= n; i++)
scanf("%d", &a[i]);
int p, tmp, cnt, mini;
mini = maxn;
for (i = ; i <= ; i++)
{
tmp = i, cnt = ;
for (j = ; j <= n; j++)
{
if (a[j] != tmp)
cnt++;
tmp += k;
}
if (cnt <= mini)
{
mini = cnt;
p = i;
}
}
printf("%d\n", mini);
for (i = ; i <= n; i++)
{
if (p != a[i])
{
if (p > a[i])
printf("+ %d %d\n", i, p-a[i]);
else
printf("- %d %d\n", i, a[i]-p);
}
p += k;
}
}
return ;
}

最新文章

  1. supervisor监管进程max file descriptor配置不生效的问题
  2. OUTLOOK 发生错误0x8004010D
  3. log4net.config 单独文件
  4. python基础语法(4)
  5. 比较任意两个JSON串是否相等(比较对象是否相等)JAVA版
  6. ubuntu下卸载vmware
  7. 故事板(Storyboard) 、 iPad编程 、 App和VC的生命周期
  8. 缓存应用--Memcached分布式缓存简介
  9. 开源的c语言人工神经网络计算库 FANN
  10. error C2471: 无法更新程序数据库 vc90.pdb
  11. HDU 5818 Joint Stacks
  12. 线程通信机制:共享内存 VS 消息传递
  13. 汉字转拼音的vc++程序源代码
  14. Python 操作Redis
  15. Microservice架构模
  16. Apriori算法-java
  17. 序列化和Json
  18. 分享几个常见的CMD命令,可能会用的上
  19. LCA(ST倍增)
  20. binlog2sql实现MySQL误操作的恢复

热门文章

  1. HDU5618 Jam&#39;s problem again
  2. pt-pmp :pt toolkit
  3. Oracle SOA Suite OverView
  4. 阿里云云服务器ubuntu配置nginx+uwsgi+django记录文档
  5. Pixhawk之姿态解算篇(1)_入门篇(DCM Nomalize)
  6. linux mysql-server can&#39;t find mysql_config
  7. mySql 主从复制linux配置
  8. css控制打印时只显示指定区域
  9. php跳转
  10. 顺序容器vector,deque,list的选用规则