首页 > 其他分享 >Codeforces Round 909 (Div

Codeforces Round 909 (Div

时间:2024-02-27 16:35:13浏览次数:21  
标签:arr int sum 909 Codeforces long cin minsum Div

Codeforces Round 909 (Div. 3)

A. Game with Integers

显然就是还要不是三的倍数就能赢!

int n;
	cin>>n;
	int k;
	while(n--)
	{
		cin>>k;
		if(k%3==0){
			cout<<"Second"<<endl;
		}else{
			cout<<"First"<<endl;
		}
	}

B.250 Thousand Tons of TNT

最开始直接写暴力但时间太长,没想到前缀和 区间和相关算法,所以改后:

long long t;
  cin >> t;  
  while (t--) {
    long long n;
    cin >> n;    
    long long arr[n];
    for (long long i = 0; i < n; i++) {
      cin >> arr[i];
    }    
    long long maxout = -99999999;    
    for (long long i = 1; i <= n; i++) {
      if (n % i == 0) {
        long long maxsum = -1e16;
        long long minsum = 1e16;         
        long long sum[n + 1] = {0};
        for (long long j = 0; j < n; j++) {
          sum[j+1] = sum[j] + arr[j];
        }
        for (long long j = 0; j < n; j += i) {
          long long out = sum[j+i] - sum[j];
          maxsum = max(maxsum, out);
          minsum = min(minsum, out);
        }       
        maxout = max(maxout, maxsum - minsum);
      }
   }    
    cout << maxout << endl;
  }  

*核心思路:*

*sum为前缀和,i为选定的因子,利用j+=i来选定区间,然后通过前缀和区间和来求得区间和out即重量和,依次选取最大和最小,在所有区间选完之后再用maxout记录更新最大差。*

补题时我曾将maxsum和minsum定义为99999999....然后样例一中的:

4

1000000000 1000000000 1000000000 1000000000

此组数据一直过不了,最后才发现9开少了,刚好少一个1。。。。。。。。

C. *Yarik and Array*

*本来思路是一直加直到abs(arr[i]%2)==abs(arr[i+1]%2),但是过一遍样例发现3过不了才发现要是arr[ ]前几个元素较小(负数)且交替奇偶呢?那么就要用sum减小的元素之和(所以也相当于两个子序列的题)。*

int t,n;
    cin>>t;
    while(t--)
    {
    	cin>>n;
    	int arr[n];
    	for(int i=0;i<n;i++)
    	{
    		cin>>arr[i];
		}
		int out=arr[0];
		int sum=arr[0],minsum=min(0,arr[0]);
		for(int i=1;i<n;i++)
		{
			if(abs(arr[i]%2)==abs(arr[i-1]%2))//更新子数组 
			{
				minsum=0;
				sum=0;
			}
			sum+=arr[i];
			out=max(out,sum-minsum);
			minsum=min(minsum,sum);
		}
		cout<<out<<endl;
	}

用sum来累加子序列总和,minsum来累加子序列中的最小和,if(abs(arr[i]%2)==abs(arr[i-1]%2)){minsum=0;sum=0;}更新子序列并更新sum和最小和。最终结果就是更新后的sum-minsum,minsum=min(minsum,sum);这个以sum为一个值来进行比较更新。

D. Yarik and Musical Notes

两个数组ai,bi,bibj=bjbi。取以二为底对数可以发现其实就是ai/bi=aj/bj,最开始开指数发现数据太大,longlong也不够,所以想了再取一次对数即brr[i]=(double)log(arr[i])/log(2);

abs(brr[i]-arr[i]-brr[j]+arr[j])<1e-1这样来过,测试发现最后一个测试点过不了。。。。。729D1E54E53B87B8E2B329F23D64CE65数据太多了tle,所以回到最初取对数的时候,将其取ln即lni/i=lnj/j,整数来说:也就2,4会相等。。。。。。。。。。。。。。。。。。。。55E332135E298AB11B47A4ACBE2CC2A3

所以原式相当于(1,2)可以成立,只需遍历得到其出现次数和一个相同的数出现的次数:

long long t;
	scanf("%lld",&t);
	long long n,count,num;
	while(t--)
	{
		cin>>n;
		long long arr[n];
		count=0,num=0;
		for(long long i=0;i<n;i++)
		{
			scanf("%lld",&arr[i]);
			if(arr[i]==1||arr[i]==2)
			{
				num++;
			}
		}
		sort(arr,arr+n);
		long long h=0;
		for(long long i=0;i<n-1;i++)
		{
			if(arr[i]==arr[i+1]&&arr[i]!=1&&arr[i]!=2)
			{
				h++;
			}
			if(arr[i]!=arr[i+1]||i+2==n)
			{
				count+=h*(h+1)/2;
			    h=0;
			}
		}
		printf("%lld\n",count+num*(num-1)/2);
	}

做题的时候我用的cin来读入,但是tle了换成scanf一下就过了。。。所以以后就用scanf了

E. Queue Sort

这个题做了好久都是模拟题目给的步骤,实在没法就自己带了几组数据然后发现似乎就是找规律。

先用min找到最小值及下标,然后查看其后面数组元素是否有序(其实能排好的话就是有序,然后输出最小值的下标)要是后面序列无序,那么不会交换后面的值,就是说无法排序。

void solve() {
    int n;
    cin >> n;  
    vector<int> a(n);
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }    
    int min= 0;
    for (int i = 0; i < n; i++) {
        if (a[i] < a[min]) {
            min = i;
        }
    }   
    for (int i = min + 1; i < n; i++) {
        if (a[i] < a[i - 1]) {
            cout << -1 << endl;
            return;
        }
    }    
    cout << min << endl;
}
int main() {
    int t;
    cin >> t;   
    while (t--) {
        solve();
    }  

标签:arr,int,sum,909,Codeforces,long,cin,minsum,Div
From: https://www.cnblogs.com/godcy/p/18037158

相关文章

  • Codeforces Round 905 (Div
    CodeforcesRound905(Div.3)A.Morning此题将其看为光标一直移动,其中移动次数就是坐标之差的绝对值,0看做10,由于其显示也需一次操作,所以加上四。#include<bits/stdc++.h>usingnamespacestd;intmain(){ intt; cin>>t; while(t--) { intarr[4],count=0; ......
  • Codeforces Round 900 (Div
    CodeforcesRound900(Div.3)A.HowMuchDoesDaytonaCost?这个题简单,在子段上最常见的元素其实只要这个元素出现就行intt; cin>>t; intn,k; while(t--) { cin>>n>>k; intarr[n]; intout=0; for(inti=0;i<n;i++) { cin>>arr[i]; } for(......
  • Codeforces Round 888 (Div
    CodeforcesRound888(Div.3)A.EscalatorConversations推导即可,判断条件就是abs(h[i]-H)%k==0&&abs(h[i]-H)/k<m&&h[i]!=H,先要整除再能相隔abs(h[i]-H)/k个台阶谁高谁矮任意不影响,但是最后这个我就没注意到h[i]!=H小卡一会。#include<bits/stdc++.h>usingnamespacestd;......
  • Codeforces 1906L Palindromic Parentheses
    考虑先判定有无解对应的\(k\)的范围。首先若\(k=n\)一定无解,因为字符串开头是\(\texttt{(}\)结尾是\(\texttt{)}\)匹配不上。下界因为各有\(\frac{n}{2}\)个\(\texttt{()}\),所以可以先猜测下界就为\(\frac{n}{2}\)。考虑构造到这个下界。能发现只需要形如\(\te......
  • 如何计算两个正太分布的KL散度 —— 正太分布的KL散度 (Kullback-Leibler divergence)
    参考:https://blog.csdn.net/int_main_Roland/article/details/124650909给出实现代码:defget_kl():mean0,log_std0,std0=policy_net(Variable(states))mean1=Variable(mean0.data)log_std1=Variable(log_std0.data)std1......
  • Educational Codeforces Round 162 (Rated for Div. 2)
    Preface开学了没时间组队训练就抽空把之前欠下的CF补一补这场当时玩《拔作岛》上头了忘记有比赛了,等想起来的时候已经快结束了就没现场打赛后补题发现A~E都很简单,F的话一个地方没太想清看了题解才会A.MovingChips签到,找一个极小的且包含了所有\(1\)的区间,这个区间中\(0\)......
  • Codeforces 1451F Nullify The Matrix
    因为保证了这个路径必须是向下和向右,就可以考虑每一条\(i+j=x\)的斜线上的点,因为一条路径经过的点对应的\(i+j\)一定是每次\(+1\)的。考虑到因为对于同一条直线,每个点是独立的,因为一条路径至多经过这条直线上的一个点。于是可以考虑用\(\text{Nim}\)的思想把这条......
  • CF1923 Educational Codeforces Round 162 (Rated for Div. 2)
    C.FindB给出一个数组A,对于q个询问,每个询问给出[l,r],对于A的子数组[l,r],问是否存在一个相同大小的数组B,使得两个数组的和相同,且任意相同下标的元素不同?Solution:A中任意一个大于1的元素,可以把他变成1,多余的那部分给到其他位置的元素上(如最后一个)对于等于1的元素,把......
  • CF1932 Codeforces Round 927 (Div. 3)
    E.FinalCountdown我愿称之为今年最傻逼的一次,思路很快想出来了,但是实现一直搞不对观察发现答案是n的所有前i位数相加(如12345,那么ans=12345+1234+123+12+1)要证明的话就是按照题目的Note那样算,(以12345为例,ans=(12345-1234-123-12-1)+21234+2123+212+21)然后傻逼的事情......
  • 2024 蓝桥杯模拟赛3(div1+div2)
    P8834[传智杯#3决赛]序列\(O(N^2)\)枚举defread():returnmap(int,input().split())n,k=read()a=list(read())res=0foriinrange(n):forjinrange(i):ifa[i]*a[j]<=k:res+=1print(res)P8780[蓝桥杯2022省......