青岛大学ACM集训队暑假留校选拔暨端午节欢乐赛(没有b题)

A.那人那雨那把伞

Description

 

体形瘦小,但成就一点也不小,谓之小,

代码很稳,算法掌握所有基础,谓之基,

男主光环,终将逆袭成为大佬,谓之佬。

小基佬,算法基础牢固的大佬!!!丁烁进入集训队后,队中大能mmk为他所起称号,闻者震惊,听者感叹,也不负丁烁青大校赛冠军之名。

而虽说进入了集训队,但丁烁内心却全无骄傲,依旧每日勤奋的刷题,锻炼着自己的思维,磨炼着自己的算法。

为了激励自己,丁烁特地在他实验室的桌子上,摆放了一坛梅花,正是举世闻名的基尼泰梅,寓意着梅花香自苦寒来,要想把兰博基尼开上泰山,就得不停地刷题训练。

皇天不负有心人,在丁烁不断努力下,他愈发强大,甚至不少学弟学妹慕名跟随他学习,奉他为基丁教主,自发的形成青大第一教派,基丁神教!

而当时的QDU还处于混乱阶段,基丁神教只是刚刚出现的小教,在它之上还有着ikun教等大大小小的教派。各派之间利益冲突不断,谁也不服谁。

于是那一天,在无妖气之巅,各教教主齐聚,只为争夺QDU第一教之名。

混战足足持续了两个半时辰,在场的各个豪杰却越战越勇,不分胜负,而在这最终时刻,丁烁发动修炼已久的九基神功,一发坤坤大挪移算法完美A题,AK全场,为这一战拉下了帷幕。

无妖气一战后,丁烁一统数软一派,全数软弟子统统拜入基丁神教,丁烁也一一为他们封职,众人齐呼“左拥贤恒右抱坤,世间基佬烁独尊”。

Clipboard Image.png

我们今天的故事,就发生在这之后。

丁烁皱着眉头坐在电脑前,湖南传来了消息,秘宝冠杯金牌现世,为了决定这两件宝物的归属,将举办一场武林大会。这两件宝物对丁烁来说极其重要,所以他必然会参加大会。而让丁烁头痛的是,此次参加大会的居然有dm,aa,穷游,儒生等隐世大能,这些都是棘手的对手啊。

“教主洪福齐天,此去湖南,定能有所收获。”,贤八哥说道,他和恒少主这次将陪伴丁烁一同前往湖南。

对,没什么好怕的,鹿死谁手还未知道呢,丁烁紧皱的眉头松开了。

“准备妥当了,就启程吧。出发!”丁烁站起身来说道,下一刻,基丁神教内传来呼声。

基丁教主,算法盖世,思维通天,区区鸡尾,不在话下,DMAA,不足挂齿, 此去湖南,脚踢穷游,手擒儒生,千秋万载,唯基捧杯。

人的斗志,就如同高山滚石一般,一旦开始,就再也停不下来了。想让他们停下来,除非这些石头原本就在山谷的底部。丁烁斗志冉冉,登上了前往湖南的火车。

奔波了一天,丁烁与贤八哥和恒少主,来到了湖南。

湖南的雨绵绵,小姐姐的裙飘飘,丁烁目不转睛地盯着看,直到他两同伴把他拉入了金拱门避雨。

“可以交个朋友吗?”,丁烁刚坐下,一个身穿白裙的小姐姐便走了过来和丁烁交谈。这位小姐姐,人很漂亮,但声音却有点粗。

“教主魅力四射啊。”,贤八哥在一旁说道,恒少主却冷冷地看着那位小姐姐。

丁烁不好意思地挠了挠头,说:“我叫丁烁,你呢?”

“陈默萱。”,小姐姐礼貌的回答,随后坐在三人旁边的桌子点餐。

经过一番交谈,三人得知,默萱来自广东,也是来参加此次的武林大会。

“看丁大哥气宇不凡,这次大会必夺魁首取得两件宝物了。”,默萱笑着说道,眉毛弯弯,看得丁烁入神。

丁烁再次不好意思的挠了挠头,说:“默萱姑娘也不差,说不定发挥得比我们还出色。”。

贤八哥则不怀好意地说道“教主这番模样真是少见。”,而恒少主哼的一声,说了句“我先回酒店了”,便走了,贤八哥赶紧追了上去。

只剩下丁烁和默萱两人,气氛变得尴尬起来,过了好一会,丁烁主动的说:“默萱姑娘住哪个酒店,要不我送你回去吧?”

“好啊。”默萱立马拿起了丁烁放在地上的伞,走向门口。

“哎,那是我的。。”丁烁刚想说,轩默回过头笑眯眯地看着他,看得他仿佛做了十道线段树,心里飘飘乎,说了句“是你的伞。”

丁烁打着伞跟默萱慢慢地走着,湖南的这人,这伞随着雨,下到了他的心里。

待丁烁送完轩默,回到酒店,发现恒少主在酒店门口等着他。

“贤哥已经睡了吗”,丁烁问道。

“嗯。”,恒少主简单的回答。

“那我们,”丁烁话音刚落,恒少主从背后抱住了他,持续了几秒,丁烁弄开了恒少主的手,“也早点睡吧”。

恒少主呆呆地站在原地。从背后抱你的时候,你期待的却是她的面容。

长夜漫漫,刷题作伴。

第二天,大会热火朝天地开展,在开幕前,默萱来到丁烁他们机位交谈了一会。而很快比赛就开始了,三人以扎实的代码功底,稳稳的过题,而到最终关键时刻,他们却发现他们的算法秘籍不见了。

“怎么回事,我记得就放这的呀?”,丁烁难的得慌了神,只要算法秘籍还在,他们就能解决这剩下的问题了。

贤八哥也急得满头大汗,“难道是默萱姑娘拿走了?”

"不,不可能”,丁烁不愿去相信。

一分一秒,时间流逝得很快,丁烁的瞳孔也逐渐变得空洞。终于大会结束,穷游夺下桂冠,丁烁拿着铜牌出神,突然他在人群中看见一个人影。

“是不是你拿走了我们的秘籍?”,丁烁拦下了默萱,质问她。

随着默萱的轻轻点头,丁烁的心也跟着碎。

“为什么为什么”,丁烁不停地质问。

“对不起”,默萱把秘籍放在丁烁手中,眼中带着泪花,转身要走。

丁烁拉住了她,:“你还有什么瞒着我的?”

默萱看着丁烁的脸,终是开了口:“他们说女装会更强,所以我。。。”

“什么,你你你”,丁烁震惊得连手中宝贵的算法秘籍都掉落在地。

“还可以做朋友吗?”,默萱不再用伪音,直接地用他本来的声音,问道。

“不!”,言不由衷,词不达意。

湖南的雨又下了,丁烁没有要回那把送给默萱的伞,就让那把伞留在他的梦里。他决定重新买把伞,于是他走进了一家店。

这家店里有很多把伞,每把伞都有它的价格A,价值B,以及一个限定额C,限定额就是如果想买这把伞,手上至少有C块钱,否则就不能买这把伞。每把伞最多买一次,现在丁烁手中有M块钱,问可以获得的最大价值是多少?

image.png

Input

 

第一行输入N,M代表店里有多少把伞以及丁烁手中一开始有多少钱。1≤N≤500,1≤M≤5000

接下来N行,每行包含三个数字Ai,Ci和Bi,代表每把伞的价格,限定额,以及价值。1≤Ai≤Ci≤100,1≤Bi≤1000

Output

 

输出一个整数,表示丁烁可以得到的最大价值。

Sample Input 1 

1 100
1 1000 100

Sample Output 1

0

Sample Input 2 

2 10
10 15 10
5 10 5

Sample Output 2

5

Sample Input 3 

3 10
5 10 5
3 5 6
2 7 3

Sample Output 3

11

Hint

第一个样例中,虽然伞的价格是1块钱,丁烁有100块钱,可是丁烁手上的钱没有大于等于伞的限定额,所以不能买这把伞。

并且哪怕丁烁现在手上有100块,但如果等下他买了一把价格50块的伞之后,手上就只有50块钱了,如果有一把伞的限定额是51,价格是50,那他也不能买那把伞。

以上故事纯属娱乐,如有属实,请不要给我律师函。故事很长,就不在此一一详细的讲述,想了解更多细节,知道丁烁如何从平凡的大二学生,成长成为小基佬,基丁教主,甚至手捧奖杯,胸挂金牌的太上老基的故事,请认准官方唯一指定认证随时会断更的纪实小说《QDU_ACM人物列传》,我们正式选拔再见。

思路:01背包+限制

这个题目一看有点01背包的意思,但是多了个限定的条件限定值,那我们就不能去直接用01背包去解了,然后大体的修改方式是就是多了个限定值和价格的差值,然后对于两种情况,限定值大于价格,价格大于限定值,分两种情况讨论一下就行了

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<map>
#include<cmath>
const int maxn=1e5+5;
typedef long long ll;
using namespace std;
struct node
{
    int a,c,b;
}p[505];
int dp[505][5005];
bool cmp(node x,node y)
{
    return x.c-x.a>y.c-y.a;
}
int main()
{
   int n,m;
   cin>>n>>m;
   for(int t=1;t<=n;t++)
   {
       scanf("%d%d%d",&p[t].a,&p[t].c,&p[t].b);
   }
   sort(p+1,p+n+1,cmp);
   int ans=0;
   for(int t=1;t<=n;t++)
   {
       for(int j=0;j<=m;j++)
       {
         dp[t][j]=dp[t-1][j];    
    }
    if(p[t].c>p[t].a)
    {
        
        for(int j=p[t].c;j<=m;j++)
        {
            dp[t][j-p[t].c+p[t].a]=max(dp[t][j-p[t].c+p[t].a],dp[t-1][j-p[t].c]+p[t].b);
            ans=max(dp[t][j-p[t].c+p[t].a],ans);
        }
        
    }
    else
    {
        for(int j=p[t].a;j<=m;j++)
        {
            dp[t][j]=max(dp[t][j],dp[t-1][j-p[t].a]+p[t].b);
            ans=max(dp[t][j],ans);
        }
    }
   }
   cout<<ans<<endl;
   return 0;
}

B.大家好,我是练习时长两年半的个人练习生mmk(题目贴上,以后再看吧,好像是隔板法和组合数学的知识)

Description

 

mmk喜欢唱,跳,rap和篮球。一天,他听说学校要选拔青大歌王,他非常高兴的就去了。

歌王的选拔规则是:共有N个评委,每个评委根据选手表现给出一个正整数作为分数,然后取平均值。

由于mmk太帅了,评委们怕他骄傲,所以最后的平均分在1到M之间(平均分是整数,没有精度丢失)。

mmk自从自封青大第一帅后,就有了一群真爱(hei)粉。

作为他的粉丝,你能帮他算算有多少种这样的情况(平均分等于其中某一位评委给的分数)吗。

例如2个评委,给打的分数都是1分,那么此时平均分是1分,即等于第一个评委的分数,又等于第二个评委的分数,这样算2种

例如4个评委,打的分数是1、2、2、3,此时的的平均分是2分,即等于第二个评委的分数,又等于第三个评委的分数,这样算2种

例如3个评委,打的分数都是2分,那么此时的平均分是2分,即等于第一个评委的分数,又等于第二个评委的分数,又等于第三个评委的分数,这样算3种

但是由于每个评委打的分都是正整数,所以会有很多种情况。

现在请你帮助mmk数一下有多少种这样的情况,由于结果会很大,请你对1000000007取余。

Input

 

第一行输入一个整数T (1<=T<=10) ;

接下来有T组测试数据,对于每组测试数据输入2个数个n和M(2<=n<=60,1<=M<=200),代表有n个评委,平均分数是[1,M]之间的一个整数。

Output

 

对于每组测试数据,输出对应答案。

Sample Input 1 

2
3 2
3 3

Sample Output 1

12
27

Hint

对于n=3,M=2那种情况

平均分等于加下划线那位评委的打分

平均分是1的情况有3种:

11 1

111

1 11

平均分是2的情况有9种:

22 2

222

2 22

21 3

23 1

123

321

1 32

3 12

C.蔡广坤(二进制打表加二分)
 

Description

 

众所周知,青岛大学ACM集训队里面有两大歌神lgz和mmk,他们的歌声太过于美妙以至于粉丝众多,爱慕者无数。其中头号粉丝pwj对歌神的爱更是如滔滔江水连绵不绝,在他的极力撮合下,两大歌神终于联手组成了名震青大的蔡广坤组合。头号粉丝pwj不仅代码敲得好,小说写的好,更是有经商赚钱的头脑,他成为了蔡广坤组合的经纪人并在近期筹谋为蔡广坤组合举办第一场演唱会。消息一传出,反响巨大,粉丝们的热情远超pwj的想象,于是他嗅到商机并决定通过卖演唱会门票大赚一场,因为pwj尤其钟爱4和7,他喜欢所有只由4和7组成的数字,如4,7,44,77,47,447.....并把这些数字称为幸运数字,他根据座位卖门票,每张门票的价格为刚好大于等于该座位号的第一个幸运数字,他想知道如果卖出[l,r]区间内的座位号对应的门票,他能赚多少钱?

Input

 

输入一行两个数l,r(1≤l≤r≤10^9)表示pwj卖出[l,r]区间内的座位号对应的门票。

Output

 

输出一行表示pwj能赚的钱。

Sample Input 1 

2 7

Sample Output 1

33

Sample Input 2 

7 7 

Sample Output 2

7

Hint

对于第一个样例:

大于等于2的第一个幸运数字为4

大于等于3的第一个幸运数字为4

大于等于4的第一个幸运数字为4

大于等于5的第一个幸运数字为7

大于等于6的第一个幸运数字为7

大于等于7的第一个幸运数字为7

所以pwj能赚4+4+4+7+7+7=33元

预处理+二分,就是利用二进制的知识进行打表,排序,然后区间用二进制查询就可以了

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<vector>
#include<map>
#include<cmath>
const int maxn=1e5+5;
typedef long long ll;
using namespace std;
ll pre[maxn];
ll sum;

int main() {
    int s1=0;
    for(int j=0; j<=10; j++) {
        for(int t=0; t<1<<j; t++) {
            ll s=0;
            ll k=t;
            for(int jj=0; jj<j; jj++) {
                if(t>>jj&1) {
                    s=s*10+4;
                } else {
                    s=s*10+7;
                }
            }
            pre[s1++]=s;
        }
    }
    sort(pre,pre+s1);
    ll sum=0;
    ll l,r;
    cin>>l>>r;
    while(l<=r)
    {
      ll pos;
      pos=lower_bound(pre,pre+s1,l)-pre;
      if(pre[pos]<=r)
      {
          sum+=(pre[pos]-l+1)*pre[pos];
          l=pre[pos]+1;
      }
      else
      {
          sum+=(r-l+1)*pre[pos];
          l=r+1;
      }
    }
    cout<<sum<<endl;

    return 0;
}
D.我给你最后的爱是一个函数(签到之一,直接上代码)
 

Description

 

一场比赛如果没有签到题的话,那就很没有体验感,而签到题出的很短的话,那就很没有意思了。所以我决定给你个很长的外传的题面,和一个很简单的题意。

可爱的分界线biubiubiu%%%%%%%%%%%

丁烁始终也没想到他与木坤会走到今天这一步,曾经木坤还宠溺的叫他小丁丁,而今日的他却已是以太上老基的身份出现在了木坤的身边。

而木坤现在也不再是那个曾经为丁烁一遍遍唱着情歌的鲲鲲,他现在已经是即将被钦定的国特爷。

蓝桥尽头谁为峰,一见坤坤道成空。看他国特少年郎,一朝榜首登殿堂。

木坤的身份已今非昔比,丁烁自然不会认为两人的关系还能像以前那样,所以两人也只是默默地站着,丁烁也是背对着木坤。

image.png

"明天就是大赛了,叫我出来有什么事?,没什么事的话,我就先走了。"木坤首先打破沉默。

"你当初那题的思路是错的,正确的答案应该是个函数。"

"就为了跟我说这个?"木坤有点不耐烦,"我的思路没错,是你的思路错了。"

"不是,你自己好好想想那个问题,它。。。",丁烁还想说点什么,却发现木坤已经转身要走了。

不想听你说话的人,哪怕你再怎么歇斯底里地喊叫也没有用,丁烁也是无奈地叫了一声,"鲲鲲。"

木坤停顿了下,但很快头也不回地继续走了。

唉,丁烁叹了口气,他以无边法力算出那道题将会至关重要,而天机不可泄露,他本身也寄托着基丁神教上上下下"太上老基,法力无边,算法盖世,思维通天。蓝桥国特,稳操胜券;W F 捧杯,安若泰山。"的希望,所以他只能尽量暗示木坤,可毫无效果。

夏天的风,一去无踪,吹散了回忆,也吹散了梦。

总赛场,数不清的旗帜。其中最多的就是三,字旗,其次是二字旗,一字旗寥寥无几,而特字旗仅有一杆。最终手上抢夺到哪面旗,也就代表着每个参赛选手这次取得怎样的荣耀与辉煌。

木坤在众星捧月中进了场,他瞥了眼一旁独自进场的丁烁,眼神中是说不出的意味。

待参赛选手都进场之后,稍休息片刻,总裁决官一声令下,瞬间风云涌动。

木坤直接使出了他自创绝学,搜索算法中的坤坤大挪移,在一层一层的递归回溯中,率先将特字旗拿到手中。

这面特字旗就像个导火线,引爆了其他选手的热血,不少人直接展现自己的神通上来与木坤争抢。

丁烁没有去争抢特字旗,而是先抢到了一面一字旗,然后一边抵挡着前来抢旗的人,一边观察着木坤那边的情况。

虽说被围攻,但木坤应对得游刃有余,先是一招质数分解就打退了不少人,然后一个深度空间搜索,直接打散人群,冲了出去,不过不少人依旧不依不饶地追着他。

每个选手最终手上只能有一面旗,而且同时只能有同等级的一面旗,所以往往大家只会专心地去争夺一面旗。

但丁烁突然预感到了什么,投身到了一场抢夺二字旗的混战中。

比赛逐渐接近尾声,战况也进入白热化阶段,木坤遇到了难缠的对手,与他争抢特字旗的人只剩下一个,来自烟台山庄的新星之秀肖一心。

肖一心不愧是烟台山庄新一代的领衔人物,在他的步步紧逼下,木坤明显招架不住,脸色变得苍白,宛如肾透支了一般。

丁烁心里此时犹豫万分,他既想出手争夺特字旗,为基丁神教带回荣耀,又想木坤得到特字旗,一边是天下,一边是一个人,看似简单的选择,丁烁却作不出决定。

正在丁烁犹豫的时候,特字旗战场那边突然爆发了剧烈的能量波动,只见肖一心的手上藤蔓密布,绿油油的枝叶包围着他,一招主席树,召唤八大奇迹,八股强大的气息向木坤打去。

不好,是那一题的变招!丁烁大惊,如果木坤知道那个函数的话,他肯定也会以主席树来回应,可是如果他按照原来的思路来硬接肖一心的这一招的话,后果不堪设想。

“鲲鲲,主席树啊!”,丁烁朝着木坤大呼。

可是,已经晚了。

木坤斗气化纸,在纸上快速推演之后,左手上的能量气团威力爆增,是树上倍增,右手上的能量气团层次分明,是线段树,接着两个气团合二为一,一个树中树与肖一心对持。

当两股能量冲撞到一起时,明显是肖一心的主席树占了上分,木坤节节败退。

还未等木坤稳住身子,肖一心手中神杖一挥,一个火球向木坤袭来。

听闻过炉石传说的丁烁一惊,这是传说中的神物燃烧权杖。

一个个火球接连打在木坤和肖一心的身上,当最后一个火球打在木坤的身上时,一切结束了。木坤倒下了,特字旗易主了。

肖一心抢过特字旗挥舞着,木坤倒在地上,手里紧握着那张草稿纸。

此子十分强大,没必要和他争锋了。丁烁放弃了与肖一心争抢的念头,走到木坤的身边。

江山如此多娇,而我只为你折腰。

丁烁弯下腰把一字旗放在了木坤的手中,然后拿着二字旗守在他的身边,直到整个比赛的结束。

颁奖典礼上,有人欢喜,有人愁,丁烁环顾四周却没有发现木坤的身影,现在的他就算不是国特爷,也是国一爷啊。

突然想起了什么,丁烁连忙向地铁站跑去,匆忙地通过安检。

image.png

在候车处,丁烁看见了木坤。

image.png

“你还是追来了。”

"那个函数的答案也是我一直想对你说的话。"

"我知道了,我一直都知道。"

image.png

“别伤心了。”丁烁拍了拍木坤的肩膀,随即吟了诗。

胡月入紫微,三光乱天文。

英谋信奇绝,文曲扬清芬。

日月熙明地,风云际会辰。

蓝桥国特爷,还属我坤神。

木坤笑了笑,正巧地铁进站了,他拉着丁烁的手上了车。

“我们去哪?”

“去吃双皮奶。”

在他们的前方,一片光明。

image.png

全剧终。

等等,忘了说题目,想知道丁烁要对木坤说的是什么吗,来解开那个函数吧。

已知函数,

Love(n)=n+1314 ,n<5200001

Love(n)=Love(Love(n-1315)) n>=5200001

给你相应的n,求出Love(n)

Input

 

一个整数n,0<=n<=1e18

Output

 

输出相应的Love(n)

Sample Input 1 

0

Sample Output 1

1314

Sample Input 2 

5201314

Sample Output 2

5201314

Hint

以上故事及图片皆来源网络,如有雷同,请不要给我发律师函,更多详细剧情请关注《QDU_ACM人物列传》最新番外。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath>

const int maxn=1e5+5;
typedef long long ll;
using namespace std;
ll fun(ll x)
{
    if(x>=5200001)
    {
        return fun(fun(x-1315));
    }
    else
    {
        return x+1314;
    }
}

int main()
{
    
    ll n;
    cin>>n;
    if(n<5200001)
    {
        printf("%lld\n",n+1314);
    }
    else
    {
        printf("5201314\n");
    }
    
    return 0;
}
E.奇偶大作战(思维)
 

Description

 

在神奇的数学国界,小奇和小偶是非常要好的两个兄弟,大家知道数学世界是非常无聊的,小奇和小偶就打算开始玩一个游戏,数学国王给了他们一串数字,并规定了游戏规则,他们轮流取一串连续的数字(假设取数字段后,出现两个数字段,则自动对接成相邻状态,例如,1 2 3 4 5,取出2 3 ,则剩余为1 4 5),小奇取的数字要满足:该串的数的和是奇数,而小偶取的数字要满足:该串数的和是偶数,如果轮到谁取不出来数字了,那么他就输掉了游戏,会派去参军锻炼。现在告诉你小奇先取,并且两个人都足够聪明,问你最后谁会赢。

Input

 

先输入一个数字n,表示一串数字的长度

第二行输入n个数字a1 ,a2 ….,表示那一串数字。

1<=n<=100000,ai <=1000000000

Output

 

假如小奇胜利,输出“JI”,反之,如果小偶胜利,输出”OU“

Sample Input 1 

4
1 3 2 3

Sample Output 1

JI

Sample Input 2 

2
2 2

Sample Output 2

OU


代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath>

const int maxn=1e5+5;
typedef long long ll;
using namespace std;


int main()
{
    int n;
    cin>>n;
    ll sum1=0,sum2=0;
    ll x;
    int flag=0;
    for(int t=0;t<n;t++)
    {
       scanf("%lld",&x);
       if(x%2==1)
       {
           sum1++;
       }
       else
       {
           sum2++;
       }
    }
    if(sum1%2==1)
    {
        cout<<"JI"<<endl;
    }
    else if(sum1%2==0)
    {
        if(sum1==0)
        {
            cout<<"OU"<<endl;
        }
        else
        cout<<"JI"<<endl;
    }
    
    
    return 0;
}
嘉馨学姐吃包子(三分)
 

Description

 

嘉馨学姐非常爱吃包子,但是嘉馨学姐这个人很懒,她总是希望包子可以自己飞到她的嘴里,现在有n(n<=100000)个包子,告诉你每个包子的位置p(|p|<=1e6)和重量w(1<w<=10)。

已知包子飞行时,包子的口感度会降低,如果一个包子飞行了x,那这个包子的口感度会降低x*x*x*w。嘉馨学姐的初始位置由你来决定,要求尽量使所有包子降低的口感度总和F最小。

Input

 

第一行是一个正整数n(n<=100000),代表n个包子

以下的n行内容为第i个包子的位置pi(|pi|<=1e6)和重量wi(1<wi<=10)。

数据保证有序,对于任意的i<j,满足p[i]<=p[j]。

Output

 

请你计算包子降低的口感度总和F。

输出F/10的结果(只输出四舍五入后的整数部分即可)。

Sample Input 1 

2
10 6
15 4

Sample Output 1

15

Hint

三分时eps设为1e-5即可。eps过小会超时!!!

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath>

const int maxn=1e5+5;
const double eps=1e-5;
typedef long long ll;
using namespace std;
struct node
{
    long double p,w;
}p[maxn];
int n;
long double fun(double x)
{
    long double ans=0;
    for(int t=0;t<n;t++)
    {
        ans+=(abs(x-p[t].p)*(x-p[t].p)*(x-p[t].p)*p[t].w);
    }
    return ans;
}
int main()
{
    cin>>n;
    long double minn=0x3f3f3f3f;
    long double maxx=-0x3f3f3f3f;
    for(int t=0;t<n;t++)
    {
        scanf("%llf%llf",&p[t].p,&p[t].w);
        
        maxx=max(maxx,p[t].p);
        minn=min(minn,p[t].p);
    }
    double l=minn,r=maxx;
    double mid1,mid2;
    while(l<r-eps)
    {
         mid1=(l+r)/2;
         mid2=(l+mid1)/2;
        if(fun(mid1)>fun(mid2)+eps)
        {
            r=mid1;
        }
        else
        {
            l=mid2;
        }
    }
    long double ss=fun(l)/10+0.5;
    ll sss=ss;
    cout<<sss<<endl;
    
    return 0;
}

G.爱的魔力转圈圈~~~(签到)

Description

 

给你一个字符串仅由'O','0'和'o'三种圈圈组成。

现在对这个串施展一次转圈圈魔法,魔法效果使小圈圈变大一级,而最大的圈圈要变成最小的圈圈。

输出一行转圈圈之后的字符串。

Input

 

输入一个字符串,长度(1-1e6),仅由'O','0','o'组成。

Output

 

输出一行字符串。

Sample Input 1 

O0oO0oO0o

Sample Output 1

oO0oO0oO0

Sample Input 2 

OOOooo000

Sample Output 2

ooo000OOO

Hint

想你想到心花怒放黑夜白天~~~

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath>

const int maxn=1e5+5;
typedef long long ll;
using namespace std;
char str[10*maxn];
int main()
{
    
    cin>>str;
    int len=strlen(str);
    for(int t=0;t<len;t++)
    {
        if(str[t]=='O')
        {
            str[t]='o';
        }
        else if(str[t]=='0')
        {
            str[t]='O';
        }
        else if(str[t]=='o')
        {
            str[t]='0';
        }
    }
    puts(str);
    return 0;
}
H.后缀自动机next 指针DAG图上求sg函数(思维)
 

Description

 

超模Lucy在全美超模大赛中获得了冠军,因此有许许多多的名牌服装公司找她试穿衣服。Lucy有一颗非常精致的内心,她相邻两天不会穿同一家公司的衣服,并且同一件衣服不会穿第二次,以体现不同的风格(Lucy每天都会穿衣服哦,并且只穿公司提供给Lucy的衣服)。例如,Lucy第一天穿了公司A的衣服1,那么她第二天不再穿公司A的衣服1,第二天也不能穿公司A的衣服2,第三天可以穿公司A的衣服2,但是不能穿公司A的衣服1。一共有N家服装公司找她试穿衣服,其中第i家服装公司提供给她a[i]件不同的服装,并要求Lucy把提供给她的衣服全都试穿一遍。Lucy想知道能否有一个顺序,使得每天都穿不同服装公司的衣服,并完成各个服装公司给Lucy的任务?

Input

 

输入一共两行。

第一行是一个整数N(1<=N<=1000000),表示有N家服装公司。

第二行是N个数,表示N家服装公司各提供的衣服的数目ai(1<=ai<=1000000)。

Output

 

输出只有一行。输出"YES",表示有这么一个顺序,使得每天都穿不同服装公司的衣服,并完成各个服装公司的任务。如果没有完成任务输出"NO"。

Sample Input 1 

3
2 1 1 

Sample Output 1

YES

Hint

样例解释:公司1提供2件衣服,公司2提供1件衣服,公司3提供1件衣服。第一天Lucy穿公司1提供的衣服,第二天Lucy穿公司2提供的衣服,第三天Lucy穿公司1提供的衣服,第四天Lucy穿公司3提供的衣服。因此Lucy有一个顺序使得每天都穿不同服装公司的衣服,并完成各个服装公司的任务,输出YES。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath>

const int maxn=1e6+5;
typedef long long ll;
using namespace std;

ll a[maxn];

int main()
{
    
    int n;
    cin>>n;
    ll maxx=0;
    ll sum=0;
    for(int t=0;t<n;t++)
    {
        scanf("%lld",&a[t]);
        maxx=max(maxx,a[t]);
        sum+=a[t];
    }
    if(sum+1>=2*maxx)
    {
        printf("YES\n");
    }
    else
    {
        printf("NO\n");
    }
    
    
    return 0;
}
ac自动机fail树上dfs序建可持久化线段树(最长不递减序列)
 

Description

 

LY同学号称“青大第十线段树”,整日陷在线段树中不能自拔,以致于周一上体育课时还在思考着线段树问题。体育课时,同学们身高不一,毫无规律站在一排,这时老师让平时热爱“唱、跳rap 篮球“的篮球课体委LY同学帮忙整理下队伍,使得同学们按照身高由左至右身高非递减站成一排,平时热爱学习的LY同学这时想到一个问题:应该最少让多少同学移动自己位置,使得队伍由左至右身高非递减站成一排呢?

注:移动时每个人可以移动到其他任意人的前面或者后面

Input

 

单组数据输入

第一行一个整数n,代表最初n位同学站成一排

第二行n个整数,代表最初由左至右n位同学的身高h

1<=n<=5000

1<=h<=100000(有点高,请忽略)

Output

 

一个整数t,将队伍由左至右身高非递减排成一排的最少移动次数

Sample Input 1 

3
2 1 3

Sample Output 1

1

Sample Input 2 

4
2 2 2 4

Sample Output 2

0

Sample Input 3 

4
1 3 2 3

Sample Output 3

1

Hint

样例解释:

样例1:身高为1 的同学移动到身高为2的左边,此时各位同学身高1 2 3,由左至右身高递增,最少移动一次

样例2:不需移动

样例3:身高为2的同学可以移动到第一个身高为3的同学前面 或者 第一个身高为3的同学移动至身高为2的同学后面

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
 
using namespace std;
 
int main()
{
    int a[10005];
    int num[10005];
    int n;
    scanf("%d",&n);
    for(int t=0;t<n;t++)
    {
        scanf("%d",&a[t]);
        num[t]=1;
    }
    for(int t=0;t<n;t++)
    for(int j=0;j<t;j++)
    {
        if(a[t]>=a[j])
        num[t]=max(num[t],num[j]+1);
    }
    int maxn=-100;
    for(int t=0;t<n;t++)
    {
        maxn=max(num[t],maxn);
    }
    cout<<n-maxn<<endl;
    return 0;
}
J.点击此处签到(并查集)
 

Description

 

Z学长课间时总是会玩一些小游戏休闲片刻。这天,Z学长找到了这样的一个小游戏:开始时有n个石子(编号从1—n)从左至右依次排开,每个石子各自带有一个权值。有两种操作:

1.将编号为x的石子所在的堆和它那堆右面的堆合并为一堆,记作 “ M x ”,若该堆右侧无其它堆则忽略此次操作;

2.询问编号为x的石子所在的堆中权值最小的石子的权值为多少,记作“ Q x ”;

刚开始时由于所给石子数量过少,所以Z学长仍能应对自如,但越往后的关卡中所给的石子数越来越多,Z学长渐觉力不从心,因此特来求助于聪明的你,聪明的你能否帮学长度过难关?

Input

 

第1行输入n,q(n<=10^5,q<=10^5),表示石子的个数与询问的次数;

第2行给出n个值c[1]~c[n],c[i](c[i]<=10^5)表示编号为i的石子的权值;

其余q行,每行给出题中所描述的两种操作中的一种操作。

Output

 

对于每个“ Q x ” 询问操作,在单独的一行给出该询问的答案。

Sample Input 1 

6 4
1 1 2 3 5 8	
Q 1
M 3
M 3
Q 5

Sample Output 1

1
2
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath>

const int maxn=1e5+5;
typedef long long ll;
using namespace std;
int pre[maxn];
int a[maxn];
int pp[maxn];
int find(int x)
{
    if(x==pre[x])
    {
        return x;
    }
    else
    {
        return pre[x]=find(pre[x]);
    }
}
void Merge(int x,int y)
{
    int xx=find(x);
    int yy=find(y);
    if(xx!=yy)
    {
        if(a[xx]<a[yy])
        pre[yy]=xx;
        else
        {
            pre[xx]=yy;
        }
    }
}
int main()
{
    
    int n,q;
    cin>>n>>q;
    for(int t=1;t<=n;t++)
    {
        pre[t]=t;
    }
    for(int t=1;t<=n;t++)
    {
        scanf("%d",&a[t]);
    }
    char op[2];
    int x;
    for(int t=0;t<q;t++)
    {
        scanf("%s",op);
        if(op[0]=='M')
        {
            scanf("%d",&x);
            if(x!=n)
            {
                int cnt=x;
                while(cnt)
                {
                if(find(cnt)!=find(x))
                {
                Merge(x,cnt);
                break;
                }
                cnt++;
                if(cnt==n+1)
                {
                    break;
                }
                }
            }
        }
        else if(op[0]=='Q')
        {
            scanf("%d",&x);
            printf("%d\n",a[find(x)]);
        }
    }
}
KCGX爬泰山(签到)
 

Description

 

众所周知,泰山是个很高的山,泰山贯穿山东中部,泰安市境内,绵亘于泰安市、济南市之间,古称“岱山”、“岱宗”,春秋时改称“泰山”。泰山前邻孔子故里曲阜,背依泉城济南。泰山雄起于华北平原之东,凌驾于齐鲁平原之上,东临大海,西靠黄河,南有汶、泗、淮之水,东西长约200千米,南北宽约50千米,主脉,支脉,余脉涉及周边十余县,盘卧面积达426平方千米,主峰玉皇顶海拔1545米。

著名的诗人张宗昌曾写过:

远看泰山黑糊糊,上头细来下头粗。如把泰山倒过来,下头细来上头粗。

有一天,CGX同学决定去爬泰山,但是呢,小C同学从小体弱多病,爬泰山对她来说是一个相当困难的任务。为了帮助他爬泰山,伟大的ZXF学长准备帮助她。众所周知,人是铁饭是钢,一顿不吃饿得慌,所以ZXF学长为小C同学准备了很多能量豆。因为ZXF学长是个做好事不留名的红领巾,所以他决定把能量豆偷偷放在小C同学爬山的道路上。各个能量豆的规格不同,能补充的能量也不同,每一个台阶的高度不同,需要消耗的能量也不同。

在这个问题里,我们可以把泰山看成n个台阶,每一个台阶都有一个值,设第i个台阶的值为a[i]。如果a[i]>=0,就说明小C同学走到这个台阶时,她的能量值会增加a[i],如果a[i]<=0,就说明小C同学走到这个台阶时候,能量会减少a[i]的绝对值。为了让小C同学能够爬完整个泰山,ZXF学长在小C出发前最少应该给她能补充多少能量的能量豆呢(在没收到ZXF学长的能量豆之前,小C同学的能量值为0)?

注意哦,在爬山的过程中,要保证小C同学的能量一直都是大于等于零的,只有这样,她才可以爬完泰山。

Input

 

第一行一个正整数T(T<=100)代表测试样例的数目。

对于每个测试样例

第1行:1个数n,泰山的台阶数目。(1 <= n <= 50000)

第2行:n个数,表示这n个台阶对应的a[i]的值。(-1000000000 <= a[i] <= 1000000000)

Output

 

每个样例输出一行。

对每个样例来说:

输出1个数,对应小C同学完整爬完泰山需要的最少的初始能量。

Sample Input 1 

2
5
3 4 -8 -2 6
6
1 2 -3 6 -7 3

Sample Output 1

3
1
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath>

const int maxn=1e5+5;
typedef long long ll;
using namespace std;
ll a[maxn];
ll sum[maxn];
int main()
{
    int T;
    cin>>T;
    int n;
    while(T--)
    {
        scanf("%d",&n);
        memset(sum,0,sizeof(sum));
        for(int t=1;t<=n;t++)
        {
            scanf("%lld",&a[t]);
        }
        ll minn=0x3f3f3f3f3f;
        for(int t=1;t<=n;t++ )
        {
            sum[t]=sum[t-1]+a[t];
            minn=min(minn,sum[t]);
        }
        if(minn>=0)
        {
            printf("0\n");
        }
        else
        {
            printf("%lld\n",-minn);
        }
        
    }
    
    
    return 0;
}
L.你猜锋锋让不让你过(矩阵快速幂)
 

Description

 

已知

(题目中所提均为整数)

若 x<10        f(x) = x.

若 x>=10     f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10)

ai(0<=i<=9)  等于0或1

求 f(k)%m

Input

 

多组样例,k<=2e9 , m<=1e5

每组样例给定输入如下:

第一行两个整数 k  m

下面一行是数组a的10个数,从a0到a9

Output

 

每组样例输出一个整数代表f(k)%m

Sample Input 1 

10 9
1 1 1 1 1 0 0 0 0 0
20 18
0 0 0 0 0 1 1 1 1 1

Sample Output 1

8
10

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath>

const int maxn=1e5+5;
typedef long long ll;
using namespace std;
struct mat
{
  ll a[15][15]; 
};
ll k,m;
mat MUL(mat x,mat y)
{
    mat ans;
    memset(ans.a,0,sizeof(ans.a));
    for(int t=0;t<10;t++)
    {
        for(int j=0;j<10;j++)
        {
            for(int k=0;k<10;k++)
            {
                ans.a[t][j]=(ans.a[t][j]+x.a[t][k]*y.a[k][j])%m;
            }
        }
    }
    return ans;
}
mat res,ans;
ll ksm(ll n)
{

    while(n)
    {
        if(n&1)
        {
            ans=MUL(res,ans);
        }
        res=MUL(res,res);
        n>>=1;
    }
    return ans.a[0][0]%m;
}

int main()
{
    memset(ans.a,0,sizeof(ans.a));
    
    ll x;
    while(scanf("%lld%lld",&k,&m)!=EOF)
    {
        for(int t=0;t<10;t++)
        {  
        ans.a[t][0]=9-t;
          }
          memset(res.a,0,sizeof(res.a));
       for(int t=0;t<10;t++)
       {
           scanf("%lld",&x);
           res.a[0][t]=x;
       }
       for(int t=1;t<10;t++)
       {
           res.a[t][t-1]=1;
       }
       if(k<10)
       {
           printf("%lld\n",k%m);
       }
       else
       {
           printf("%lld\n",ksm(k-9));
       }
    }    
    return 0;
}
M.元气骑士(签到)
 

Description

 

当某些人上课快睡着的时候,需要玩把元气骑士来给自己提提神。。。

在“元气骑士”中有各种武器,每种武器有自己的 威力 ,射速 ,炫酷值。 我们都知道, 单位时间内武器能造成的伤害是 威力×射速, 首先我们会选择这个值最大的武器。但如果武器这个值相同时,我们会再考虑选择一个炫酷值最高的武器。现在给你n个武器,你能对这些武器的综合选取值排个序吗?

Input

 

单组样例输入,第一行是一个整数n(1<=n<=1e5)

之后n行,每行是一个武器的描述,包含 威力 W ,射速 S, 炫酷值 X

和不超过20个字符的字符串表示武器的名字。

Output

 

按 综合选取值 从大到小 的顺序输出武器的名字。每个名字单独在一行。(题目保证不会有 综合选取值相同的情况,也就是说不用再按字符串排序了)

Sample Input 1 

3
2 10 1 ak47
99 1 99 onepunch
1 20 2 m16

Sample Output 1

onepunch
m16
ak47
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
#include<cmath>

const int maxn=1e5+5;
typedef long long ll;
using namespace std;

struct node
{
    ll w,s;
    ll ans;
    ll x;
    char name[105];
}p[maxn];
bool cmp(node x,node y)
{
    if(x.ans!=y.ans)
    {
        return x.ans>y.ans;
    }
    else
    {
        return x.x>y.x;
    }
}
int main()
{
    
    int n;
    cin>>n;
    for(int t=0;t<n;t++)
    {
        scanf("%lld%lld%lld%s",&p[t].s,&p[t].w,&p[t].x,p[t].name);
        p[t].ans=p[t].s*p[t].w;
    }
    sort(p,p+n,cmp);
    for(int t=0;t<n;t++)
    {
        printf("%s\n",p[t].name);
    }
    return 0;
}


猜你喜欢

转载自www.cnblogs.com/Staceyacm/p/11104682.html