struck有关与集合有关
来源:互联网 发布:临沂知豆租赁电话 400 编辑:程序博客网 时间:2024/04/25 00:27
what a fucking day
this morning , though I really wanted to take history class which is the last lesson of this term, but I was too sleepy to wake up.
After a silent math class, I went to library to type C code.
that made me want to go die.
hhhhhh
- 射击问题struck
Erin最近很喜欢玩射击游戏。她刚考完了C语言的期末考试,感觉很溜,于是又来到了射击娱乐场放松一下。和上次一样,先从老板那租了一把步枪和装有N发子弹的弹夹。在射击的过程中,Erin每次都有两种选择:从弹夹中取出一颗子弹上膛,或者打一发子弹出去。注意:所有的子弹都从枪口上膛。Erin感觉这有点像C语言课程中的“栈”的特点。因此在打完了这N发子弹之后,她想验证一下这些子弹打出来的顺序是不是真的满足“栈”的特性。假设N颗子弹的编号为1,2,…,N。子弹从弹夹中取出的顺序也是从1到N。给定一个子弹被打出的顺序,你可以帮Erin验证其是否满足“栈”的打出顺序吗?
可能有多个测试输入,第一行给出总共的测试输入的个数T,和每个测试输入的子弹数N。(0 < T < 20, 0 < N < 10)
每个测试输入只有一行:用空格隔开的N个数,表示子弹打出的编号顺序。
输出YES或者NO表示判断结果
例如
INPUT:
2 4
4 3 2 1
4 2 3 1
OUTPUT:
YES
NO
一个数之后的数必须降序排列
#include<stdio.h>int main() { int t, n; scanf("%d %d", &t, &n); while (t--) { int s[15] = {}; int temp; // 存放s[i]之后可能存在的第一个比s[i]小的 int flag1; // 标识s[i]之后是否存在比s[i]小的 int flag2; // 标识出栈序列是否非法 int i, j, k; for (i = 1; i <= n; i++) scanf("%d", &s[i]); for (i = 1; i < n; i++) { flag1 = 0; flag2 = 0; for (j = i + 1; j <= n; j++) // 寻找s[i]之后第一个比s[i]小的 if (s[j] < s[i]) { // s[i]之后存在比s[i]小的 temp = s[j]; // s[j]是s[i]之后第一个比s[i]小的 flag1 = 1; break; } if (flag1 == 1) for (k = j + 1; k <= n; k++) if (s[k] < s[i]) // s[j]之后如果还有比s[i]小的数 if (s[k] >= temp) { // 出栈序列非法 flag2 = 1; break; } else // 都必须小于它之前的一个比s[i]小的数 temp = s[k]; // 更新temp if (flag2 == 1) { printf("No\n"); break; } } if (flag2 == 0) printf("Yes\n"); } return 0;}
- 集合有关交集并集
There are two groups of some numbers(0~50). each group should be input in a set(remove the duplicate numbers).
And then output the two set, intersection and union of the two set.
Input format:
first line: a couple of numbers and end of -1.
second line: a couple of numbers and end of -1.
Output format:
first line:Output the first set.
second line: Output the second set.
third line: Output the intersection of the two set.
fourth line:Output the union of the two set.
All the numbers in the set should be output by ascending oder.
Each line behind the numbers, there is a space ’ ‘.
For example:
[Input]
1 2 3 6 5 4 1 2 3 -1
3 2 3 2 1 0 -1
[Output]
1 2 3 4 5 6
0 1 2 3
1 2 3
0 1 2 3 4 5 6
[Input]
0 -1
1 -1
[Output]
0
1
0 1
这是我自己写的代码,很低级,也不够优化,但是比较好理解
#include<stdio.h>int sort(int *p, int n); // 给数组去重复排序的函数void intersection(int *p, int n, int *q, int m); // 求交集的函数int un(int *p, int n, int *q, int m); // 求并集的函数 // 函数主体int main() { int a[100] = {0}; int b[100] = {0}; int length1 = 0, length2 = 0; //给数组a,b赋值 scanf("%d", &a[length1]); while (a[length1] != -1) { length1++; scanf("%d", &a[length1]); } scanf("%d", &b[length2]); while (b[length2] != -1) { length2++; scanf("%d", &b[length2]); } sort(a, length1);//给数组a, b 去重复排序并输出 sort(b, length2); intersection(a, length1, b, length2);//求交集 un(a, length1, b, length2);//求并集 return 0;}int sort(int *p, int n) { int i, j, k; //冒泡排序升序 for (i = 0; i < n; i++) { for (j = 0; j < n - i - 1; j++) if (p[j] > p[j+1]) { k = p[j]; p[j] = p[j+1]; p[j+1] = k; } } //去重复输出数组 printf("%d ", p[0]); for (i = 1; i < n; i++) { if (p[i] == p[i-1]) continue; printf("%d ", p[i]); } printf("\n");}//这个算法不够优化void intersection(int *p, int n, int *q, int m) { int i, j; int t = 0, flag = 0; int temp[3000] = {0}; // 这个数组比较大,但是为了防止溢出必须要开大一点至少2500 //判断两个数组里面有没有一样的元素,有就写入数组temp中 for (i = 0; i < n; i++) { for (j = 0; j < m; j++) { if (p[i] == q[j]) { temp[t] = p[i]; t++; flag = 1; // 如果两个没有交集,则flag为0,就会输出'\0',而不是temp[0] } } } if (flag != 0) { sort(temp, t); // 求得新数组再次去重复排序 } else { printf("\n"); }}int un(int *p, int n, int *q, int m) { int i, j, k; int t[101] = {0};// 如果,a的第一个比b的第一个小,数组t中写入a的第一个数,a的下标加1.如果,a的第一个比b的第一个大,数组t中写入b的第一个数,b的下标加1.如果,相等,写入任何一个,ab下标加1.知道 a或b全都比较完,把剩余的数写入t中 for (i = 0, j = 0, k = 0; ; k++) { if (p[i] == q[j]) { t[k] = p[i]; i++; j++; } else if (p[i] < q[j]) { t[k] = p[i]; i++; } else if (p[i] > q[j]) { t[k] = q[j]; j++; } if ((i == n) || (j == m)) break; } if ((i == n) && (j < m)) { for (j; j < m; j++) { k++; t[k] = q[j]; } } else if (i < n && j == m) { for (i; i < n; i++) { k++; t[k] = p[i]; } }// 对t去重复排序 sort(t, k+1);}
这是大神的代码我来膜拜一下
#include <stdio.h>// set and sort代码int inputSet(int set[]) { int n, i, j, temp; int count = 0; while (scanf("%d", &n)) { if (n == -1) break; for (i = 0; i < count; ++i) { if (n == set[i]) break; } if (i == count) { set[count] = n; count++; } } for (i = 0; i < count - 1; ++i) // 选择排序 for (j = i + 1; j < count; ++j) if (set[i] > set[j]) { temp = set[i]; set[i] = set[j]; set[j] = temp; } return count;}// 输出交集void outputITS(int a[], int count_a, int b[], int count_b) { int i, j; for (i = 0; i < count_a; ++i) { for (j = 0; j < count_b; ++j) { if (a[i] == b[j]) printf("%d ", a[i]); } } printf("\n");}// 输出并集void outputUNI(int a[], int count_a, int b[], int count_b) { int i, j; i = j = 0; while (i != count_a && j != count_b) { if (a[i] < b[j]) { printf("%d ", a[i]); i++; } else if (a[i] == b[j]) { printf("%d ", a[i]); i++; j++; } else if (a[i] > b[j]) { printf("%d ", b[j]); j++; } } if (i != count_a) { for (; i < count_a; ++i) printf("%d ", a[i]); } if (j != count_b) { for (; j < count_b; ++j) printf("%d ", b[j]); } printf("\n");}// 输出集合void output(int a[], int c) { int i; for (i = 0; i < c; ++i) printf("%d ", a[i]); printf("\n");}int main() { int a[50]; int b[50]; int count_a, count_b; count_a = inputSet(a); count_b = inputSet(b); output(a, count_a); output(b, count_b); outputITS(a, count_a, b, count_b); outputUNI(a, count_a, b, count_b); return 0;
- struck有关与集合有关
- 集合有关
- 有关集合类
- 有关->
- 有关字符串的算法集合
- 有关返回集合的错误
- 有关Java集合类温习
- Java有关集合的练习
- 有关map集合的理解
- 有关多线程下载有关资料与总结
- 与古人有关......
- 与爱情有关.
- 圣诞节与我有关?
- JavaScript与打印有关
- 与理想有关
- startActivityForResult 与launchmode有关
- 有关Assimp与Qt3D
- hdu4944与因子有关
- Android 键盘遮盖界面布局问题
- js 遍历对象
- 面向服务与微服务架构
- greenDao 实践
- 最新版 CocoaPods 的安装流程
- struck有关与集合有关
- 【机器学习】支持向量机SVM学习(2)
- Android Studio——Message
- 苹果电脑下开启PHP功能
- 【LWJGL2 WIKI】【现代OpenGL篇】用DrawArrays画方形
- hihoCoder 1260 String Problem I
- cf#336-C - Chain Reaction-二分
- go语言学习-程序结构
- 移动web应用开发——Sencha Touch篇(1)