2019年9月7日(贪心专题考试)

难受,炸\(long~long\),\(QwQ\)

\(prob1:Maximal~GCD\)

一句话:注意判炸\(long~long\)

没公约数的情况不用说了,若有设其为\(p\),很明显\(n\)为\(p\)的倍数,此时可以将序列的和化为\(n/p\)个\(p\)的和,又\(n/p\)个最少为\(k*(k+1)>>1\)个,所以就得到了\(n/p\)的下界,则\(p\)的上界为\(\frac{n}{k*(k+1)>>1}\),只需求在该界之下的最大的\(n\)的因数即可求出\(p\)的最大值。

\(tmp\)之下第一个\(n\)的倍数可以这么求:

inline long long chu(long long n,long long k)
{
    long long g=1;
    for(;n%k;k=n/k+g,g^=1);
    return g?k:n/k;
}  

总的代码:

#include<iostream>
using namespace std;
inline long long read()
{
    long long x=0;
    char ch=getchar();
    for(;!isalnum(ch);ch=getchar());
    for(;isalnum(ch);ch=getchar()) x=x*10+ch-'0';
    return x;
}
inline long long need(long long m,long long f)
{
    long long ans=2*m-f*f+f;
    ans=ans/(2*f);
    return ans;
}
inline long long chu(long long n,long long k)
{
    long long g=1;
    for(;n%k;k=n/k+g,g^=1);
    return g?k:n/k;
}
int main()
{
//  freopen("out.cpp","w",stdout);
    long long n=read(),k=read();
    long long tmp=need(n,k);
    tmp=min(tmp,n/(k*(k+1)>>1));
    if(tmp<=0||k>2e5) puts("-1"),exit(0);
    long long p=chu(n,tmp);
    long long t=n-(k*(k+1)>>1)*p;
    for(long long j=1;j<=k-1;++j) printf("%lld ",p*j);
    printf("%lld\n",t+k*p);
    return 0;
}

\(prob2:Artem~and~Array\)

明显易知,在一个\(2* 2\)的矩阵中,若存且仅存在一个\("* "\),那么,这个\("* "\)必须变成".",\(bfs\)一下就好了

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
#define in read()
#define re register
#define fur(i,a,b) for(re int i=a;i<=b;++i)
#define fdr(i,a,b) for(re int i=a;i>=b;--i)
#define jinitaimei signed
#define nm make_pair
#define pr pair<int,int>
//#define int long long
inline int read()
{
    int x=0;
    char ch=getchar();
    for(;!isalnum(ch);ch=getchar());
    for(;isalnum(ch);ch=getchar()) x=x*10+ch-'0';
    return x;
}
const int xx=2e3+10;
int wall[xx][xx];
int n,m,name=0;
char op[xx];
queue<pr>q;
inline void bfs()
{
    while(!q.empty())
    {
        int x=q.front().first,y=q.front().second;
        q.pop();
        name=wall[x+1][y+1]+wall[x][y+1]+wall[x+1][y];
        if(name==1&&y<m&&x<n)
        {
            if(wall[x+1][y+1]) wall[x+1][y+1]=0,q.push(nm(x+1,y+1));
            if(wall[x+1][y]) wall[x+1][y]=0,q.push(nm(x+1,y));
            if(wall[x][y+1]) wall[x][y+1]=0,q.push(nm(x,y+1));
        }
        name=wall[x+1][y-1]+wall[x][y-1]+wall[x+1][y];
        if(name==1&&y>1&&x<n)
        {
            if(wall[x+1][y-1]) wall[x+1][y-1]=0,q.push(nm(x+1,y-1));
            if(wall[x+1][y]) wall[x+1][y]=0,q.push(nm(x+1,y));
            if(wall[x][y-1]) wall[x][y-1]=0,q.push(nm(x,y-1));
        }
        name=wall[x-1][y+1]+wall[x][y+1]+wall[x-1][y];
        if(name==1&&x>1&&y<m)
        {
            if(wall[x-1][y+1]) wall[x-1][y+1]=0,q.push(nm(x-1,y+1));
            if(wall[x-1][y]) wall[x-1][y]=0,q.push(nm(x-1,y));
            if(wall[x][y+1]) wall[x][y+1]=0,q.push(nm(x,y+1));
        }
        name=wall[x-1][y-1]+wall[x-1][y]+wall[x][y-1];
        if(name==1&&x>1&&y>1)
        {
            if(wall[x-1][y-1]) wall[x-1][y-1]=0,q.push(nm(x-1,y-1));
            if(wall[x-1][y]) wall[x-1][y]=0,q.push(nm(x-1,y));
            if(wall[x][y-1]) wall[x][y-1]=0,q.push(nm(x,y-1));
        }
    }
}
jinitaimei main()
{
    n=in,m=in;
    fur(i,1,n)
    {
        scanf("%s",op);
        fur(j,1,m)
        {
            wall[i][j]=op[j-1]=='*'?1:0;
            if(!wall[i][j]) q.push(nm(i,j));
        }
    }
    bfs();
    fur(i,1,n)
    {
        fur(j,1,m) printf("%c",wall[i][j]?'*':'.');
        cout<<endl;
    }
    return 0;
}

\(prob3:Students'~Revenge\)

若将所有任务按\(b\)为第一关键字排序,那么主席肯定会选我们选中的\(p\)个任务中的靠后\(k\)个,先得到这后\(k\)个\(\sum a\)的最大值,再在前面\(p-k\)个中取到\(max(\sum b)\)即可

#include<iostream>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;
#define in read()
#define re register
#define fur(i,a,b) for(re int i=a;i<=b;++i)
#define fdr(i,a,b) for(re int i=a;i>=b;--i)
#define int long long
#define pr pair<int,int>
#define hp __gnu_pbds::priority_queue<pr,greater<pr> >
#define nm make_pair
hp q;
inline int read()
{
    int x=0;
    char ch=getchar();
    for(;!isalnum(ch);ch=getchar());
    for(;isalnum(ch);ch=getchar()) x=x*10+ch-'0';
    return x;
}
const int xx=1e5+10;
struct person
{
    int a,b;
    int id;
}m[xx];
bool choose[xx];
inline bool cmp(person x,person y)
{
    return (x.b^y.b)?(x.b<y.b):(x.a>y.a);
}
main()
{
    int n=in,l=in,k=in,Min=n-k+1;
    fur(i,1,n) m[i].a=in,m[i].b=in,m[i].id=i;
    sort(m+1,m+n+1,cmp);
    fdr(i,n,n-k+1) choose[i]=true,q.push(nm(m[i].a,i));
    l=l-k;
    fdr(i,n-k,l+1) if(m[i].a>q.top().first)
    {
         choose[q.top().second]=false;
         q.pop();
         q.push(nm(m[i].a,i));
         Min=i;
    }
    while(!q.empty()) printf("%lld ",m[q.top().second].id),q.pop();
    while(l--) printf("%lld ",m[--Min].id);
    puts("");
    return 0;
}

\(prob4:Ball~Coloring\)

先令所有二元组的\(x\)小于\(y\),在两边得到\(Rmax,Rmin,Lmax,Lmin\),此为第一种情况,

再将序列按\(x\)为关键字排序,从小到大除最大的\(x\)所在的二元组外,其他二元组一一交换,可以证明,答案一定在其中

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define in read()
#define re register
#define fur(i,a,b) for(re int i=a;i<=b;++i)
#define fdr(i,a,b) for(re int i=a;i>=b;--i)
#define cl(a,b) memset(a,b,sizeof(a))
#define jinitaimei signed
#define int long long
inline int read()
{
    int x=0;
    char ch=getchar();
    for(;!isalnum(ch);ch=getchar());
    for(;isalnum(ch);ch=getchar()) x=x*10+ch-'0';
    return x;
}
const int xx=2e5+101;
struct person
{
    int x,y;
}m[xx];
inline bool cmp(person a,person b)
{
    return a.x<b.x;
}
jinitaimei main()
{
    int n=in,xmax=0,xmin=2e18,ymax=0,ymin=2e18;
    fur(i,1,n)
    {
        m[i].x=in,m[i].y=in;
        if(m[i].x>m[i].y) swap(m[i].x,m[i].y);
        xmax=max(xmax,m[i].x);
        xmin=min(xmin,m[i].x);
        ymax=max(ymax,m[i].y);
        ymin=min(ymin,m[i].y);
    }
    int ans=(xmax-xmin)*(ymax-ymin);
    sort(m+1,m+n+1,cmp);
    ymin=xmin;
    int maxl=m[1].y,minl=m[1].y,ans2=2e18;
    fur(i,2,n-1)
    {
        maxl=max(maxl,m[i].y);
        minl=min(minl,m[i].y);
        ans2=min(ans2,max(maxl,m[n].x)-min(minl,m[i+1].x));
    }
    if(n>2) ans2*=(ymax-ymin);
    ans=min(ans,ans2);
    cout<<ans<<endl;
    return 0;
}

\(prob5:Ant~Man\)

可以证明,将从\(1\)到\(n\)的所有非\(s\)或\(t\)的点局部最优地插入\(s\)与\(t\)的间隔中可以得到全局最优解

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define in read()
#define re register
#define fur(i,a,b) for(re int i=a;i<=b;++i)
#define fdr(i,a,b) for(re int i=a;i>=b;--i)
#define cl(a,b) memset(a,b,sizeof(a))
#define jinitaimei signed
#define int long long
inline int read()
{
    int x=0;
    char ch=getchar();
    for(;!isalnum(ch);ch=getchar());
    for(;isalnum(ch);ch=getchar()) x=x*10+ch-'0';
    return x;
}
const int xx=5e3+101;
int nxt[xx];
int x[xx],a[xx],b[xx],c[xx],d[xx];
inline int dis(int xa,int ya)
{
    if(ya<xa) return x[xa]-x[ya]+c[xa]+b[ya];
    return x[ya]-x[xa]+d[xa]+a[ya];
}
jinitaimei main()
{
    int n=in,s=in,t=in;
    fur(i,1,n) x[i]=in;
    fur(i,1,n) a[i]=in;
    fur(i,1,n) b[i]=in;
    fur(i,1,n) c[i]=in;
    fur(i,1,n) d[i]=in;
    nxt[s]=t;nxt[t]=0;
    int ans=dis(s,t);
    fur(i,1,n) if(i!=s&&i!=t)
    {
        int mn=2e18,tmp=s,j=s;
        while(nxt[j])
        {
            if(dis(j,i)+dis(i,nxt[j])-dis(j,nxt[j])<=mn)
            {
                mn=dis(j,i)+dis(i,nxt[j])-dis(j,nxt[j]);
                tmp=j;
            }
            j=nxt[j];
        }
        ans+=mn;
        nxt[i]=nxt[tmp];
        nxt[tmp]=i;
    }
    printf("%lld\n",ans);
    return 0;
}

原文地址:https://www.cnblogs.com/ALANALLEN21LOVE28/p/11502657.html

时间: 2024-10-14 20:34:58

2019年9月7日(贪心专题考试)的相关文章

周记 - 2019年11月03日

2019年11月05日 2019年徐州区域赛结束了.封榜前3题铜牌前部,封榜后最后27分钟罚了4次通过E题.虽然4题罚时爆炸,不过万幸得了银牌后部.目前看应该还会再参加一年的,这个博客会不断更新记录最后一年参加比赛的学习进度(以及最后两年本科的其他事情),今年的目标是做一个真正的全能选手,首先希望在寒假结束前把Codeforces打到橙色(2100+),证明自己思维还行吧. 既然想做全能选手,每个专题都要学到省选级别吧,学习的分类就参照OI-Wiki的分类,题单的话,模板题从洛谷找,思维题从Co

2019年2月26日【整理物品,下载收集考研资料,明天正式开始复习】

2019年1月26日星期六 一:一句话木马重学习 1.网站安全狗网马查杀 http://download.safedog.cn/download/software/safedogwzApache.exe 2.D盾 Web 查杀 http://www.d99net.net/down/WebShellKill_V2.0.9.zip 3 深信服WebShellKillerTool http://edr.sangfor.com.cn/tool/WebShellKillerTool.zip 4 BugSc

2019年2月10日-日记

2019年2月10日, 星期日 春节寄语 春节假期今天就结束了.2018已成过去时了,在这个2019的现在时里,我们将面临新的生活,活在社会,活在学校,活在自己的世界. 时光流逝,仿佛流星般的速度,卡卡之间,我们已不再招摇. 听说,自己有自己的故事,每个人都在演绎自己的传奇,一刹那,自己变成了自己的主角,虽说不是穿越,但是可以想象自己穿越了.听说,主角有主角光环,但是现实世界是虚无甚少的.听说,这个春节过了,我想自己应该可以重新自己的故事,一个人还是两个人,或者更多人的故事呢? 家里的春节 话说

2019年2月11日-日记

2019年2月11日, 星期一 感想之歌 new soul,静悄悄. Some monster,说爱你. 飞云之下,雪落下来的声音,舒伯特玫瑰. 探清水河,胡广生,童话镇,至少还有你. 远走高飞,九张机,月牙湾,心动了没有. 海绵宝宝,你一定要幸福,将来的东西,再见,光年之外. 给我一个吻,拜托,请先说你好. 带你去旅行,江南,全部都是你. 遥远的她,月半小夜曲,从天而降. 九门回忆,all falls down,right now. 洪荒之力,遇见,乌云中. superstar,出卖,小幸运.

【蜕变之路】第1天 规划 (2019年2月19日)

声明: 本人是一名刚步入社会的职场小白,主要从事Java后端开发.开启[蜕变一路]系列主要是为了记录每日学习.思考以及总结的情况,目的是为了不断挑战自己,提升自己!此系列全程公开,欢迎见证! 内容: 1.每天学习一道编程题或者一个Java知识点(Java相关) 2.每周发表一篇技术文章(由浅入深) 3.每三天进行一次运动(跑步.打篮球.羽毛球等等) 4.每天睡前阅读三十分钟 5.每天学习英语三十分钟 时间: 2019年2月19日~2020年2月19日 期望: 1.提高Java编程能力 2.提高文

【2019年4月17日】指数基金估值表(今日定投)

大家好,我是牛九老师,财经达人,专注于研究指数基金. 今天周四,我们定投的时间到了,推荐大家在支付宝中进行基金的购买,即方便又安全. 本周老师推荐的定投组合如下(下午三点之前在支付宝“基金栏目”搜索场外基金号码进行买入即可): 每只指数基金都是一只“会下金蛋的鹅”,我们要做的就是慢慢的喂养它,持之以恒它就会给我们带来稳定的回报. 我们以后采取的定投策略是:每周定投低估值的指数基金,定期不定额. 就是基金的估值越低,定投金额会略微增加,这样可以极大的摊低成本.(根据低估程度,采取1-2倍的定投基数

【2019年4月26日】最新指数基金估值表(坚持定投终能胜利)

(本篇文章阅读时间约2分钟) 大家好,我是牛九老师,专注于研究指数基金领域很多年,欢迎来到[牛九老师的投资者大家庭]. 每天我会给大家分享投资心得,发布最新的指数基金估值. 每天只需五分钟,大家跟随老师一起坚持投资自己.实现财富增值,战胜通货膨胀,共同走向财务自由之路,过上自己真正想要的生活! 我们坚持在每周四(下午三点之前)进行指数基金的定投,届时会向大家推荐当期的定投组合,强烈推荐大家在支付宝中购买基金,方便安全有保障! 下面是我为大家精心制作的2019年4月26日[第106期]指数基金估值

5月9日贪心考试总结

5月9日贪心考试总结 自制考试链接:https://www.luogu.org/contestnew/show/16837 这次考试没有经过任何复习,我就想知道考出来是啥样子. 游记部分 考前inf小时: 我:"你是复习贪心还是背地生?" GSC大佬:"当然是复习贪心了啊!"说罢,拿出了生物书. JMR大佬:"肯定是背地生了啊!我明天肯定会爆(A)零(K)." 文化课大佬QHY:"JMR你肯定爆(A)零(K)" CXY大佬:&

2019年4月24日实验室学术讨论

2019年4月24日上午9点,实验室全体人员参与学术讨论.崔文军.张家蕾.郑桂萍和付俊俊分别做了学术报告. 首先,崔文军老师做了关于“利用水波方程做差分隐私保护”的报告,在该报告中崔老师主要讲述了差分隐私的一些基础知识和基本概念,并详细介绍了一个具体方案:其次,张家蕾老师关于“一种D2D通信中利用社交属性进行分组转发的策略”做了报告,提出了一种利用社交属性的D2D分组转发策略,该策略同时考虑了D2D分组方案,组长UE的选择和D2D资源分配等问题:再次,桂萍主要关于论文“VANETs中基于时空分析

开机时自动启动的AutoHotkey脚本 2019年07月08日19时06分

;;; 开机时自动启动的AutoHotkey脚本;; 此脚本修改时间 2019年06月18日20时48分;; 计时器创建代码段 -----------------------------------------------------------------------------------------; SetTimer可以模拟多线程从而不影响主线程的流畅执行; 请在SciTE4AutoHotkey中选中单词并按快捷键F12跳转到函数定义处; 绿色免安装程序,统一都分类保存在本地磁盘D分区文