《N诺机试指南》(九)查找、贪心、链表问题

1.查找问题:

二分查找:

例题:使用map解决查找问题

代码:

#include <bits/stdc++.h>
using namespace std;

//查找学生信息
struct Student{
	string name;
	string sex;
	int age;
	string id;
}stu[1005]; 

int main(){
	int n;
	cin >> n;
	for(int i=0; i<n; i++){
		cin >> stu[i].id >> stu[i].name >> stu[i].sex >> stu[i].age;
	}
	int m;
	cin >> m;
	string a[m];
	for(int i=0; i<m; i++){
		cin >> a[i];
	}
	//查找信息
	int flag = 0;//定义一个flag判断有没有找到
	for(int i=0; i<m; i++){
		for(int j=0; j<n; j++){
			if(a[i]==stu[j].id){
				cout << stu[j].id << " " << stu[j].name << " " << stu[j].sex << " " << stu[j].age << endl;
				flag = 1;//找到
				break;
			}
		}
		if(!flag){//flag=0
			cout << "No Answer" << endl;
		}
	}
	return 0;
}

//使用map查找学生信息
int main(){
	int n, q;
	map<string, Student> M;//定义一个map映射
	while( scanf("%d", &n)!=EOF ){
		for(int i=0; i<n; i++){
			Student s;
			cin >> s.id >> s.name >> s.sex >> s.age;
			M[s.id] = s;//将对应学生存到map对应id位置
		}
		scanf("%d", &q);
		for(int i=0; i<q; i++){
			string tempId;
			cin >> tempId;
			if( (M.find(tempId))!=M.end() ){
				cout << M[tempId].id << " " << M[tempId].name << " " << M[tempId].sex << " " << M[tempId].age << endl;
			}else{
				cout << "No Answer!" << endl;
			}
		}
	}
	return 0;
}

2.贪心问题:

例题:

代码:

//小明买饮料喝问题
#include <bits/stdc++.h>
using namespace std;

struct node{
	double w;
	double m;//w=价格,m=容量
}p[105]; 

bool cmp(node a, node b){
	return a.w/a.m < b.w/b.m;//按照单价从小到大排序
}

int main(){
	int n, x;
	while(scanf("%d%d", &n, &x)!=EOF){
		if(x==-1 && n==-1){//结束条件
			break;
		}
		//输入数据
		for(int i=1; i<=n; i++){
			scanf("%lf%lf", &p[i].m, &p[i].w);
		}
		//按照单价排序
		sort(p+1, p+1+n, cmp);
		double sum = 0;
		for(int i=1; i<=n; i++){
			if(x >= p[i].w){
				sum += p[i].m;
				x -= p[i].w
			}else{
				sum += (x*p[i].m/p[i].w);
				break;
			}
		}
		printf("%.3lf\n", sum);
	}
	return 0;
}

3.链表问题:

例题:约瑟夫环问题

代码:

//猴子报数=约瑟夫问题
#include <stdio.h>
#include <malloc.h>
using namespace std;

struct node{
	int num;//编号从1开始
	struct node *next;
};

int n, s, m;//n个猴子,从第s个开始报数,每走m个删掉一个猴子 

//创建循环链表
struct node* create(){
	struct node *head, *now, *pre;
	for(int i=1; i<=n; i++){
		now = (struct node*)malloc(sizeof(node));//创建新节点
		if(i==1){//如果是第一个,赋给head和pre
			head = now;
			pre = now;
		}
		//不是第一个节点
		now->num = i;
		now->next = head;//循环链表,尾-->头
		pre->next = now;
		pre = now;//最后把当前赋给pre,更新pre指针
	}
	return head;
}
//打印结果
void print_node(struct node *head){
	struct node *p;
	p = head;
	s = s - 1;
	//这里s要减去1,因为从头节点出发(head为1)
	//例如:s为2代表从第二个节点出发
	//从head(为1)到s=2只需要走一步:1-->2
	while(s--){
		p = p->next;
	}
	int i = 1;
	printf("%d\n", p->num);
	while(p!=NULL){
		if( p==p->next ){//如果是最后一个
			printf("%d\n", p->num);
			break;
		}
		if( (i)%(m-1)==0 ){//找到第m-1步的节点
		// i+1: 因为
			printf("%d ", p->next->num);//输出第m个节点值
			p->next = p->next->next;//删除第m个节点
		}
		p = p->next;//更新p
		i++;//更新i
	}
} 

int main(){
	while(scanf("%d%d%d", &n, &s, &m)!=EOF){
		if(n==0 && s==0 && m==0){
			break;
		}
		struct node *head;
		head = create();
		print_node(head);
	}
	return 0;
}

重点是链表创建和打印输出:

原文地址:https://www.cnblogs.com/Whgy/p/12389449.html

时间: 2024-08-01 17:30:52

《N诺机试指南》(九)查找、贪心、链表问题的相关文章

《N诺机试指南》(六)负二进制转化习题

先看题目: 意思:将一个十进制数进行负二进制转化,将一个十进制数进行二进制转化大家都很清楚,取余再除2向下取整,接着反序输出 负二进制转化类似:1.对-2取余,再取绝对值 2.存入结果数组里 3.将数减去余数再除-2 4.反顺序打印出来 代码: //负二进制转换 /* 道理与 十进制转二进制一样 注意:有多组输入 */ #include <stdio.h> #include <math.h> int main(){ int n; int result[105]; while(sca

计算机考研机试指南(六) ——栈

机试指南 cha 3 栈的应用 括号匹配问题 1 #include <iostream> 2 #include <stdio.h> 3 #include <algorithm> 4 #include <queue> 5 #include <stack> 6 #include <math.h> 7 #include <string> 8 #include <string.h> 9 #include <std

机试指南第二章-经典入门-Hash的应用自解

Hash的应用: Hash即散列,不像数据结构与算法中讲的各种Hash方法和冲突处理等过多的阐述,以下主要介绍Hash在机试试题解答中的作用. 例2.5 统计同成绩学生人数 Hash解法AC代码:(一般想到的也是这种解法) #include<cstring> #include<iostream> using namespace std; int grade[105]; int main() { int n, m, index; memset(grade, 0, sizeof(gra

机试指南第二章-经典入门-查找例题自解

查找: 对于查找问题,有难有易.可能只是直接地对某个数字的查找,也可能涉及搜索等相对难度更大的算法.这里先介绍查找的基础概念和方法. 例 2.9 找 x AC代码: #include<cstring> #include<iostream> using namespace std; int num[205]; int main() { int n, m, x; memset(num, 0, sizeof(num)); while (cin >> n) { bool fla

机试指南第二章-经典入门-贪心例题自解

例2.11 FatMouse's Trade 解题思路 贪心策略.每次都买剩余物品中性价比(即重量价格比)最高的物品,直到该物品被买完或者钱耗尽.若该物品已经被买完,则我们继续在剩余的物品中寻找性价比最高的物品 AC代码 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; struct Thing { double j;

机试指南第六章-搜索-例题自解

枚举: 枚举是最简单也是最直白的搜索方式,它依次尝试搜索空间中所有的解,测试其是否符合条件,若符合则输出答案,否则继续测试下一组解. 例6.1 百鸡问题 #include<iostream> using namespace std; int main() { int n; while (cin >> n) { for (int x = 0; x <= 100; x++) { for (int y = 0; y <= 100 - x; y++) { int z = 100

【算法总结】二叉树(王道机试指南第三章)

我们从二叉树的遍历谈起. 众所周知,在对二叉树的遍历过程中,根据遍历每一个结点的左子树.结点本身.右子树的顺序不同可将对二叉树的遍历方法分为前序遍历.中序遍历.后序遍历.我们摒弃数据结构教科书上复杂的遍历方式,而是使用我们在上一章所重点讨论过的递归程序来简单的实现它. 假设二叉树结点由以下结构体表示: struct Node { Node *lchild;//指向其左儿子结点的指针,当其不存在左儿子时为NULL Node *rchild;//指向其右儿子结点的指针,当其不存在右儿子时为NULL

机试指南例2.1排序

题目描述 对输入的n个数进行排序并输出. 输入描述:     输入的第一行包括一个整数n(1<=n<=100).     接下来的一行包括n个整数. 输出描述:     可能有多组测试数据,对于每组数据,将排序后的n个整数输出,每个数后面都有一个空格.     每组测试数据的结果占一行. 示例1 输入 4 1 4 3 2 输出 1 2 3 4 代码2.1 使用冒泡排序 #include<stdio.h> int main() { int n; int buf[100]; while

机试指南例2.2成绩排序

题目描述 有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息. 输入描述: 测试数据有多组,每组输入第一行有一个整数N(N<=1000),接下来的N行包括N个学生的数据. 每个学生的数据包括姓名(长度不超过100的字符串).年龄(整形数).成绩(小于等于100的正数). 输出描述: 将学生信息按成绩进行排序,成绩相同的则按姓名的字母序进行排序. 然后输出学生信息,按照如下格式: 姓名 年龄 成绩