个人感受:这套题也依旧在划水,和wqh在一起,然后也没怎么好好想,第一题开始时打了个思维很好的方法,但是事完全错误的;然后就开始第二题,然后第二题枚举20分,然后看答案多了25分,就拿了

45分;第三题这题就是n^2枚举每个人当队长,然后暴力裸拿40分。

问题 A: 单词接龙1

时间限制: 5 Sec  内存限制: 256 MB  Special Judge
提交: 465  解决: 99
[提交][状态][讨论版]

题目描述

Bsny从字典挑出N个单词,并设计了接龙游戏,只要一个单词的最后两个字母和另一个单词的前两个字母相同,那么这两个单词就可以有序的连接起来。

Bsny想要知道在所给的所有单词中能否按照上述方式接龙组成一个单词环(可能是多个),若能,求所有环的环中单词平均长度最大值。

输入

第一行一个整数N,表示单词数量。

接下来N行,每行一个字符串,仅包含小写字母。

输出

若能组成单词环,输出环中单词的最大平均长度,结果保留2位小数;否则输出"No solution."(不包括双引号)。精度误差在0.01都算正确。

样例输入

3
intercommunicational
alkylbenzenesulfonate
tetraiodophenolphthalein

样例输出

21.67

提示

20%的数据:n≤20

70% 的数据:n≤1000

100% 的数据:n≤100000,每个单词长度不超过1000 输入数据比较大,C/C++ 的同学用scanf 输入。

原代码就不上了,直接上订正好后的代码。这题思维也是比较巧的,每次输入一个字符串就是两个点之间连一条有向边,然后二分枚举+spfa判正环即可

 #include<cstdio>
 #include<cstring>
 #include<string>
 #include<iostream>
 #include<algorithm>
 #include<cmath>
 #include<map>
 using namespace std;

 ;
 *+],next[],rea[],val[];
 *+];
 map<int,int>mm;
 ];
 *+],p[*+],ci[*+];
 *+];

 void add(int u,int v,int zhi)
 {
     cnt++;
     next[cnt]=head[u];
     head[u]=cnt;
     rea[cnt]=v;
     val[cnt]=zhi;
 }
 void make()
 {
     int len=strlen(s);
     int x,y;
     x=(s[]-+s[]-'a';
     y=(s[len-]-+s[len-]-'a';
     if (!mm[x]) mm[x]=++num;
     if (!mm[y]) mm[y]=++num;
     add(mm[x],mm[y],len);
 }
 bool spfa(int u,double ko)
 {
     ,tl=;
     p[tl]=u;
     ins[u]=,dis[u]=;
     while (hd!=tl)
     {
         hd=hd%num+;
         ;i=next[i])
         {
             int v=rea[i];
             double cost=val[i]-ko;
             flag[v]=;
             if (dis[p[hd]]+cost>dis[v])
             {
                 )
                 {
                     ins[v]=;
                     tl=tl%num+;
                     p[tl]=v;
                 }
                 ci[v]++;
                 ;
                 dis[v]=dis[p[hd]]+cost;
             }
         }
         ins[p[hd]]=;
     }
     ;
 }
 bool pan(double ko)
 {
     memset(flag,,sizeof(flag));
     ;i<=num;i++)
         dis[i]=-;//重要
     memset(ins,,,sizeof(ci));
     ;i<=num;i++) ) ;
     ;
 }
 int main()
 {
     mm.clear();
     cnt=;
     memset(head,-,sizeof(head));
     scanf("%d",&n);
     ;i<=n;i++)
     {
         scanf("%s",s);
         make();
     }
     double l=0.0,r=1000.0;
     while ((r-l)>=0.000001)
     {
         ;
         if (pan(mid)) l=mid;
         else r=mid;
     }
     printf("%.2lf\n",l);
 }

问题 B: 帮助Bsny

时间限制: 1 Sec  内存限制: 256 MB
提交: 298  解决: 58
[提交][状态][讨论版]

题目描述

Bsny的书架乱成一团了,帮他一下吧!

他的书架上一共有n本书,我们定义混乱值是连续相同高度书本的段数。例如,如果书的高度是30,30,31,31,32,那么混乱值为3;30,32,32,31的混乱值也为3。但是31,32,31,32,31的混乱值为5,这实在是太乱了。

Bsny想尽可能减少混乱值,但他有点累了,所以他决定最多取出k本书,再随意将它们放回到书架上。你能帮助他吗?

输入

第一行两个整数n,k,分别表示书的数目和可以取出的书本数目。

接下来一行n个整数表示每本书的高度。

输出

仅一行一个整数,表示能够得到的最小混乱值。

样例输入

5 1
25 26 25 26 25

样例输出

3

提示

20% 的数据:1≤n≤20 ,k=1。

40% 的数据:书的高度不是25就是32,高度种类最多2种。

100% 的数据:1≤k≤n≤100 ,注意所有书本高度在[25,32]。

看到了书的高度只有8种,就应该联想到了状压,考试时什么也没想到,真是惭愧。考后zyh分析了一节课吧大约,我也大致听懂了,以dfs先列出该记的状态,然后以O(1)的时间转移即可。

然后发现需要四种状态,f[i][j][k][sta] 分别表示处理了前i本书,抽出了j本,剩下最后一本高度为k,剩下书的状态为sta,这个非常重要,因为取出的书取光了放进来混乱度才要+1,然后以

f[0][0][0][0]=1开始转移。附上订正后的代码。

 #include<cstdio>
 #include<iostream>
 #include<cmath>
 #include<algorithm>
 #include<cstring>
 using namespace std;

 ;
 ],b[];
 ][][][(<<)+];

 int make(int zhi)
 {
     ,x=,i=;
     while (x<zhi)
     {
         x=<<i;
         ) res++;
         i++;
     }
     return res;
 }
 int main()
 {
     memset(f,,sizeof(f));
     ][][][];
     scanf("%d%d",&n,&num);
     ;i<=n;i++)
     {
         scanf("%d",&a[i]);
         a[i]-=;
         fzy=fzy|(<<(a[i]-));
     }
     ;i<=fzy;i++)
         b[i]=make(i^fzy);
     f[][][][]=;
     ;i<=n;i++)
     {
         ;j<=num;j++)
             ;k<=;k++)
                 ;sta<=fzy;sta++)
                     if (f[i][j][k][sta]!=INF)
                     {
                         ]!=k) f[i+][j][a[i+]][sta|(<<(a[i+]-))]=min(f[i+][j][a[i+]][sta|(<<(a[i+]-))],f[i][j][k][sta]+);
                                        ][j][a[i+]][sta|(<<(a[i+]-))]=min(f[i+][j][a[i+]][sta|(<<(a[i+]-))],f[i][j][k][sta]);
                         ][j+][k][sta]=min(f[i+][j+][k][sta],f[i][j][k][sta]);
                     }
     }

     ans=1e9;
     ;i<=num;i++)
         ;j<=;j++)
             ;k<=fzy;k++)
             {
                 ans=min(ans,f[n][i][j][k]+b[k]);
                 //cout<<n<<" "<<i<<" "<<j<<" "<<k<<" "<<f[n][i][j][k]<<" "<<ans<<endl;
             }
     printf("%d\n",ans);
 }

问题 C: 分组

时间限制: 1 Sec  内存限制: 256 MB
提交: 155  解决:
36
[提交][状态][讨论版]

题目描述

Bsny所在的精灵社区有n个居民,每个居民有一定的地位和年龄,ri表示第i个人的地位,ai表示第i个人的年龄。

最近社区里要举行活动,要求几个人分成一个小组,小组中必须要有一个队长,要成为队长有这样的条件:

1、队长在小组中的地位应该是最高的(可以并列第一);

2、小组中其他成员的年龄和队长的年龄差距不能超过K。

有些人想和自己亲密的人组在同一个小组,同时希望所在的小组人越多越好。比如x和y想在同一个小组,同时希望它们所在的小组人越多越好,当然,它们也必须选一个符合上述要求的队长,那么问你,要同时包含x和y的小组,最多可以组多少人?

输入

第一行两个整数n和K;

接下来一行输入n个整数:r1, r2, …,
rn

接下来一行输入n个整数:a1, a2, …,
an

接下来输入Q表示有Q个询问;

接下来Q行每行输入x, y,表示询问:当x和y组在同一个小组,它们小组最多可以有多少人(x和y也有可能被选为队长,只要它们符合条件)。

输出

对于每个询问,输出相应的答案,每个答案占一行。

当x和y无法在同一组时,输出-1(比如x的年龄是1, y的年龄是100,K=1,无论谁当队长,x和y两者中,总会有人跟队长的年龄差距超过K,那么输出-1)。

样例输入

5 1
1 5 4 1 2
4 4 3 2 2
4
5 3
2 3
2 5
4 1

样例输出

4
3
-1
4

提示

20% 的数据:2≤n≤100 0≤ k≤100 ,1≤ ri, ai ≤100 ,1≤ q≤ 100;

40% 的数据:2≤ n≤1000,0≤ k≤ 1000 ,1≤ ri, ai ≤ 1000,1≤ q≤ 1000 ;

60%的数据:2≤ n≤ 104,0≤ k≤ 109,1≤ ri, ai ≤ 109,  1≤ q≤ 104 ;

100% 的数据:2≤ n≤ 105 ,0≤ k≤ 109,1≤ ri, ai ≤ 109 ,1≤ q≤ 105 ,1≤ x, y≤ n, x≠y

就不附代码了,订正后再说吧。

NOIP2017SummerTraining0706的更多相关文章

随机推荐

  1. Informatica学习:1、安装介质的获取与安装

    本文目标: 为方便学习Informatica工具,在个人电脑上部署Informatica Powercenter. 所用系统:win7 64位. Informatica安装包括服务器端.客户端安装两个 ...

  2. 改造百度ueditor字体为rem及相关体会

    提到富文本,可能大家都用到过百度的ueditor,作为一个重量级的插件,总结起来一句话,功能很强大,使用很费心.不知道是不是太久没有维护了,ueditor的文档可读性还真是差也可能是悟性不够吧.本文也 ...

  3. cobbler部署安装CentOS6.8

    Linux运维:cobbler : 矮哥linux运维群:93324526 学习cobbler的话,必须先搞懂kickstart,原理不是,不懂如何排错. kickstart部署请点击这里 1. Co ...

  4. ★RFC标准库_目录链接

    RFC(Request For Comments)是一个国际标准化的数据库,记录了从计算机到互联网的海量标准协议.它是一个免费公开的IT标准文件分享平台,其内容也在不断增长,与时俱进.它与ISO等组织 ...

  5. 转: 深入Java虚拟机】之二:Class类文件结构

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17675609 平台无关性 Java是与平台无关的语言,这得益于Java源代码编译后生成的存 ...

  6. 201521123003《Java程序设计》第8周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集集合 1.List中指定元素的删除(题目4-1) 1.1 实验总结 我们利用Sca ...

  7. 201521123026《Java程序设计》第8周学习总结

    1. 本章学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 Q1.1.List中指定元素的删除(题目4-1) 1.1 实验总结 答: 1.通过equals ...

  8. 201521123086《java程序设计》第7周

    本章学习总结 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 以下是ArrayList的contains源代码: public boolean con ...

  9. 201521123072《java程序设计》第五周学习总结

    201521123072<java程序设计>第五周学习总结 标签(空格分隔): java学习 1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 代码 ...

  10. 201521123113 《Java程序设计》第4周学习总结

    1.本周学习总结 1.1 尝试使用思维导图总结有关继承的知识点. 1.2 使用常规方法总结其他上课内容. 设计类的技巧:类名和方法名要能够体现他们的职责,类名首字母要大写 如何识别一个类 方法.属性的 ...