Problem 1 护花(flower.cpp/c/pas)

【题目描述】

约翰留下他的N(N<=100000)只奶牛上山采木.他离开的时候,她们像往常一样悠闲地在草场里吃草.可是,当他回来的时候,他看到了一幕惨剧:牛们正躲在他的花园里,啃食着他心爱的美丽花朵!为了使接下来花朵的损失最小,约翰赶紧采取行动,把牛们送回牛棚. 牛们从1到N编号.第i只牛所在的位置距离牛棚Ti(1≤Ti≤2000000)分钟的路程,而在约翰开始送她回牛棚之前,她每分钟会啃食Di(1≤Di≤100)朵鲜花.无论多么努力,约翰一次只能送一只牛回棚.而运送第第i只牛事实上需要2Ti分钟,因为来回都需要时间.    写一个程序来决定约翰运送奶牛的顺序,使最终被吞食的花朵数量最小.

【输入格式】

第1行输入N,之后N行每行输入两个整数Ti和Di

【输出格式】

一个整数,表示最小数量的花朵被吞食

【样例输入】

6

3 1

2 5

2 3

3 2

4 1

1 6

【样例输出】

86

【样例解释】

约翰用6,2,3,4,1,5的顺序来运送他的奶牛

  1. /*
  2. 看到题目比较容易想到要贪心
  3. 对于每个对象有两个元素,一个是时间,一个是消费
  4. 由题意可知,我们希望先拿走时间短而消费多的
  5. 为了同时满足两个元素,我们把它合并成一个
  6. 按照消费/时间从大到小排序,然后计算出来,居然就A了
  7. (老师说贪心考验人的勇气)
  8. */
  9. #include<iostream>
  10. #include<cstdio>
  11. #include<algorithm>
  12. using namespace std;
  13. int n;
  14. long long ans,sum;
  15. struct node{
  16. long long d,t;
  17. double dt;
  18. }a[];
  19. int cmp(node x,node y){
  20. if(x.dt!=y.dt)return x.dt>y.dt;
  21. if(x.d!=y.d)return x.d>y.d;
  22. return x.t<y.t;
  23. }
  24. int main(){
  25. freopen("flower.in","r",stdin);
  26. freopen("flower.out","w",stdout);
  27. scanf("%d",&n);
  28. for(int i=;i<=n;i++){
  29. scanf("%d%d",&a[i].t,&a[i].d);
  30. a[i].dt=double(a[i].d)/double(a[i].t);
  31. sum+=a[i].d;
  32. }
  33. sort(a+,a+n+,cmp);
  34. for(int i=;i<=n;i++){
  35. sum-=a[i].d;
  36. ans+=a[i].t*sum*;
  37. }
  38. printf("%I64d",ans);
  39. }

Problem 2 修剪草坪(mowlawn.cpp/c/pas)

【题目描述】

在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪。现在,
新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠。
然而,FJ的草坪非常脏乱,因此,FJ只能够让他的奶牛来完成这项工作。FJ有N
(1 <= N <= 100,000)只排成一排的奶牛,编号为1...N。每只奶牛的效率是不同的,
奶牛i的效率为E_i(0 <= E_i <= 1,000,000,000)。
靠近的奶牛们很熟悉,因此,如果FJ安排超过K(1<=K<=N)只连续的奶牛,那么,这些奶牛就会罢工
去开派对:)。因此,现在FJ需要你的帮助,计算FJ可以得到的最大效率,并且该方案中
没有连续的超过K只奶牛。

【输入格式】
* 第一行:空格隔开的两个整数N和K
* 第二到N+1行:第i+1行有一个整数E_i

【输出格式】
* 第一行:一个值,表示FJ可以得到的最大的效率值。

【样例输入】

5 2

1

2

3

4

5

输入解释:

FJ有5只奶牛,他们的效率为1,2,3,4,5。他们希望选取效率总和最大的奶牛,但是

他不能选取超过2只连续的奶牛

【样例输出】

12

FJ可以选择出了第三只以外的其他奶牛,总的效率为1+2+4+5=12。

  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4. int n,m,a[];
  5. long long ans;
  6. void dfs(int pos,long long sum,int w){
  7. if(pos==n+){
  8. ans=max(ans,sum);
  9. return;
  10. }
  11. if(w==m){
  12. dfs(pos+,sum,);//下一个牛不能选
  13. }
  14. else{
  15. dfs(pos+,sum+a[pos],w+);//下一个牛选
  16. dfs(pos+,sum,);//下一个牛不选
  17. }
  18. }
  19. int main(){
  20. freopen("mowlawn.in","r",stdin);
  21. freopen("mowlawn.out","w",stdout);
  22. //freopen("Cola.txt","r",stdin);
  23. scanf("%d%d",&n,&m);
  24. for(int i=;i<=n;i++)scanf("%d",&a[i]);
  25. dfs(,,);
  26. printf("%d",ans);
  27. fclose(stdin);
  28. fclose(stdout);
  29. return ;
  30. }

30 分搜索

  1. /*
  2. 考虑动归,在第i点时,在i-k到i中肯定有一个点j不能选择,即:j为断点。
  3. 所以f[i]=max(f[i],f[j-1]+a[j+1]+a[j+2]……a[i])(i-k<=j<=i)
  4. 所以维护前缀和,然后方程就变成了
  5. f[i]=max(f[i],f[j-1]+sum[i]-sum[j]) (i-k<=j<=i)
  6. 变形一下变成:f[i]=max(f[i],f[j-1]-sum[j])+sum[i] (i-k<=j<=i)
  7. 发现max里面的值只与j有关,所以可以用单调队列优化转移。
  8. */
  9. #include<iostream>
  10. #include<cstdio>
  11. using namespace std;
  12. long long n,m,a[],sum[],f[];
  13. long long d[];
  14. int q[],head=,tail=;
  15. long long que(int i){//让返回值尽量的大,队列单调减,使首元素恒最大
  16. d[i]=f[i-]-sum[i];
  17. while(head<=tail&&d[q[tail]]<d[i])tail--;
  18. q[++tail]=i;
  19. while(head<=tail&&q[head]<i-m)head++;
  20. return d[q[head]];
  21. }
  22. int main(){
  23. freopen("mowlawn.in","r",stdin);
  24. freopen("mowlawn.out","w",stdout);
  25. scanf("%lld%lld",&n,&m);
  26. for(int i=;i<=n;i++)scanf("%lld",&a[i]),sum[i]=sum[i-]+a[i];
  27. for(int i=;i<=n;i++)f[i]=que(i)+sum[i];
  28. printf("%I64d",f[n]);
  29. }

100分 单调队列优化dp

Problem 3 虫洞(wormhole.cpp/c/pas)

【题目描述】

John在他的农场中闲逛时发现了许多虫洞。虫洞可以看作一条十分奇特的有向边,并可以使你返回到过去的一个时刻(相对你进入虫洞之前)。John的每个农场有M条小路(无向边)连接着N (从1..N标号)块地,并有W个虫洞(有向边)。其中1<=N<=500,1<=M<=2500,1<=W<=200。 现在John想借助这些虫洞来回到过去(出发时刻之前),请你告诉他能办到吗。 John将向你提供F(1<=F<=5)个农场的地图。没有小路会耗费你超过10000秒的时间,当然也没有虫洞回帮你回到超过10000秒以前。

【输入格式】

* Line 1: 一个整数 F, 表示农场个数。

* Line 1 of each farm: 三个整数 N, M, W。

* Lines 2..M+1 of each farm: 三个数(S, E, T)。表示在标号为S的地与标号为E的地中间有一条用时T秒的小路。

* Lines M+2..M+W+1 of each farm: 三个数(S, E, T)。表示在标号为S的地与标号为E的地中间有一条可以使John到达T秒前的虫洞。

【输出格式】

* Lines 1..F: 如果John能在这个农场实现他的目标,输出"YES",否则输出"NO"。

【样例输入】

2

3 3 1

1 2 2

1 3 4

2 3 1

3 1 3

3 2 1

1 2 3

2 3 4

3 1 8

【样例输出】

NO

YES

  1. /*
  2. spfa判负环
  3. */
  4. #include<iostream>
  5. #include<cstdio>
  6. #include<cstring>
  7. #include<queue>
  8. using namespace std;
  9. int t,n,m,w,head[*],num,dis[],step[];
  10. struct node{
  11. int to,pre,v;
  12. }e[*];
  13. bool vis[];
  14. void Insert(int from,int to,int v){
  15. e[++num].to=to;
  16. e[num].v=v;
  17. e[num].pre=head[from];
  18. head[from]=num;
  19. }
  20. int spfa(){
  21. queue<int>q;
  22. q.push();step[]++;
  23. dis[]=;
  24. vis[]=;
  25. while(!q.empty()){
  26. int point=q.front();q.pop();vis[point]=;
  27. for(int i=head[point];i;i=e[i].pre){
  28. int to=e[i].to;
  29. if(dis[to]>dis[point]+e[i].v){
  30. dis[to]=dis[point]+e[i].v;
  31. if(!vis[to]){
  32. q.push(to);
  33. step[to]++;
  34. vis[to]=;
  35. if(step[to]>n)return ;
  36. }
  37. }
  38. }
  39. }
  40. return ;
  41. }
  42. int main(){
  43. freopen("wormhole.in","r",stdin);
  44. freopen("wormhole.out","w",stdout);
  45. scanf("%d",&t);
  46. while(t--){
  47. memset(e,,sizeof(e));
  48. memset(head,,sizeof(head));
  49. memset(step,,sizeof(step));
  50. memset(dis,/,sizeof(dis));
  51. memset(vis,,sizeof(vis));
  52. scanf("%d%d%d",&n,&m,&w);
  53. int x,y,z;
  54. for(int i=;i<=m;i++){
  55. scanf("%d%d%d",&x,&y,&z);
  56. Insert(x,y,z);
  57. Insert(y,x,z);
  58. }
  59. for(int i=;i<=w;i++){
  60. scanf("%d%d%d",&x,&y,&z);
  61. Insert(x,y,-z);
  62. }
  63. if(spfa())printf("YES\n");
  64. else printf("NO\n");
  65. }
  66. }

Problem 4 麻将(data.cpp/c/pas)

【题目描述】

众所周知,麻将是我们国家的国粹。这段时间,小D也迷上了麻将这个老少皆宜的游戏。
小D觉得这些不同规则的麻将太麻烦了,所以他集合了很多种麻将规则创造出了一套D麻将。下面是D麻将的几个特点:
D麻将中有三种花色,万(w)索(s)筒(t),每个花色下有9张牌,每张牌有4个。
D麻将中没有杠牌,只有顺子和刻子。顺子的含义是相同花色的三张连在一起的牌型(比如说2w3w4w);刻子的含义是三张花色和数字都相同的牌型(比如说2s2s2s)。
D麻将的胡牌的时候手上往往有14张牌,14张牌凑成了四个顺子或刻子和两张一样的牌做雀头就可以胡牌了。
D麻将胡牌的时候有很多种不同的牌型,不同的牌型会有不一样的番数。你的一种牌型可能满足了多个加番牌型,满足多个的情况下就把所有满足的牌型的番数全部加起来计算。
D麻将中有如下牌型可以加番:
平和(一番):4个顺子组成;
一杯口(一番):同花色同数值的顺子两组;
混全带幺九(一番):全部的顺子,刻子中都含有数字1或9;
三色同顺(一番):三种花色同数值的顺子各一组;
一气贯通(两番):由同花色一至九组成顺子;
对对和(两番):四组刻子;

断幺九(两番):胡牌的时候手上只有2-8的数字组成的牌型;

一色三顺(三番):同花色同数值顺子三组;
两杯口(三番):由两组不同的一杯口组成;
三色同刻(四番):三种花色同数值的刻子各一组;

清老头(五番):全部由1或9的刻子和雀头组成;
清一色(七番):全部由同一种花色的顺子,刻子及雀头组成;
比如说一个牌型为1s2s3s4s5s6s7s8s9s1s2s3s9s9s的牌,它满足了平和、一杯口、一气贯通、清一色四个牌型,所以它的番数是10番。
小D希望为D麻将做一个程序来帮忙判断这个牌型的番数是多少。

【输入格式】

输入第一行一个测试组数T。
接下来T行每行一个字符串s,表示需要判断番数的牌型。length(s)=28

【输出格式】

输出有T行每行一个整数,表示判断牌型的番数为多少。

【样例输入】

1
1s2s3s4s5s6s7s8s9s1s2s3s9s9s

【样例输出】

10

2014-5-24 NOIP模拟赛的更多相关文章

  1. 【2019.7.24 NOIP模拟赛 T1】道路建设(road)(水题)

    原题与此题 原题是一道神仙不可做题,两者区别在于,原题不能有重边和自环. 然而,这题可以有重边... 于是这题就变成了一道大水题. 此题的解法 考虑如何构造. 对于\(n\le10^4\)的情况: 对 ...

  2. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  3. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  4. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  5. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  6. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  7. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  8. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  9. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  10. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

随机推荐

  1. leetcode dfs Flatten Binary Tree to Linked List

    Flatten Binary Tree to Linked List Total Accepted: 25034 Total Submissions: 88947My Submissions Give ...

  2. UIAlertController Changes in iOS 8

    本文转载至 http://www.th7.cn/Program/IOS/201409/276000.shtml   As part of the theme of iOS 8 to make inte ...

  3. pdf文件的作成

    Dim Report As New crProgressList Report.PrintOptions.PaperSize = CrystalDecisions.Shared.PaperSize.P ...

  4. backbone测试代码

    一.入门测试 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  5. HDU4850 Wow! Such String! —— 字符串构造

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4850 代码如下: #include <iostream> #include <cst ...

  6. IPFS 到底是怎么工作的?

    简介 我们知道,一个存储服务,最基本的功能就是存和取.IPFS 中提供了这两种语义,那就是 add 和 get 操作. 在 IPFS 系统中执行 add 操作,就是执行了一次存操作,放在网络的概念里, ...

  7. smarty模板引擎基础(二)

    smarty模板引擎所需文件夹共可分为存放页面缓存的(cache).存放配置文件的(configs).存放模板扩充插件的(plugins).存放模板文件的(templates).存放编译后的模板文件的 ...

  8. 英语发音规则---gh

    英语发音规则---gh 一.总结 一句话总结:gh字母组合的读音在中学英语课本中归纳起来主要有"发音"和"不发音"两种情况. gh字词首是发/g/,因为需要开头 ...

  9. C# 多线程控制 通讯 和切换

    一.多线程的概念  Windows是一个多任务的系统,如果你使用的是windows 2000及其以上版本,你可以通过任务管理器查看当前系统运行的程序和进程.什么是进程呢?当一个程序开始运行时,它就是一 ...

  10. css控制字符长度超出变成点点点显示(单行,多行)

    css控制字符长度超出变成点点点显示 单行: width 必不可少 div{ width: 55%; text-overflow: ellipsis; overflow: hidden; white- ...