NOIP模拟 8-21 题解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIP模拟 8-21 题解相关的知识,希望对你有一定的参考价值。
一份模拟题...水得要命真是没谁了。
减法 (sub.c/.cpp)
题目描述
东东在幼儿园刚刚学会了 20 以内的减法,就迫不及待的跑回家要给爸爸出题了。问“10-1”
来考东东爸,东东爸想也没想就说是“1”。东东顿时喜笑颜开,臭爸爸连这都不知道。那你知
道为啥么?嘻嘻,当然这不是题目了。
这回换东东爸出题了:
两个整数 A 和 B,问 A-B 的结果是多少。
其中 1<=A<=101000, 0<=B<=A。
东东一脸懵圈,说:“臭爸爸,我不会,你告诉我结果吧。“ 这回轮到东东爸懵圈了,东东
爸只是随口说的数字,你能帮他么?
输入格式
第一行:A
第二行:B
输出格式
一行一个数字表示 A-B 的结果。
样例输入
10
1
样例输出
9
分析:
赤果果的高精度减法。
AC代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 6 using namespace std; 7 const int MAXN = 10005; 8 9 struct bign 10 { 11 bool flag; 12 int num[MAXN]; 13 int len; 14 15 bign() {flag = 0;memset(num,0,sizeof(num));len = 0;} 16 17 void clear() 18 { 19 flag = 0; 20 memset(num,0,sizeof(num)); 21 len = 0; 22 } 23 }; 24 25 bool operator == (bign &a,bign &b) 26 { 27 if(a.len != b.len) return 0; 28 for(int i = a.len;i >= 1;i --) 29 if(a.num[i] != b.num[i]) 30 return 0; 31 return 1; 32 } 33 34 35 bign ans; 36 37 bign operator - (bign &a,bign &b) 38 { 39 ans.clear(); 40 int len; 41 ans.flag = 0; 42 len = a.len; 43 for(int i = 1;i <= len;i ++) 44 { 45 ans.num[i] += a.num[i] - b.num[i]; 46 if(ans.num[i] < 0) 47 { 48 ans.num[i] += 10; 49 ans.num[i + 1] --; 50 } 51 } 52 53 while(!ans.num[len]) len--; 54 ans.len = len; 55 56 return ans; 57 } 58 59 bign get() 60 { 61 ans.clear(); 62 string s; 63 cin>>s; 64 int len = s.length(); 65 for(int i = 0;i <= len - 1;i ++) 66 ans.num[len - i] = s[i] - ‘0‘; 67 ans.len = len; 68 return ans; 69 } 70 71 void print(bign a) 72 { 73 for(int i = a.len;i >= 1;i --) 74 printf("%d",a.num[i]); 75 puts(""); 76 } 77 78 int main() 79 { 80 bign a,b; 81 a = get(); 82 b = get(); 83 if(a == b) 84 { 85 printf("0\n"); 86 return 0; 87 } 88 print(a - b); 89 return 0; 90 }
晚饭(dinner.c/.cpp)
题目描述
众所周知,东东是一个刚上幼儿园的小朋友,所以学习正确的使用餐具就很重要了,尤其判
断吃不同的东西用不同的餐具的时候。
晚饭时刻,东东爸拖着疲惫的身躯从厨房端出最后一道美味,这时桌子上已经摆了 n 道菜。
东东会按照东东爸的要求从第一道吃到最后一道菜,当然在开吃之前他会把筷子拿在手里。
对于第 i 道菜,如果使用勺子吃会花费时间 Ai,如果使用筷子吃会花费时间 Bi,如果吃这道
菜时需要交换勺子和筷子的话,则交换所耗费的时间 Ci。注意不能一道菜同时使用勺子和筷子。
这可为难了东东,你作为东东爸的亲学生,帮帮这可怜的孩儿吧。
输入格式
第一行是一个整数 n,表示有 n 道美味。
之后 n 行,每行三个整数 Ai,Bi,Ci。含义如题目描述。
输出格式
东东吃完所有菜所需要的最短时间。
样例输入
2
2 4 2
7 3 1
样例输出
6
数据范围与约定
对于 100% 的数据
1<=n<=10000 1<=Ai,Bi,Ci<=1000
分析:
赤果果的dp...应该是很好懂的。
AC代码:
1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 6 const int MAXN = 10005; 7 8 inline void read(int &x) 9 { 10 char ch = getchar(),c = ch;x = 0; 11 while(ch < ‘0‘ || ch > ‘9‘) c = ch,ch = getchar(); 12 while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar(); 13 if(c == ‘-‘) c = ch; 14 } 15 16 struct node 17 { 18 int a,b,c; 19 }m[MAXN]; 20 21 int f[MAXN][5]; 22 //f[i][j]表示吃完了第i道菜,当前的餐具为j(1勺子/2筷子) 23 24 int main() 25 { 26 int n; 27 read(n); 28 for(int i = 1;i <= n;++ i) 29 { 30 read(m[i].a),read(m[i].b),read(m[i].c); 31 } 32 f[0][2] = 0,f[0][1] = m[1].c; 33 for(int i = 1;i <= n;++ i) 34 { 35 f[i][1] = std::min(f[i-1][1]+m[i].a,f[i-1][2]+m[i].a+m[i].c); 36 f[i][2] = std::min(f[i-1][2]+m[i].b,f[i-1][1]+m[i].b+m[i].c); 37 } 38 printf("%d\n",std::min(f[n][1],f[n][2])); 39 return 0; 40 }
乐高山上的士兵(lego.c/.cpp)
问题描述:
东东喜欢玩乐高,尤其喜欢在乐高大板上摆各种各样的造型,
比如右侧图片中的就是一个回形迷宫。不过东东今天突发奇想,在
大板上摆了很多的乐高块,组成了一片连绵不绝的大山。然后就滔
滔不绝的给东东爸讲山里的故事,虽然臭东从来都没有去过山里。
看东东玩的这么嗨,东东爸也要寓教于乐,就问东东下面的问
题:如果每一个山顶都需要一个士兵来站岗,需要多少个士兵呢?
假设 lego 大板是 N(1<N<=100)行和 M(1<M<=100)列,每个点都有一个高度为 H
(0<=H<=10000)当然高度为 0 表示地面,不能称之为山顶。一个山顶是由一个或者多个连
续的点构成的,并且与山顶相连的点的高度都小于山顶的高度。如果两个点相连,则这两个点的
行的差都不超过 1,列的差也不超过 1。
这可难不倒东东小盆友,因为整个山脉就是东东设计的,所以他很快就给出了答案,你也能
给出答案么?
输入格式
第一行:两个由空格隔开的正整数 N 和M。
接下来的N行,每行有M个由空格隔开的整数。第i行第j列的整数表示这个点(i,j)
的高度。
输出格式
一行一个整数,表示需要的士兵的数量。
样例输入
8 7
4 3 2 2 1 0 1
3 3 3 2 1 0 1
2 2 2 2 1 0 0
2 1 1 1 1 0 0
1 1 0 0 0 1 0
0 0 0 1 1 1 0
0 1 2 2 1 1 0
0 1 1 1 2 1 0
样例输出
3
分析:
赤果果的搜索...不过这个对我还是有点难度,毕竟几乎不会写暴力...
AC代码:
1 #include<cstring> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 6 const int MAXN = 105; 7 8 inline void read(int &x) 9 { 10 char ch = getchar(),c = ch;x = 0; 11 while(ch < ‘0‘ || ch > ‘9‘) c = ch,ch = getchar(); 12 while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar(); 13 if(c == ‘-‘) x = -x; 14 } 15 16 int mp[MAXN][MAXN],m,n,ans; 17 bool use[MAXN][MAXN]; 18 19 int dfs(int x,int y) 20 { 21 int v = 1; 22 if(x > n || y >m || x < 1 || y < 1) 23 return true; 24 use[x][y] = true; 25 for(int i = -1;i <= 1;++ i) 26 for(int j = -1;j <= 1;++ j) 27 { 28 if(i == 0 && j == 0) continue; 29 if(mp[x+i][y+j] > mp[x][y]) v = 0; 30 else if(mp[x+i][y+j] == mp[x][y] && !use[x+i][y+j]) v&=dfs(x+i,y+j); 31 } 32 return v; 33 } 34 35 int main() 36 { 37 read(n),read(m); 38 for(int i = 1;i <= n;++ i) 39 for(int j = 1;j <= m;++ j) 40 read(mp[i][j]); 41 for(int i = 1;i <= n;++ i) 42 for(int j = 1;j <= m;++ j) 43 { 44 if(mp[i][j] && !use[i][j] && dfs(i,j) == 1) 45 ans ++; 46 } 47 printf("%d\n",ans); 48 return 0; 49 }
以上是关于NOIP模拟 8-21 题解的主要内容,如果未能解决你的问题,请参考以下文章