首页 > 其他分享 >Codeforces Round 909 (Div. 3) A-E

Codeforces Round 909 (Div. 3) A-E

时间:2023-11-18 13:22:05浏览次数:43  
标签:const int ll 909 Codeforces long solve Div dp

Codeforces Round 909 (Div. 3)

A. Game with Integers

题意:

两人轮流操作,可以加一或减一,若结果能被3整除则输出First,否则输出Second

思路:

若n不能被3整除,则第一个人可以直接通过加一或减一使结果被3整除,反之则一定不能

代码:

#include <bits/stdc++.h>
using namespace std ;
const int MAXN=1e5+7;
const int INF = 0x3f3f3f3f;
typedef long long ll;
#define endl "\n"

void solve(){
	int n;
    cin>>n;
    if(n%3!=0){
        cout<<"First"<<endl;
    }else{
        cout<<"Second"<<endl;
    }
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0); 
	cout.tie(0);

	int t=1;
	
	cin>>t;
	while(t--){
		solve();
	}
	
	return 0;
}

B. 250 Thousand Tons of TNT

题意:

将n个盒子按顺序分成若干组,每组都正好k个盒子,求每组的总质量的最大值和最小值的差值

思路:

先求盒子质量的前缀和,再枚举k的值

代码:

#include <bits/stdc++.h>
using namespace std ;
const int MAXN=1e5+7;
const long long INF = 0x3f3f3f3f3f3f3f3f;
typedef long long ll;
#define endl "\n"

void solve(){
	int n;
    cin>>n;
    ll a[n+1];
    ll presum[n+1];
    presum[0]=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        presum[i]=presum[i-1]+a[i];
    }
    ll ans=0;
    for(int i=1;i<n;i++){
        if(n%i!=0){
            continue;
        }
        ll maxn=0;
        ll minx=INF;
        ll num;
        for(int j=1+i-1;j<=n;j+=i){
            num=presum[j]-presum[j-i];
            maxn=max(maxn,num);
            minx=min(minx,num);
        }
        ans=max(ans,maxn-minx);
    }
    cout<<ans<<endl;
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0); 
	cout.tie(0);

	int t=1;
	
	cin>>t;
	while(t--){
		solve();
	}
	
	return 0;
}

C. Yarik and Array

题意:

给定一个长度为n的数组,求最大相邻子序列和,要求相邻子序列中的相邻元素奇偶性不同

思路:

动态规划,dp[i]表示以第i个元素为结尾的子序列的和的最大值,转移方程为:若第i个元素和前一个数奇偶性一致,则dp[i]=a[i];若不一致,则dp[i]=max(a[i],dp[i-1]+a[i])。输出最大的dp[i]

代码:

#include <bits/stdc++.h>
using namespace std ;
const int MAXN=1e5+7;
const int INF = 0x3f3f3f3f;
typedef long long ll;
#define endl "\n"

void solve(){
	int n;
    cin>>n;
    ll a[n+1];
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    ll dp[n+1];
    memset(dp,0,sizeof(dp));
    ll ans=0;
    dp[1]=a[1];
    ans=dp[1];
    for(int i=2;i<=n;i++){
        if((abs(a[i])%2)+(abs(a[i-1])%2)==1){
            dp[i]=max(a[i],dp[i-1]+a[i]);
            ans=max(ans,dp[i]);
        }else{
            dp[i]=a[i];
            ans=max(ans,dp[i]);
        }
    }
    cout<<ans<<endl;
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0); 
	cout.tie(0);

	int t=1;
	
	cin>>t;
	while(t--){
		solve();
	}
	
	return 0;
}

D. Yarik and Musical Notes

题意:

给定一个长度为n的数组a,b[i]为2a[i] ,若b[i]b[j]=b[j]b[i],则为一对组合,求这样的组合有多少对

思路:

b[i]b[j]=b[j]b[i]化简后可以得到2a[j]/a[j]=2a[i]/a[i],若a[i]为2的倍数,则可以与2a[i]进行通分化简,化简后为2x/y,x和y的值是确定的,若(x,y)相同,则肯定是一对组合,反之则肯定不是,所以只需要对数组a进行遍历,看a[i]前面有几个元素和a[i]的(x,y)相同即可

代码:

#include <bits/stdc++.h>
using namespace std ;
const int MAXN=1e5+7;
const int INF = 0x3f3f3f3f;
typedef long long ll;
#define endl "\n"

struct node {
    int x,y;
    bool operator<(const node& other) const {
        return std::tie(x, y) < std::tie(other.x, other.y);
    }
};

long long ksm(long long a, long long b)
{ 
    long long res = 1; 
    while(b) 
    { 
        if(b & 1)  
            res = res * a ; 
            a = a * a ; 
            b >>= 1; 
    } 
    return res; 
}

int check(int t){
    int count=0;
    while(t>0){
        if(t%2!=0){
            return count;
        }
        t/=2;
        count++;
    }
    return count;
}

void solve(){
	int n;
    cin>>n;
    ll a[n+1];
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    map<node ,int > mp;
    ll ans=0;
    for(int i=1;i<=n;i++){
        int num=check(a[i]);
        if(num!=0){
            node st;
            st.x=a[i]-num;
            st.y=a[i]/ksm(2,num);
            if(mp[st]>0){
                ans+=mp[st];
            }
            mp[st]++;
        }else{
            node st;
            st.x=a[i];
            st.y=a[i];
            if(mp[st]>0){
                ans+=mp[st];
            }
            mp[st]++;
        }
    }
    cout<<ans<<endl;
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0); 
	cout.tie(0);

	int t=1;
	
	cin>>t;
	while(t--){
		solve();
	}
	
	return 0;
}

E. Queue Sort

题意:

要对一个数组进行排序,你可以进行以下操作:将第一个元素放在数组最后,将这个元素与前面的元素进行比较并交换,直到这个元素严格大于前面的元素。若不能完成排序则输出-1,否则输出操作次数

思路:

若操作的元素为最小的元素,则在操作后它会回到第一位,形成死循环,所以最小的元素后面的元素必须是已经排好序的,否则输出-1,最小元素前面有几个数则需要操作几次

代码:

#include <bits/stdc++.h>
using namespace std ;
const int MAXN=1e5+7;
const long long INF = 0x3f3f3f3f3f3f3f3f;
typedef long long ll;
#define endl "\n"

void solve(){
	int n;
    cin>>n;
    ll a[n+1];
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    a[0]=0;
    ll low=INF;
    int lownum=0;
    int flag=1;
    for(int i=1;i<=n;i++){
        if(a[i]<low){
            low=a[i];
            lownum=i;
            flag=1;
            continue;
        }
        if(a[i]<a[i-1]){
            flag=0;
        }
    }
    if(flag==0){
        cout<<-1<<endl;
    }else{
        cout<<lownum-1<<endl;
    }
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0); 
	cout.tie(0);

	int t=1;
	
	cin>>t;
	while(t--){
		solve();
	}
	
	return 0;
}

F. Alex's whims

思路:

一开始构造一条链,每次操作根据需要将这条链转化为对应的Y字形。
暂时没想出来如何实现………

标签:const,int,ll,909,Codeforces,long,solve,Div,dp
From: https://www.cnblogs.com/beater/p/17840373.html

相关文章

  • cf1864C. Divisor Chain
    https://codeforces.com/contest/1864/problem/C思维越来越僵化了假如\(n=2^k\),直接每次/2就行。否则,我们可以考虑如何转化成上面的情况令\(n=2^kx\),那么我们显然可以转移到\(n=2^k(x-1)\),因为x是奇数,所以2的次幂会加一,最后变成\(2^k\)次方的时候,每个数最多出现两次,正好符合......
  • 一个可以拖拽缩放的div?
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"/><metahttp-equiv="X-UA-Compatible"content="IE=edge"/><metaname="viewport"content="width=de......
  • C++ signal(SIGFPE,handler) ignore division by 0 exception
    #include<stdexcept>#include<chrono>#include<csetjmp>#include<ctime>#include<fstream>#include<iostream>#include<iomanip>#include<signal.h>#include<sstream>#include<thread>#incl......
  • 【LGR-166-Div.4】洛谷入门赛17
    【LGR-166-Div.4】洛谷入门赛#17比赛地址这次是div4的难度,整体不算是很难,很适合小白玩家[10月入门赛-A]食堂题目描述为了给师生提供良好的用餐体验,洛谷小学的食堂坚持现炒、现做每一道菜肴。洛谷小学一共有\(a\)名老师和\(b\)名学生。食堂的营养师为每位师生的用餐进......
  • CodeForces 1895E Infinite Card Game
    洛谷传送门CF传送门容易转化成经典的有向图博弈模型。每张牌建一个点,若\(x\)能打败\(y\)就连一条\(x\toy\)的边。入度为\(0\)的点为必败态,之后类似拓扑排序倒推即可。具体就是若存在边\(u\tov\),若\(u\)为必败态则\(v\)为必胜态并加入队列;若\(v\)的所有前驱......
  • CF906 div2
    CF906div2A.Doremy'sPaint3题意给出一个序列,可以随意打乱顺序,问最后能否使得所有相邻两个元素的和相等。数据范围多组数据,\(2<=n<=100,1<=a_i<=10^5\)样例输入52893112411455233334100000100000100000100000样例输出YesYesNoNo......
  • Codeforces Round 907 (Div. 2)
    \(A.SortingwithTwos\)https://codeforces.com/contest/1891/submission/232689614\(B.DejaVu\)https://codeforces.com/contest/1891/submission/232690141\(C.SmiloandMonsters\)https://codeforces.com/contest/1891/submission/232691988\(D.Suspic......
  • Codeforces Round 809 (Div. 2) D1. Chopping Carrots (Easy Version) 题解
    题意CodeforcesRound809(Div.2)D1.ChoppingCarrots(EasyVersion)给两个整数\(n,k\),一个数组\(a\),要求构造一个同样长度的数组\(p\),使得\(\max\limits_{1\lei\len}\left(\left\lfloor\frac{a_i}{p_i}\right\rfloor\right)-\min\limits_{1\lei\l......
  • Codeforces Round 906 (Div. 2)
    A.简单题B.简单题C.比赛时没做出来,赶着回宿舍,过了几天来补发现很简单秒掉D.Doremy'sConnectingPlan给定n个结点的图,每个点有一个权值a[i],开始时图上没有边,如果与点i相邻的点(包括点i)的权值的和记为Sum_i.给定一个常数c,如果Sum_i+Sum_j>=ijc,则可以在i和j上......
  • 如何隐藏HTML中的div元素
    参考文章,通过一个例子来学习如何在html中隐藏div元素。考虑一下,我们有一个如下的html元素。<divclass="box">Thisismainheading</div>现在,我们需要从网页中隐藏上述div元素。使用display:none要在html中隐藏一个div元素,我们可以使用css的display:none属性。下面是......