D. Vasya and Arrays

链接

[http://codeforces.com/contest/1036/problem/D]

题意

给你两个数组长度分别为n,m;

有这么一种操作,用某个数组的某个子区间元素之和代替这个子区间,这样使得数组长度减少,两个数组都可以进行

问你最后两个数组一摸一样的时候,最大数组长度是多少?如果无法使两个数组一摸一样输出-1

分析

先判断开始数组总和是否相等,不相等是不可能最后两个数组一摸一样的#include<bits/stdc++.h>

using namespace std;

define ll long long

const ll N=3e5+10;

ll a[N],b[N];

ll n,m;

int main(){

ios::sync_with_stdio(false);

cin.tie(0);

cout.tie(0);

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

cin>>n;

ll sum1=0,sum2=0;

for(int i=0;i<n;i++)

{

cin>>a[i];

sum1+=a[i];

}

cin>>m;

for(int i=0;i<m;i++)

{

cin>>b[i];

sum2+=b[i];

}

if(sum1!=sum2){

cout<<-1<<endl;

return 0;

}

int cnt=0;

if(a[0]==b[0])

{

int i=1,j=1;

sum1=a[1],sum2=b[1];

while(i<n&&j<m){

if(sum1<sum2){

sum1+=a[i+1];

cnt++;

i++;

}

else if(sum1>sum2){

sum2+=b[j+1];

j++;

}

else {

sum1=a[i+1],sum2=b[j+1];

i++,j++;

}

}

}

else if(a[n-1]==b[m-1]){

int i=n-1,j=m-1;

sum1=a[n-1],sum2=b[m-1];

while(i>-1&&j>-1){

if(sum1<sum2){

sum1+=a[i-1];

cnt++;

i--;

}

else if(sum2<sum1){

sum2+=b[j-1];

j--;

}

else {

sum1=a[i-1],sum2=b[j-1];

i--,j--;

}

}

}

else{

int i=0,j=0;

sum1=a[0],sum2=b[0];

while(i<n&&j<m){

if(sum1<sum2){

sum1+=a[i+1];

cnt++;

i++;

}

else if(sum1>sum2)

{

sum2+=b[j+1];

j++;

}

else {

sum1=a[i+1],sum2=b[j+1];

i++,j++;

}

}

}

//cout<<cnt<<endl;

cout<<n-cnt<<endl;

return 0;

}

从头和尾两个位置判断是否相等,相等继续如果不相等统计两个数组区间的长度,在比较大小,进行到最后

具体看代码

代码

原文地址:https://www.cnblogs.com/mch5201314/p/9879693.html

时间: 2024-11-13 04:20:12

D. Vasya and Arrays的相关文章

Codeforces Edu Round 50 A-D

A. Function Height 由于只能提升\(x\)为奇数的点,每个三角形的底一定为\(2\), 则要求我们求: \(2 * (h_1 + h_2 + - + h_n) / 2 = k\),使\(max(h_1, h_2-h_n)\)最小. 则应使每个\(h\)平摊重量,答案即为\(\lceil n/k \rceil\). #include <cstdio> #include <iostream> #include <cmath> typedef long lo

Codeforces 354C Vasya and Beautiful Arrays[dp+暴力]

题意: 给出n个整数,对每个整数可以减去0-k的任意一个数 求这样操作后,n个数的最大GCD是多少 分析: 我们首先可以知道n个整数中最小的数是多少 而且,最终的答案肯定不大于这个数 这个n个整数中最小的数是答案的上限 然后对于答案的下限 可以肯定的是 1肯定是答案的下限 2呢?3呢?为什么1一定是 其实,0-k+1,都可以作为答案 为什么? 可以把k想象成一个剪刀 对k+1来说,任何数都可以剪掉0-k变成k+1的倍数(任何数模k+1的结果都是0-k) 所以0-k也可以,综上0-k+1都可以,所

Codeforces 132C. Vasya and Beautiful Arrays【DP,dfs】

题目大意: 在一根数轴上有一只机器龟,它能够听从人们给它的指令做出向前走一步(F)和向后转(T)的操作.给出初始操作,你最开始有修改n步指令的权利(每一个指令可以被修改很多次),问在你修改n次之后,海龟离原点的最大距离. 做法: 很直观的想法,尽可能的将T转化为F,也算是一种贪心的做法吧. 我们用dfs(i,j,t,cur),其中i表示当前遍历的命令的序号,j表示从0~i过程中我转换了多少个T,t表示从0~i的序号中总共出现了多少次T,cur表示当前相对于原点的距离(有正有负),dp[i][dr

CF354C Vasya and Beautiful Arrays

这题感觉可海星a....网上题解包括官方题解的时间复杂度都玄学得一匹,数据比较弱吧....不卡..... 发现一位大佬做法值得学习. 首先要找序列所有数的最大公因数,肯定上界是最小的那个数吧.然后我们排序遍历每一个数,若发现不满足的数,即a[i]%ans>k(不能在k的范围内调整): 那么ans=a[i]/(a[i]/ans+1);这样能最小范围地调整并且省去一些多余的判断,比如ans=8,a[i]=11;ans=11/2=5,可以直接省去中间判断6,7的过程. 此时跳出再判断,当一遍下来不需要

[LeetCode] 349 Intersection of Two Arrays &amp; 350 Intersection of Two Arrays II

这两道题都是求两个数组之间的重复元素,因此把它们放在一起. 原题地址: 349 Intersection of Two Arrays :https://leetcode.com/problems/intersection-of-two-arrays/description/ 350 Intersection of Two Arrays II:https://leetcode.com/problems/intersection-of-two-arrays-ii/description/ 题目&解法

Arrays工具类

Arraysd的静态方法能够方便的对数组进行操作,每个方法也加了注释 : 程序: import java.util.*;public class Array{        public static void main(String[] args){                int[]  arr={1,3,4,2};                System.out.println("排序前:");                printArray(arr);//打印原数组

350.求两个数组的交集 Intersection of Two Arrays II

Given two arrays, write a function to compute their intersection. Example:Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2, 2]. Note: Each element in the result should appear as many times as it shows in both arrays. The result can be in any ord

ArrayList&amp;LinkedList&amp;Map&amp;Arrays

Java集合框架 1:集合接口 1.1:Collection接口 Collection接口是构造集合框架的基础.它声明所有类集合都将拥有的核心方法 Boolean add(Object obj) 将obj加入到调用类集合中,加入返回true 否则 返回 false Boolean addAll(Collection c) 将c中所有元素都加入到类集合中,都加入返回true否则 false Void clean() 从调用类集合中删除所有元素 Boolean contains(Object obj

LeetCode OJ 4. Median of Two Sorted Arrays

There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). Example 1: nums1 = [1, 3] nums2 = [2] The median is 2.0 Example 2: nums1 = [1,