您的位置:首页 > 编程语言

【用膝盖写代码系列】(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必然为最大)

我的代码:

#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]);
}


那么,恭喜各位。。。世界末日被你们熬过了……

下次见~

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: