acm总结

       关于 acm总结报告。

学习 acm 一年了,

从一开始的小小白;

到现在的小白

学的东西还是要很多啊

思路还是要开阔啊;

本学期 学习的第一环节::贪心算法

这一章可谓 刚刚接触并没有什么难度;

只要想到排序 一个on算法 就解决了;

贪心最主要的问题 就是

怎么贪 关于贪法又很多

区间弹 个数贪 硬币贪心等等

下面 列举一个 硬币贪心的算法::

1005 天才的硬币

分类:贪心算法

 (43  (0 编辑 删除

"Yakexi, this is the best age!" Dong MW works hardand get high pay, he has many 1 Jiao and 5 Jiao banknotes(纸币), some day he went to a bank and changespart of his money into 1 Yuan, 5 Yuan, 10 Yuan.(1 Yuan = 10 Jiao)
"Thanks to the best age, I can buy many things!" Now Dong MW has abook to buy, it costs P Jiao. He wonders how many banknotes at least,and howmany banknotes at most he can use to buy this nice book. Dong MW is a bitstrange, he doesn't like to get the change, that is, he will give thebookseller exactly P Jiao.

 

 

Input

T(T<=100) in the first line, indicating the case number. Tlines with 6 integers each: P a1 a5 a10 a50 a100 ai means number of i-Jiaobanknotes. All integers are smaller than 1000000.

 

 

Output

Two integers A,B for each case, A is the fewest number ofbanknotes to buy the book exactly, and B is the largest number to buyexactly.If Dong MW can't buy the book with no change, output "-1 -1".

Sample Input

3

33 6 6 6 6 6

10 10 10 10 10 10

11 0 1 20 20 20

Sample Output

6 9

1 10

-1 -1

1.        cin>>t;;  

2.        while(t--)  

3.        {  

4.            sum=0;  

5.            cin>>p;            // 输入价钱数  

6.            r=p;  

7.            for(i=1;i<=5;i++)  

8.            {  

9.                cin>>a[i];  

10.              sum=sum+b[i]*a[i];    //判断价钱总数  

11.          }  

12.          for(i=5;i>0;i--)  

13.          {  

14.              if(r/b[i]<a[i])  

15.              {  

16.                  c[i]=r/b[i];  

17.                  r=r-b[i]*c[i];    //如果 总数/价钱数 < 这个价钱的个数 那么 从c【i]赋值;  r用来保留剩下的;  

18.    

19.              }  

20.              else  

21.              {  

22.                  c[i]=a[i];              //如果没办法减去 那么直接加上价钱的个数  

23.                  r=r-c[i]*b[i];  

24.              }  

25.          }  

26.          if(r!=0)  

27.          {  

28.              cout<<"-1"<<" "<<"-1"<<endl;               //如果r最后没有被剪完就说明!1!他跪了!!!!他不行了啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊我的逻辑!!  

29.    

30.          }else  

31.          {  

32.               k=sum-p;                       //这一步我十分佩服我自己相当的机智 一个机智的boy  如果要硬币最多 手里的不就最少吗!!一减不就行了吗!!!  

33.              for(i=5;i>0;i--)  

34.              {  

35.                  if(k/b[i]<a[i])  

36.                  {  

37.                      e[i]=k/b[i];  

38.                      k=k-b[i]*e[i];  

39.                  }  

40.                  else  

41.                  {  

42.                      e[i]=a[i];  

43.                      k=k-e[i]*b[i];  

44.                  }  

45.              }  

46.              if(k==0)  

47.              {  

48.                  cout<<c[1]+c[2]+c[3]+c[4]+c[5] ;cout<<" " ;cout<<a[1]+a[2]+a[3]+a[4]+a[5]-e[1]-e[2]-e[3]-e[4]-e[5]<<endl;  

这是一个 自己写的第一个题 很经典的贪心倒叙。。。

贪心 的最终大题 小鱼苗 采用 优先队列每次只钓最大地方的小鱼一个题。。

找不到原代码。。

贪心这章 总结很多

贪心是一种思想,他不仅仅是 按照某种规则排序,然后一重 for 循环,按照某种标准找出最优解 这个套路。包含的还应该有更多。

 

比如这套专题的第一个题,搬桌子的那个,“贪心”的做法应该是,按照搬桌子的终点从小到大排序,然后和安排活动一样,一重for判断是否可以插入,然后等到全部检索完毕后退出大循环。这两种方法从复杂度来看,区别的确不算大,两个都需要for循环很多次,但是,课件上的方法显然可以在较短的时间内调出代码,并且简单粗暴,方便理解。

 

贪心的思想是把大问题拆分为  同类  或者极其相似  的更加简单求局部最优解的问题,然后最终求下来就可能是整体的最优解。 当时费老师也说过,贪心算法并不适合对所有的问题求最优解,有的时候最后求出来的不一定是符合题目的最优解。就好像1014 这个小船的题吧。如果贪心最短时间的话,就很难保证最短次数。像这种同时有两个标准的题目,可能用贪心就不是那么简单,如果仔细考虑整个大问题的话,是可以从中分拆出简单的思路的。

 

 

寒假的时候做了一套半题目,第一套是stl简单应用。剩下的是 模拟题目训练。给我的感觉是,那些模拟题目让我收获很大,在这套题目里面,电梯,小船,赛马(这个不能完全算),甚至是哈夫曼数,都可以当成模拟题目来写。而且,好多题目是可以用动态规划的知识来解决的。相比来说,贪心似乎是个比较模糊的概念,不像动态规划那么明确。

好了,扯会正题,什么是贪心??

 

是否可以当做拆分来看?

 

现在给我的感觉是: 可以。

 

 

这个总结是窦小雨同学写的!!毕竟队友哈哈哈!!天涯何处匿知音

第二章

搜索

搜索 真的是 只有 几个词让我内心gedong 一下

不是 wa

不是 tml

而是 m e

爆内存 爆内存 爆内存

各种剪纸 二进制优化 

到现在 bfs 我只提供思路从来 不感写 上次被爆内存 爆哭了;

记得那个 连连看

简直了

简直了

简直了

需要判断拐三次弯就return

简直了

 

就是因为这个 爆了n次内存

从此 bfs dfs 就是一片阴影

Dfs

比bfs 还要难一些需要考虑到 还原现场的问题 ,这个写就需要很多的想法;

还有搜索的分之

记忆化搜索 一旦搜索到以前搜索过的便用以前搜索过的退出;

记忆化搜索的题没有a多少个 就a了一个;;;;

关于 搜索的总结

Dfs 注意还原现场 已经 路径出口

Bfs 注意剪纸 爆内存 问题

二分 记住1e-8 wa了改改精确到度

三分 凸函数必备 与二分不同这个是单调递增在递减或者相反,

第三章 ! dp

动态规划。。。

刚刚接触 动态规划的题

这都啥 这是啥 怎么这么做为什么啊 ,,,,,,后来自己看了许多大牛的博客

才发现 动态规划的最主要的思想 就是 当前位置由他前一个位置绝定 或者

改变了这个位置 那么 其他位置也都会受到影响

Dfs 精彩剪纸

 

void ZeroOnePack(int cost,int weight)//cost 为费用, weight 为价值 
{
    for(int i=v;i>=cost;i--)
       if(f[i-cost]+weight>f[i]) f[i]=f[i-cost]+weight;
}    
void CompletePack(int cost,int weight)
{
    for(int i=cost;i<=v;i++)
        if(f[i-cost]+weight>f[i]) f[i]=f[i-cost]+weight;
}         
void MultiplePack(int cost ,int weight,int amount)
{
    if(cost*amount>=v) CompletePack(cost,weight);
    else
    {
        for(int k=1;k<amount;)
        {
            ZeroOnePack(k*cost,k*weight);
            amount-=k;
            k<<=1;
        }    
        ZeroOnePack(amount*cost,amount*weight);
    }    
}    

这是背包 的几个主要思路

分别是 01 多重完全

还有许多

比如   记忆化dp    区间dp  概率 dp

这三个 没接触过主要是 窦和雨在搞

下面 接触了很多数学的知识;;;

各种积分 二重积分三重积分   还有欧拉函数莫比乌斯繁衍 斐波那契数列改编找规律

还有又拉脱丝 筛选法

1.    bool pao(int x)  

2.    {  

3.        int i;  

4.        if(x==2)  

5.        return 1;  

6.        for(i=2;i<sqrt(x)+1;i++)  

7.        {  

8.            if(x%i==0)  

9.            return 0;  

10.      }  

11.      return 1;  

12.  }  

13.  int prim[1000005]={0};  

14.  void init()  

15.  {  

16.      int k;  

17.      prim[1]=0; k=1;  

18.      for(int i=2;i<1000000;i++)  

19.      if(pao(i))  

20.      {  

21.        for(int j=i; j<1000000; j+=i)  

22.          prim[j]=k;  

23.          k++;  

24.      }  

25.  }  

数学题主要是我搞 。。所以要很透彻!!。

关于 数学问题 主要是 搜索 。。各种on算法 比如对于 素数的函数不用函数

而是遍历 这种on的遍历可以减轻算法

还有 高斯消元法    矩阵快速米   图变形等等。

类似于递归调用的性质。

然后 省赛了。。

省赛了。

省赛了

 “题目说的是输出编号。输出编号!!”
“好,改好了。”
“交。”
最后两分钟再一次提交了代码。
no  -  wrong。
奋战到最后一秒,这次三个人都没有放弃,最后二开,虽然两道题都没出来,但是坚持到最后一秒,精神可嘉。
省赛的结果是五道题,铜牌。作为一只大一代表队,心里感觉还是挺不错的,算是正常发挥吧。不过因为最后两个多小时搞了图论的 C  题,没能有时间看博弈,挺遗憾的。
比赛两个半小时,我们出了五个题。
比赛结束,我们依旧是五题。
虽然一点进展都没有,但是我们却有着谜一般的从容。
大家心态都挺好,C 题理清思路后,敲了一遍。超时。把floyd去掉之后变成了wrong。甚至最后十五分钟时候提交还wrong。我们依旧没有放弃,再次看了一边题目。编号!它让输出的是编号!!不是最短路径!修改以后提交,再次wrong。最后三分钟再次找到一个bug。修改提交。依然wrong。好了,刷了一下榜,收拾东西,比赛结束。
封榜前我们是五个题,大约铜牌。最后结果出来,真的是铜牌。
虽然比赛前我们吵了一架,但是并不影响我们三个的发挥。泡泡天生着急,嫌弃我们比赛还有半个小时就开始了,还在找厕所。很不能理解他的想法。
发题不到一分钟,发现一个大水题,k 反转单词输出,然后ww 去敲,按照比赛开始前的策略,我去读A题,果然也是个大水题,在纸上写出来扔给ww ,然后看了炉石传说的题目,我们连题目意思都没看,直接读样例,老瞎眼,蓝腮鱼,鱼人领军,寒光智者。四个小鱼人,问这个回合是否可以斩杀对面。我们学校的另一个队没玩过这么游戏,读了两个小时,赛后还和我们交流,说我们当时查了第一个小鱼人,他的效果是什么啊?我们查了那个单词,呐喊:丢两张牌?没看懂啊。。。
我们三个人笑翻了,呐喊,hhh。。。战吼被他们叫做呐喊。。。。
题目出了点小意外,wa 了一次,写的太快了。。。不过并不怎么影响最后成绩。
然后现在刚过去一个小时。
B题,泡泡打了一下斐波那契数列,发现f 【50】 就已经大的不行不行的了,这么少的数据,怎么高兴怎么来,然后我们去读了E 。不得不吐槽,读题简直是我们三个英语接近挂科的人的永远的痛。E读了三遍。。。
读了二十多分钟。。。。读懂了之后倒是挺简单,分分钟。这个时候泡泡B也已经写出来了。泡泡提交,re。
检查是数组开小了,扩大一下,AC,E题一起AC。两个小时我们出了5个题了已经。
然后我们去个厕所,商量了一下接下来的分配。泡泡要去写F,喂猴子的那个。我看了看博弈,看了看图论,决定还是和ww先写图论吧,因为他们两个对图论还不怎么熟悉,只好我来写,一写就是三个小时。。。先是 超时,改了scanf还是超时。去掉floyd,用队列是否判断连通,结果wa。没办法,我们重新读了题,发现样例有很大的问题,我和ww对样例有歧义。然后用我们两个不同的理解都试了下,依然wa。最后十五分钟读出了正确题意。。。。最后修改了一次,还是没有过。我还是不理解为什么会wa。。。学长们说用最简单的最短路就可以解。唉,也没有什么后悔的,我觉得我们表现挺好的了。
赛后看了看博弈的那个题。
果然被我找到了规律。。。啧啧。
如果 n 是 奇数,直接输出0.
如果是偶数,并且是 2 的某个次方,输出0.
否则统计二进制中 1 的个数。
两个 1 答案为1
三个 1 答案为4
四个 1 答案为13
五个 1 答案为40
六个 1 答案为121
可以把答案单独开个数组  F[N ] = F [ N -1 ] * 3 +1;
然后这就是答案。。。。
哈哈,都说了,自己是博弈小王子。
要是图论再熟练一些,图论+这个博弈+大模拟。我们也完全可以出8 个题。
没关系啦,我们刚大一,这个水平已经很厉害啦,嘿嘿。下年拿金牌喽。
我觉得下年带个英语好到爆的小学弟/妹,我们三个随便那个人,一个人打一个队完全没问题,跟闹着玩似的。
还有要吐槽的是今年的热身赛第一题。。。问济南除了趵突泉有几个泉。答案范围1 -100
我们错了184次。哈哈。简直了。。
还有要说的是我们住的地方,自带小吊床。啧啧。给82分。
唯一需要表扬的是我们的吉祥物小兔子。要是没有他给我们加buff,我们状态不会这么好的。
热身赛结束后我们前面的队还嘲讽我们:你们的气球呢?怎么只有一个小兔子那?
orz。。。
╭(╯^╰)╮
安啦。这次我们既没有出现机器时间冲突,也没有什么发挥失常。唯一的缺陷是英语太差,读题比做题时间长得多。。。就写到这里吧。
2016.6.5.山师-Acm山东省赛。

没错我就是泡泡。

我发现省赛的知识很少很少

回来学了图论。

关于 最小生成树 冰茶集  Floyd 万能的克鲁斯大二 算法 以及n放算法

优先队列 等等。

这些图论题都说明了

图论 不好做 不好做 不好做

图论高难度 高难度 高难度 。

图论的题 真的是一道比一道奇葩 

首先对数据的处理。。

然后对图的改进

好了

总结就这么多

总之 自己还要多背单词 多学英语 多努力 有时候真的怕自己赶不上别人 。。

压力好大啊。。。。。。。。。。。

!!努力努力努力。。。

既然目标是地平线 那么留给世界的只能是背影

既然选择了缘分 便只顾风雨兼程 。

加油 姜赫!!;

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值