NOIP2017SummerTraining0706
个人感受:这套题也依旧在划水,和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的更多相关文章
随机推荐
- ASP.NET静态化方法
直接通过访问页面获取html代码实现静态化 突然想到一个静态化页面的方法:直接保存源代码即可. 模拟浏览器访问,获得源码,写入文件.不知道是否存在安全风险:各位大神请指点: 注意 1.资源使用绝对路径 ...
- ORACLE ROWNUM解析
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp53 [align=middle;" align="le ...
- C# 导出数据到Excel模板中(转)
今天做报表的时候遇到了多表头的问题,而且相应的报表的格式都一样.所以就采用了报表模板的方式来进行. 第一步:在开发的当前项目中引入:Microsoft.Office.Interop.Excel:Sys ...
- poj3723 MST好题 kruskal
#include<iostream> #include<cstring> #include<cstdio> #include<algorithm> us ...
- 防止fixed元素遮挡其他元素的方法
有多个页面,有的有固定的头部(设置了postion:fixed的元素),有的没有固定的头部,这时就有个问题,有固定头部的页面,头部会遮挡下面的内容,那怎么解决呢? <!DOCTYPE html& ...
- java201521123118《java程序设计》第5周总结
1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 1. 代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过 ...
- 201521123024《Java程序设计》第3周学习总结
1. 本周学习总结 2. 书面作业 1.代码阅读 public class Test1 { private int i = 1;//这行不能修改 private static int j = 2; p ...
- 第2周作业-Java基本语法与类库(20170227-20170304)
本周学习总结 (1)这周学习认识和熟悉了java的一些类型和变量: (2)学习了java的运算符基本使用方法: (3)了解了如何建立远程仓库和本地仓库,和如何让java代码在临时储存,本地仓库和远程仓 ...
- Java中Collections的min和max方法
方法一 public static <T extends Object & Comparable<? super T>> T min(Collection<? e ...
- Sublime Text编辑器如何隐藏顶部的菜单栏
隐藏前: 解决办法: 1.按住Ctrl+Shifp+p,出现一个框,在框里输入“view:”,出现了如下界面 2.选择:“View:Toggle Menu”即可.结果为: 大功告成!!!!