牛客练习记录第二周

本文记录了牛客网上五个编程练习题的概要,包括题目描述、输入输出要求和解题思路,涉及字符串处理、序列操作、硬币组合、图论和数位和问题。
摘要由CSDN通过智能技术生成

第一题:https://www.nowcoder.com/practice/f459f298ca814040bf601004734129a9?tpId=90&tqId=30860&tPage=5&rp=5&ru=%2Fta%2F2018test&qru=%2Fta%2F2018test%2Fquestion-ranking

题目描述

超链接访问

输入描述:

 

输出描述:

 

只要将字符串数组中将访问过的字符串删除即可


#include<iostream>
#include<algorithm>
#include<string>
#include<math.h>
#include<stdlib.h>
#include <iostream>
#include <vector>
#include <queue>
#include <set>

using namespace std ;
 
int main() {	
	int n,m;
	cin>>n;
	set<string> str;
	string temp;
	for(int i=0;i<n;i++){
		cin>>temp;
		str.insert(temp); 
	}
	cin>>m;
	for(int i=0;i<m;i++){
		cin>>temp;
		if(str.count(temp)) str.erase(temp);
	}
//	sort(str.begin(),str.end());
	set<string>::iterator iter=str.begin();
    while(iter!=str.end())
    {
        cout<<*iter<<endl;
        ++iter;
    }


	
}

/*

5
sina
qq
taobao
jd
baidu
3
qq
baidu
baidu

*/

第二题 :https://www.nowcoder.com/practice/be65e76a8b394139982047b2b0cec415?tpId=90&tqId=30861&rp=5&ru=/ta/2018test&qru=/ta/2018test/question-ranking

题目描述

在上小学的时候,我们经常碰到这样的事:考完试后老师懒得改试卷,于是让我们同桌相互交换试卷后为对方批改。但是后来老师发现这样作容易出现作弊,于是他想了一个新办法。 老师将同学分成了 n 个组,其中编号为?的组中有??个人。然后老师会按某种顺序依次访问 这些组。 对于他访问的第一个组,他会将这组内的所有试卷都收走,放置在桌上;对于他后续访问的每一个组,首先他会从桌上的试卷最上方拿出该组对应人数数量的试卷,随机分配给该组每 个人一张试卷让他们进行批改,而后再将这组学生自己考的试卷收走放置在桌面试卷的最下 方。当他访问完所有的组后他会将桌面上剩余的所有试卷随机分配给他第一个访问的组的学生进行批改。 但他发现这种方法有时候也会出现问题:有可能在中途访问到某个组的时候桌面上的试卷不够分配给这组学生每人一张;也有可能最后会有学生分配到批改自己的试卷,而且这两种情 况是否出现是与他访问每个组的顺序有关的。现在他想知道是否存在一种访问顺序能够使以 上两种情况都不出现,顺利完成试卷批改呢?

输入描述:

 

第一行包含一个整数?,表示学生组数。2 ≤ ? ≤ 30

第二行包含?个整数,?1,?2,...,??,分别表示每组学生的人数。1≤?? ≤10000

输出描述:

若存在一种访问顺序能使试卷顺利批改完成,输出 Yes,否则输出 No。

按从大到小排序,就能避免出现后面不够分配的情况。但是可能出现分到自己的卷子,这种只可能是后面的卷子加起来都没第一组的多。


#include<iostream>
#include<algorithm>
#include<string>
#include<math.h>
#include<stdlib.h>
#include <iostream>
#include <vector>
#include <queue>
#include <set>

using namespace std ;

int main() {	
	int n,m;
	cin>>n;
	int a[30];
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	sort(a,a+n);
	int sum=0;
	int count=a[n-1];
	int flag=0;
	for(int i=n-2;i>=0;i--){
		if(count<a[i]){
			flag=1;
			break;
		}
		else{
			sum+=a[i];
		}
	}
//	cout<<flag<<' '<<count<<' '<<sum<<endl;
	if(flag==1||sum<count) cout<<"No";
	else cout<<"Yes"; 
}

/*
2
10 20


4
2 3 3 1

*/

第三题:https://www.nowcoder.com/practice/d00c43a0739e4f0ca299d6c5067bb4b9?tpId=90&tqId=30862&rp=5&ru=/ta/2018test&qru=/ta/2018test/question-ranking

题目描述

 我们定义一个由数字 0 和 1 组成的序列是交错序列,当且仅当在这个序列中 0 和 1 是轮流 出现的,比如,0,010,10101 都是交错序列。

现在给出了一个由数字 0 和 1 组成的序列?,它可能不是一个交错序列,但是你可以从这个 序列中选择一些数字出来,按他们在序列?中原有的相对顺序排列(即选取?的一个子序列), 使得你最后得到的是一个交错序列。问这样能得到的交错序列的最长长度是多少                             

输入描述:

第一行包含一个整数?,表示输入序列的长度。1 ≤ ? ≤ 105

第二行包含?个 0 或 1,表示对应的序列。

                                    

输出描述:

输出能够得到的最长交错序列的长度

送分题,提取交错的数值就好了


#include<iostream>
#include<algorithm>
#include<string>
#include<math.h>
#include<stdlib.h>
#include <iostream>
#include <vector>
#include <queue>
#include <set>

using namespace std ;

int main() {	
	int n,m;
	cin>>n;
//	int a[100000];
	int temp;
	int flag;
	int count=1;
	for(int i=0;i<n;i++){
		cin>>temp;
		if(i==0){
			if(temp==0) flag=1;
			else flag=0;
		}
		else{
			if(temp==flag){
				if(temp==0) flag=1;
				else flag=0;
				count++;
			}
		}
		
	}
	cout<<count;
	
}

/*
8
1 1 0 0 1 1 0 0
*/

第四题:https://www.nowcoder.com/practice/d527c16e1132437f946434b0bdcf19d8?tpId=90&tqId=30865&rp=5&ru=/ta/2018test&qru=/ta/2018test/question-ranking

题目描述

 有一天你得到了一个长度为 n 的序列,序列中的元素分别是 1,2,3,...,n。接下来你想对这个序 列进行一些操作。每一次操作你会选择一个数然后将它从序列中原来的位置取出并放在序列 的最前面。你想知道经过一系列操作后这个序列长什么样。

输入描述:

第一行包含两个整数?, ?,分别表示序列的长度和操作的个数。1 ≤ ?, ? ≤ 105

接下来?行每

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值