首页 > 其他分享 >SMU Summer 2024 Contest Round 1

SMU Summer 2024 Contest Round 1

时间:2024-07-08 23:52:59浏览次数:12  
标签:Summer ve pii int SMU long 2024 solve define

Sequence Decomposing
1.题意其实就是要我们找共有多少个最长的上升的子序列,也就是理解成可以找到几个尽量长的队伍(最少LIS不相交覆盖)
2.我们开一个multiset,然后先放进去第一个数,由于multiset会对元素自动从小到大排序,那么我们放进的队尾,也是排序好的,然后从第二个数开始遍历,检查一下当前multiset里是否有比这个数小的数,也就是是否有可以接的队伍,如果有我们就更新这个队伍的队尾为当前遍历到的这个数,如果没有呢,只能自己开一个新的队伍了,也就是直接插入这个值,最后multiset的size就是答案,就是有几个队伍

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
int dx[]={0,1,-1,0};
int dy[]={-1,0,0,1};

void solve()
{
    int n;
    cin>>n;
    vector<int>ve(n+1);
    multiset<int>se;//对插入的值自动从小到大排序,且可以重复
    for(int i=1;i<=n;i++) cin>>ve[i];
    se.insert(ve[1]);
    for(int i=2;i<=n;i++)
    {
        auto it=se.lower_bound(ve[i]);//看multiset里面有没有大于该数的,没有it就是ve.end();
        if(it==se.begin())//第一个数就大于ve【i】,也就是说ve【i】无法接到任何一个队伍的后面,只能自己插入当队头
        {
            se.insert(ve[i]);
        }else{//可以找到队伍,it为第一个大于等于该值的下标,则it--为第一个小于该数的下标,也就是可以这个数接的队伍
            it--;
            se.erase(it);//通过删除地址来删除这个值
            se.insert(ve[i]);//更新队伍的队尾
        }
    }
    cout<<se.size();
}


signed main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int t=1;
    //cin>>t;
    while(t--) solve();
    return 0;
}

Dice and Coin
1.拿样例模拟一下,k=3,则1,2,3各占1/3,1要4次变为16大于10,2要3次,3要2次,那么概率就是1/3*(0.54+0.53+0.52
2.n>k时也不要害怕,大于k的那些数,每个提供的概率就是1/n,枚举计算即可

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
int dx[]={0,1,-1,0};
int dy[]={-1,0,0,1};

void solve()
{
    int n,k;
    double sum=0;
    cin>>n>>k;
    for(int i=1;i<=n;i++)
    {
        int x=i;
        double w=1;
        while(x<k)
        {
            x*=2;
            w/=2;//相当于若干个1/2相乘
        }
        sum+=w/n;//每个数字的概率为1/n
    }
    printf("%.12lf",sum);
}


signed main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int t=1;
    //cin>>t;
    while(t--) solve();
    return 0;
}

Integer Cards
1.贪心的思想,但是注意代码的实现
2.我们用点的方式来存卡牌数和卡牌值,对数组进行从小到大的排序,对点进行第二个值从大到小的排序,在遍历的时候,用一个变量来实现点的下标移动,检查总和加了这个差值是否比原来的总和大,如果更大则说明使用了这个卡牌,对卡牌数减少1,当点的第一个值为0时,下标++

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
int dx[]={0,1,-1,0};
int dy[]={-1,0,0,1};
bool cmp(pii a,pii b)
{
    return a.y>b.y;
}
void solve()
{
    int n,m,sum=0;
    cin>>n>>m;
    vector<int>ve(n);
    for(int i=0;i<n;i++)
    {
        cin>>ve[i];
        sum+=ve[i];
    }
    pii p[100005];
    for(int i=0;i<m;i++)
    {
        cin>>p[i].x>>p[i].y;
    }
    sort(all(ve));
    sort(p,p+m,cmp);//记得是p+m,而不是p+n
    int k=0,sum1=sum;
    for(int i=0;i<n;i++)
    {
        if(p[k].x<=0)//点从大到小排序,当这个较大的值用完以后,下标++
        {
            k++;
        }
           sum+=p[k].y-ve[i];
            if(sum1<sum) {//如果加完差值后比原来的大说明合理可以转化
                sum1=sum;
                p[k].x--;//用一次记得减一次
            }
            else break;//因为点是从大到小排的,数组是从小到大排的,如果当前的点无法满足,后续的点当然也无法满足
        
    }
    cout<<sum1;    
}


signed main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int t=1;
    //cin>>t;
    while(t--) solve();
    return 0;
}

equeue
1.先进行区间的枚举,就是两层循环,比如1 2 3 4 5,定住1,然后右区间起点为2 3 4 5,然后左区间变为1 2,右区间起点为3 4 5以此类推下去
2.当左右区间的长度和大于k时,就要cotinue,因为操作次数无法满足
3.枚举后的区间合法以后,我们把区间的放放到一个新的数组里面,先计算这些数当前的总和,然后对数组进行排序,如果有负数,我们就贪心的减掉这个负数,当然对应消耗一次操作数。然后找最大值即可

点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
typedef pair<int,int> pii;
#define x first
#define y second
#define all(v) v.begin(),v.end()
int dx[]={0,1,-1,0};
int dy[]={-1,0,0,1};

void solve()
{
    int n,k,sum=0;
    cin>>n>>k;
    vector<int>ve(n+1);
    for(int i=0;i<n;i++) cin>>ve[i];
    
    for(int l=0;l<n;l++)
    {
        for(int r=l+1;r<=n;r++)
        {
            int x=n-r+l+1;//总共有几个数,左右区间长度的和
           
            int cnt=k-x;
            if(x>k) continue;//区间长度大于操作次数 不符合题意
            vector<int>fi;
            int ans=0;
            for(int i=0;i<=l;i++)  fi.push_back(ve[i]),ans+=ve[i];//注意这里要=l
            for(int i=r;i<n;i++)  fi.push_back(ve[i]),ans+=ve[i];
            sort(all(fi));
           //贪心取出负数,排序后越小的负数排前面 
            for(auto t:fi){
                if(cnt==0) break;
                if(t<0) {
                    ans-=t;
                    cnt--;//操作数记得减1
                }
            }
      
            sum=max(sum,ans);
            
        }
    }
    cout<<sum;
}


signed main()
{
    ios::sync_with_stdio(0),cin.tie(0);
    int t=1;
    //cin>>t;
    while(t--) solve();
    return 0;
}

Friendships
1.首先我们画出一个菊花图(n个点),就是中间一个点,周围被n个点包围,然后连接每个点和这个中间点,我们可以发现一个菊花图距离为2的点对数为(n-2)*(n-1)/2
2.然后随机连接每个距离为2的点,这个菊花图的点对数就会-1,先建图就是(1,2),(1,3).....(1,n),这就表示一个菊花图
3.然后我们枚举连接距离为2的点,比如(2,3),(2,4).....画个图出来会更加直观

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define x first
#define y second
typedef pair<int,int> pii;
#define all(v) v.begin(),v.end()
int dx[]={0,1,-1,0};
int dy[]={-1,0,0,1};
string s;
signed main()
{
 	int n,k;
 	cin>>n>>k;
 	int p=(n-2)*(n-1)/2;//菊花图的点对数
	int cp=p-k;//需要连接的数量
	if(cp<0){
		cout<<-1;
		return 0;
	} 
	vector<pii>ve;
	for(int i=2;i<=n;i++) ve.emplace_back(1,i);
	for(int i=2;i<=n&&cp;i++) //连接次数够了就行 
	{
		for(int j=i+1;j<=n&&cp;j++)
		{
			ve.emplace_back(i,j);
			cp--;
		}
	}
	cout<<ve.size()<<endl;
	for(auto [x,y]:ve) cout<<x<<" "<<y<<endl;
}

标签:Summer,ve,pii,int,SMU,long,2024,solve,define
From: https://www.cnblogs.com/swjswjswj/p/18290072

相关文章

  • 2024码蹄杯职高省赛第三场初赛全题解
    其实吧对于码蹄杯省赛的话,第三场是一千五百多人,百分之25的获奖率,然后前四百名左右就可以获奖,根据排行来看大概是六题左右,其中大概就四题要点脑子,其余的基本上属于语法题,也就是13题中如果语法没问题的话,九题是很轻松的,因为都是青铜白银题,语法没问题的话就OK的,然后就是一个P序列,......
  • 题解(2024.7.8贪心)
    1.Teleporters(HardVersion)题意:有n+2个位置:0~n+1,给定n个数\(a_1\)~\(a_n\),有以下操作:向左/右移动一格,代价为1。传送回0位置或者n+1位置,记你当前的位置为i,则代价为\(a_i\)。每个位置只能发动一次传送。求最大传送次数思路:因为每次传送都会回到0/n+1号点,所以,到......
  • 2024已过半,还没试过在vue3中使用ioc容器吗?
    Vue3已经非常强大和灵活了,为什么还要引入IOC容器呢?IOC容器离不开Class,那么我们就从Class谈起Class的应用场景一提起Class,大家一定会想到这是Vue官方不再推荐的代码范式。其实,更确切的说,Vue官方是不推荐基于Class来定义Vue组件。如图所示:社区确实有几款基于Clas......
  • 2024年7个最佳WooCommerce商城案例
    WooCommerce毫无疑问是最受欢迎的电子商务平台。截至2021年,它的下载量已超过8230万次,运行的网站超过380万个。 就市场份额而言,WooCommerce高达40.9%—比紧随其后的竞争对手Shopify高出近15%。 这些数字说明了WooCommerce的规模有多大,以及无数电子商务品......
  • 9个用于测试自动化的最佳AI测试工具(2024)
    选择一款优质的基于生成式AI人工智能的测试工具能够确保测试过程的准确性和效率,从而加速整个软件测试周期。相反,设计不佳的测试工具可能无法发现错误,并可能存在安全问题。它们可能产生误报或漏报,误导开发与测试团队,导致潜在的软件故障。  1、testRigortestRigor是一个基......
  • 2024/7/8 笔记
    CF1656Hhttps://www.luogu.com.cn/problem/CF1656H参考DaiRuiChen007的题解:code:usingnamespacestd;#definell__int128_tconstintmaxn=1e3+10;llgcd(lla,llb){ returnb?gcd(b,a%b):a;}constintN=1024,N2=N<<2;structstree{ lltree[N2];......
  • 国开大学2024《电子商务法律与法规(统设课)》
    一、单选题1.2017年8月18日()挂牌成立,这是全国第一家集中审理涉网案件的试点法院。A.北京互联网法院B.广州互联网法院C.杭州互联网法院D.上海互联网法院答案:C2.电子合同是平等主体之间以()的形式达成的,设立、变更、终止民事权利义务关系的协议。A.电子签名B.数......
  • YC311A [ 20240701 CQYC省选模拟赛 T1 ] 好串(good)
    题意给定一个长度为\(n\)的\(01\)串。定义一个串是好的当且仅当该串的所有前缀以及所有后缀的\(1\)的数量大于等于\(0\)的数量。你需要维护\(q\)个查询,每次求\(S_{l,...,r}\)的子串最少添加的\(1\)的个数使得该子串是好的。Sol首先不难发现一个正确的贪心,也......
  • CSE 105 Summer Session
    CSE 105Summer Session 1 2024Homework 1Due date: Sunday July 7 at 11:59pmInstructionsOne member of the group should upload your group submission to Gradescope. During thesubmissionprocess,theywillbepromptedtoaddthenameso......
  • 北京一零一中2024年信息学迎新马拉松解题报告
    AT469715[2024迎新马拉松]101相当于选择一段长度为\(3k\)的区间使得变化的总值最小。维护每一个元素变化到\(1\)与\(0\)的要求数量,之后前缀和处理即可。#include<bits/stdc++.h>#defineendl"\n"usingnamespacestd;typedeflonglongll;constllMAXN=1e6+5;......