算法题解:cf1704d ——前缀和、思维

cf1704D Magical Array

题意

懒得截了随手从网上找一个(
image
简单地说,就是有很多个一样的数列,其中一个是特殊的。现在对每个都选若干个数对(i,j),如果是特殊的就有
a[i]-1,a[j]-1,a[i-1]+1,a[j+2]+1,如果不是特殊的则会 a[i]-1,a[j]-1,a[i-1]+1,a[j+1]+1。现在给你操作完的这些数列,要求找到特殊的数列是哪一个,以及它执行了多少次操作

思路

注意到特殊的和不特殊的在操作上就是右端的+1位置不同,因此很容易(??)发现:
1.数列的元素和不变
2.端点处的+1,-1容易联想到差分或者前缀和
3.对于不特殊的数列,每次操作后缀和的和是不变的,即i=1naii不变,而特殊的数列的后缀和之和则显然会变大1
4.因此只需找到最大的后缀和的和对应的数列编号,并且计算其与非特殊数列的该值之差即可

代码

signed main(){
   ios::sync_with_stdio(false),cin.tie(NULL);
   //freopen("data.in","r",stdin);
   //freopen("T1.out","w",stdout); 
   cin>>t;
   while(t--){
   	 cin>>n>>m;
   int minn=0x3f3f3f3f,maxx=0;
   int idd=1;
   for(int i=1;i<=n;i++)
   {
       int summ=0;
       for(int j=1;j<=m;j++)
       {
           int x;
   		cin>>x;
           summ+=x*j;
       }
       if(i==1){
       	maxx=minn=summ;
   	}
   	else
   	{
   	   minn=min(summ,minn);
           maxx=max(summ,maxx);
   	}
       if(summ>minn){
       	idd=i;
   	}
   	} 
   cout<<idd<<" "<<maxx-minn<<endl;
   }
   return 0;	
} 

posted @   wxk123  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示