算法学习--Day4
今天写了两章题目,仍然是比较基础的内容。感觉时间好紧张,怕来不及,所以以后要加快速度了。
今天写的最多的是查找类题目,关键是二分查找的掌握。
题目描述
输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。
输入描述:
测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。
输出描述:
对于每组输入,请输出结果。
示例1
输入
2 1 3 0
输出
-1
#include <stdio.h> int main(){ int n; while(scanf("%d",&n)!=EOF){ int array[201]; for(int i=0;i<n;i++) scanf("%d",&array[i]); int p; int fin=-1; scanf("%d",&p); for(int i=0;i<n;i++) { if(array[i]==p) { fin=i; break;} } printf("%d",fin); } return 0; }
题目描述
输入数组长度 n 输入数组 a[1...n] 输入查找个数m 输入查找数字b[1...m] 输出 YES or NO 查找有则YES 否则NO 。
输入描述:
输入有多组数据。 每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m,n<=100)。
输出描述:
如果在n个数组中输出YES否则输出NO。
示例1
输入
5 1 5 2 4 3 3 2 5 6
输出
YES YES NO
#include <iostream> #include <stdio.h> #include <algorithm> using namespace std; //int find(int num,int buf[],int n){ // int ans=-1; // int base=0; // int top=n-1; // while (top>=base){ // int mid = buf[(top+base)/2]; // if (mid==num) {ans=1; // break;} // if(mid>num){ // top=mid-1; // } // if(mid<num){ // base = mid+1; // } // // } // return ans; //} // //int main(){ // int n; // while (scanf("%d",&n)!=EOF){ // int buf[101]; // int m; // for(int i=0;i<n;i++){ // // scanf("%d",&buf[i]); // } // sort(buf,buf+n); // int buf2[101]; // scanf("%d",&m); // for(int i=0;i<m;i++) scanf("%d",&buf2[i]); // for(int j=0;j<m;j++){ // int fin = find(buf2[j],buf,n); // if(fin==1) printf("YES\n"); // else printf("NO\n"); // } // } // // return 0; //} int main(){ int n; while (scanf("%d",&n)!=EOF){ int buf[101]; for (int i = 0; i <101 ; ++i) buf[i]=0; for (int i = 0; i <n ; ++i) { int cut ; scanf("%d",&cut); buf[cut]=1; } int m; scanf("%d",&m); for (int j = 0; j < m; ++j) { int c ; cin>>c; if(buf[c]==1) cout<<"YES"<<endl; else cout<<"NO"<<endl; } } }
这个题目我要重点说一下,我注释掉的代码是使用二分查找来做的,但是由于使用搜索过于复杂。。导致我的题目没给ac,所以换之前使用的哈希的思想去做了。就当做练手了。
题目描述
在一个整数数组上,对于下标为i的整数,如果它大于所有它相邻的整数, 或者小于所有它相邻的整数,则称为该整数为一个极值点,极值点的下标就是i。
输入描述:
第一行是此数组的元素个数k(4<k<80),第二行是k个整数,每两个整数之间用空格分隔。
输出描述:
每个案例输出为n行:每行对应于相应数组的所有极值点下标值,下标值之间用空格分隔。
示例1
输入
10 10 12 12 11 11 12 23 24 12 12
输出
0 7
#include <iostream> #include <stdio.h> using namespace std; int main(){ int n; while (scanf("%d",&n)!=EOF){ int buf[81]; for (int i=0;i<n;i++) cin>>buf[i]; if(buf[0]!=buf[1]) cout<<0<<" "; for (int j = 1; j < n-1; ++j) { if((buf[j]>buf[j-1]&&buf[j]>buf[j+1])||(buf[j]<buf[j-1]&&buf[j]<buf[j+1])) cout<<j<<" "; } if(buf[n-1]!=buf[n-2]) cout<<n-1; } return 0; }
题目描述
输入N个学生的信息,然后进行查询。
输入描述:
输入的第一行为N,即学生的个数(N<=1000) 接下来的N行包括N个学生的信息,信息格式如下: 01 李江 男 21 02 刘唐 男 23 03 张军 男 19 04 王娜 女 19 然后输入一个M(M<=10000),接下来会有M行,代表M次查询,每行输入一个学号,格式如下: 02 03 01 04
输出描述:
输出M行,每行包括一个对应于查询的学生的信息。 如果没有对应的学生信息,则输出“No Answer!”
示例1
输入
4 01 李江 男 21 02 刘唐 男 23 03 张军 男 19 04 王娜 女 19 5 02 03 01 04 03
输出
02 刘唐 男 23 03 张军 男 19 01 李江 男 21 04 王娜 女 19 03 张军 男 19
#include <string.h> #include <iostream> #include <algorithm> using namespace std; struct E{ char number[50]; char name[100]; char sex[5]; int age; }; bool cmp(E a,E b){ int fin = strcmp(a.number,b.number); return fin<0; }; int find(E buf[],char goal[],int n){ int base=0; int top=n-1; while (top>=base){ int mid = (base+top)/2; int cut = strcmp(goal,buf[mid].number); if(cut==0) {cout<<buf[mid].number<<" "<<buf[mid].name<<" "<<buf[mid].sex<<" "<<buf[mid].age<<endl; return mid; break;} if(cut>0) base = mid+1; if(cut<0) top = mid-1; } cout<<"No Answer!"<<endl; return -1; } int main(){ int n; while (scanf("%d",&n)!=EOF){ E stu[1001]; for (int i = 0; i < n; ++i) { cin>>stu[i].number>>stu[i].name>>stu[i].sex>>stu[i].age; } sort(stu,stu+n,cmp); int m; cin>>m; for (int j = 0; j < m; ++j) { char stunum[50]; //scanf("%s",stunum); cin>>stunum; //cout<<stunum; find(stu,stunum,n); } } return 0; }
因为菜,所以仍在努力。