【用膝盖写代码系列】(3):NOIP2012普及组题目详解
2016-08-24 12:55
288 查看
各位,欢迎来到世界末日的题目大全。(笑)
废话不多说,先上第一题
第一题:质因数分解
题意简述:已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数。
陷阱提示:注意这道题如果用短除法来做会TLE(不过有90分)
数据范围:(洛谷上没有数据范围,抱歉咯…不过)n<=2∗109
我对它的类型评估:数论,模拟,小技巧
思路描述:这道题其实很简单,从2开始枚举一个数a,使得:
①:n%a==0 ②:a是质数 ③:n/a是质数
如果枚举到这么一个数,输出n/a即可(因为此时的n/a必然为最大)
我的代码:
洛谷原题:http://www.luogu.org/problem/show?pid=1075
第一题完。
第二题:寻宝
题意简述:藏宝楼共有N+1层,最上面一层是顶层,顶层有一个房间里面藏着宝藏。除了顶层外,藏宝楼另有N层,每层M个房间,这M个房间围成一圈并按逆时针方向依次编号为0,…,M-1。其中一些房间有通往上一层的楼梯,每层楼的楼梯设计可能不同。每个房间里有一个指示牌,指示牌上有一个数字x,表示从这个房间开始按逆时针方向选择第x个有楼梯的房间(假定该房间的编号为k),从该房间上楼,上楼后到达上一层的k号房间。比如当前房间的指示牌上写着2,则按逆时针方向开始尝试,找到第2个有楼梯的房间,从该房间上楼。如果当前房间本身就有楼梯通向上层,该房间作为第一个有楼梯的房间。
寻宝说明书的最后用红色大号字体写着:“寻宝须知:帮助你找到每层上楼房间的指示牌上的数字(即每层第一个进入的房间内指示牌上的数字)总和为打开宝箱的密钥”。
请帮助小明算出这个打开宝箱的密钥。
陷阱提示:无
数据范围:有0<N≤10000,0<M≤100,0<x≤1,000,000。
我对它的范围评估:模拟
思路描述:这一道题就是纯粹的模拟,主要的一点就是如何构建一个环。环的构建很简单,将头尾相接即可。
我的代码:
洛谷原题:http://www.luogu.org/problem/show?pid=1076
第二题完。
第三题:摆花
题意简述:小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。求方案数。
陷阱提示:无
数据范围:有0<n≤100,0<m≤100,0≤ai≤100。
我对它的类型评估:动态规划-背包动规
思路描述:这道题主要是一个状态转移方程的问题,这道题其实与背包问题有异曲同工之妙。那么核心代码也有点特殊:
这里设f[i]表示第i种花共有几种摆法
那么整个代码其实就出来了.
我的代码:
洛谷原题:http://www.luogu.org/problem/show?pid=1077
第三题,猝(这句划掉)
第三题,完。
第四题:文化之旅
题意简述:有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家)。不同的国家可能有相同的文化。不同文化的国家对其他文化的看法不同,有些文化会排斥外来文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家)。现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试求从起点到终点最少需走多少路。
陷阱提示:注意排斥是单方面的,不能设置成两方面
数据范围:
2≤N≤100 1≤K≤100,1≤M≤N2,1≤ki≤K, 1≤u,v≤N 1≤d≤1000 S≠T 1≤S,T≤N
我对它的类型评估:图论
(这可能是历年题目里最恶心的一题,这™居然考到了图论??WTF???)
思路描述:这道题虽然考到的图论,但也是十分简单的。利用Floyd算法,然后将排斥的国家之间的道路(i排斥j,将i向j的道路)设置成INF。仅此而已。
Floyd详解:http://developer.51cto.com/art/201403/433874.htm
(真的不是恶意转载,抱歉了……)
那么代码就十分清晰了。
我的代码:
那么,恭喜各位。。。世界末日被你们熬过了……
下次见~
废话不多说,先上第一题
第一题:质因数分解
题意简述:已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数。
陷阱提示:注意这道题如果用短除法来做会TLE(不过有90分)
数据范围:(洛谷上没有数据范围,抱歉咯…不过)n<=2∗109
我对它的类型评估:数论,模拟,小技巧
思路描述:这道题其实很简单,从2开始枚举一个数a,使得:
①:n%a==0 ②:a是质数 ③:n/a是质数
如果枚举到这么一个数,输出n/a即可(因为此时的n/a必然为最大)
我的代码:
#include <cstdio> #include <cstring> #include <cmath> #define cmax(a,b) a>b?a:b bool is_prime(int n) { int i,j; for (i=2, j=int(sqrt(n)); i<=j; i++) if (n%i == 0) return false; return true; } int main(){ long i,max=0,n; bool flag = false; scanf("%d",&n); for(i=2;i<=n/2;i++){ if(n%i==0 && is_prime(i) && is_prime(n/i)){ return !printf("%d",n/i); } } return 0; }
洛谷原题:http://www.luogu.org/problem/show?pid=1075
第一题完。
第二题:寻宝
题意简述:藏宝楼共有N+1层,最上面一层是顶层,顶层有一个房间里面藏着宝藏。除了顶层外,藏宝楼另有N层,每层M个房间,这M个房间围成一圈并按逆时针方向依次编号为0,…,M-1。其中一些房间有通往上一层的楼梯,每层楼的楼梯设计可能不同。每个房间里有一个指示牌,指示牌上有一个数字x,表示从这个房间开始按逆时针方向选择第x个有楼梯的房间(假定该房间的编号为k),从该房间上楼,上楼后到达上一层的k号房间。比如当前房间的指示牌上写着2,则按逆时针方向开始尝试,找到第2个有楼梯的房间,从该房间上楼。如果当前房间本身就有楼梯通向上层,该房间作为第一个有楼梯的房间。
寻宝说明书的最后用红色大号字体写着:“寻宝须知:帮助你找到每层上楼房间的指示牌上的数字(即每层第一个进入的房间内指示牌上的数字)总和为打开宝箱的密钥”。
请帮助小明算出这个打开宝箱的密钥。
陷阱提示:无
数据范围:有0<N≤10000,0<M≤100,0<x≤1,000,000。
我对它的范围评估:模拟
思路描述:这一道题就是纯粹的模拟,主要的一点就是如何构建一个环。环的构建很简单,将头尾相接即可。
我的代码:
#include <cstdio> int main(){ int room[10001]; int canUp[10001][101],number[10001][101]; int ans=0; int i,j,n,m; scanf("%d%d",&n,&m); for(i=0;i<n;i++){ for(j=0;j<m;j++){ scanf("%d%d",&canUp[i][j],&number[i][j]); room[i]+=canUp[i][j]; } } int first_room; scanf("%d",&first_room); for(i=0;i<n;i++){ ans+=number[i][first_room]; int now = number[i][first_room]; now = now % room[i] + room[i]; now-=canUp[i][first_room]; while(now){ first_room++; first_room%=m; now-=canUp[i][first_room]; } } ans%=20123; printf("%d",ans); }
洛谷原题:http://www.luogu.org/problem/show?pid=1076
第二题完。
第三题:摆花
题意简述:小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。求方案数。
陷阱提示:无
数据范围:有0<n≤100,0<m≤100,0≤ai≤100。
我对它的类型评估:动态规划-背包动规
思路描述:这道题主要是一个状态转移方程的问题,这道题其实与背包问题有异曲同工之妙。那么核心代码也有点特殊:
这里设f[i]表示第i种花共有几种摆法
for(i=1;i<=n;i++){ scanf("%d",&flower); for(j=m;j>=0;j--){ for(int k=1;k<=flower;k++){ if(j+k <= m) { f[j+k] = (f[j+k] + f[j]) % 1000007; } } } }
那么整个代码其实就出来了.
我的代码:
#include <cstdio>
#include <cstring>
int main(){
int f[501];
int flower;
memset(f,0,sizeof(f));
int i,j,n,m;
f[0] = 1;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){ scanf("%d",&flower); for(j=m;j>=0;j--){ for(int k=1;k<=flower;k++){ if(j+k <= m) { f[j+k] = (f[j+k] + f[j]) % 1000007; } } } }
printf("%d",f[m]);
}
洛谷原题:http://www.luogu.org/problem/show?pid=1077
第三题,猝(这句划掉)
第三题,完。
第四题:文化之旅
题意简述:有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家)。不同的国家可能有相同的文化。不同文化的国家对其他文化的看法不同,有些文化会排斥外来文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家)。现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试求从起点到终点最少需走多少路。
陷阱提示:注意排斥是单方面的,不能设置成两方面
数据范围:
2≤N≤100 1≤K≤100,1≤M≤N2,1≤ki≤K, 1≤u,v≤N 1≤d≤1000 S≠T 1≤S,T≤N
我对它的类型评估:图论
(这可能是历年题目里最恶心的一题,这™居然考到了图论??WTF???)
思路描述:这道题虽然考到的图论,但也是十分简单的。利用Floyd算法,然后将排斥的国家之间的道路(i排斥j,将i向j的道路)设置成INF。仅此而已。
Floyd详解:http://developer.51cto.com/art/201403/433874.htm
(真的不是恶意转载,抱歉了……)
那么代码就十分清晰了。
我的代码:
#include <bits/stdc++.h> using std :: min; const int INF = 999999; int n,k,m,s,t,dist[101][101],c[101],a[101][101]; int main() { scanf("%d%d%d%d%d",&n,&k,&m,&s,&t); for (int i = 1;i <= n;i++) for (int j = 1;j <= n;j++) dist[i][j] = INF; for (int i = 1;i <= n;i++) scanf("%d",&c[i]); for (int i = 1;i <= k;i++) for (int j = 1;j <= k;j++) scanf("%d",&a[i][j]); for (int i = 1;i <= m;i++) { int a1,b1,c1; scanf("%d%d%d",&a1,&b1,&c1); dist[a1][b1] = dist[b1][a1] = c1; } for (int i = 1;i <= n;i++) for (int j = 1;j <= n;j++) if (a[c[i]][c[j]]) dist[i][j] = INF; for (int k = 1;k <= n;k++) for (int i = 1;i <= n;i++) for (int j = 1;j <= n;j++) dist[i][j] = min(dist[i][j],dist[i][k]+dist[k][j]); if (dist[s][t] == INF) printf("-1"); else printf("%d",dist[t][s]); }
那么,恭喜各位。。。世界末日被你们熬过了……
下次见~
相关文章推荐
- 【用膝盖写代码系列】(2):NOIP2011普及组复赛题目详解
- 【用膝盖写代码系列】(5):NOIP2013普及组复赛详解
- 【用膝盖写代码系列】(1):NOIP2010普及组复赛详解
- 【用膝盖写代码系列】(4):NOIP2014普及组复赛详解
- 【用膝盖写代码系列】(2):NOIP2011普及组复赛详解
- 不高兴的津津 C语言题目详解 noip2004普及组第1题
- 【蒻爆了的NOIP系列--普及组复赛】(3)NOIP2012普及组复赛题解
- NOIP2016 普及组 总结+题目吐槽+代码+简单题解
- 【NOIP2012TG】 开车旅行 详解+代码
- 【Cocoa(mac) Application 开发系列之四】动作编辑器(Cocos2dx)制作流程详解及附上响应鼠标滚轴事件、反转坐标系、导入/创建资源目录等知识点代码!
- 迎接2012新赛季——HDOJ系列热身赛(5) 部分题目
- NOIP系列复习及题目集合
- 深入理解JavaScript系列(45):代码复用模式(避免篇)详解
- 深入理解JavaScript系列(45):代码复用模式(避免篇)详解
- 深入理解JavaScript系列(46):代码复用模式(推荐篇)详解
- 构建安全的Xml Web Service系列之wse之错误代码详解
- Windows NT 内核操作系统(2000、XP系列)部分常见蓝屏死机代码详解
- NOIP2012普及组复赛解题报告
- 【2015自招必备】NOIP普及组完善程序题目汇编(含答案)
- VKCUP 2012 B Taxi 个人认为一道比较好的题目(虽然已经被否决),还是来发下代码吧