社区讨论
《关于出题人写出了一个出题人没法证明正确与否的解法这件事》
灌水区参与者 6已保存回复 15
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 15 条
- 当前快照
- 1 份
- 快照标识符
- @lobdlxf1
- 此快照首次捕获于
- 2023/10/29 19:16 2 年前
- 此快照最后确认于
- 2023/11/04 00:57 2 年前
RT,lz写出了一个没法证明正确性的贪心
题目在这里
lz想的贪心策略是,每一个数只由后一个数的+1来使得-1最终达到目标状态,实现时分两种情况,一个是直接用,另一个是先改第一个数到目标状态,再从第三个数开始应用。总之就是从前往后,每一个改过的数不再动了
能过数据(数据和数据范围都是拿脚做的),但是不知道到底对不对,求助万能的谷民们,谢谢
代码如下
CPP#include <bits/stdc++.h>
using namespace std;
#define N 10
int n,a[N],b[N],ans1,ta[N],ans2;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
for(int i=1;i<=n;i++)ta[i]=a[i];
for(int i=2;i<=n;i++)
{
int dx=(a[i-1]-b[i-1]+10)%10;
a[i]=(a[i]+dx)%10;
a[i+1]=(a[i+1]-dx+10)%10;
ans1+=dx;
}
if(a[n]!=b[n])ans1=114514;
for(int i=1;i<=n;i++)a[i]=ta[i];
ans2=(a[1]-b[1]+10)%10;
a[1]=b[1];
a[2]=(a[2]-rx+10)%10;
for(int i=3;i<=n;i++)
{
int dx=(a[i-1]-b[i-1]+10)%10;
a[i]=(a[i]+dx)%10;
a[i+1]=(a[i+1]-dx+10)%10;
ans2+=dx;
}
if(a[n]!=b[n])ans2=114514;
int ans=min(ans1,ans2);
if(ans==114514)cout<<-1;
else cout<<ans;
return 0;
}
回复
共 15 条回复,欢迎继续交流。
正在加载回复...