机试 练习题整理 入门篇

排序

特殊排序,不太懂啊。。为什么答案是这么写的,直接把最后一个不输出,难道不是把所有等于该值的数去除吗?

#include<iostream>
#include<algorithm>
using namespace std;
int a[1005];
int main()
{
	int n;
	//scanf("%d",&n)!=EOF或者写cin>>n 都能AC 
	while(scanf("%d",&n)!=EOF)//之前不小心写成NULL或者不加。就输出超限??? 
	{

		for(int i=0; i<n; i++)
			cin>>a[i];
		sort(a,a+n);
		cout<<a[n-1]<<endl;

		if(n==1)
		{
			cout<<-1<<endl;//忘记换行 。。 
			continue;
		}
		for(int i=0; i<n-1; i++)
		{
			//if(a[i]!=a[n-1])//为什么写上是错的啊?? 
				printf("%d ",a[i]);
		}
		cout<<endl;
	}
	return 0;
}
  • scanf("%d",&n)!=EOF或者写cin>>n 都能AC,如果只写scanf("%d",&n),会输出超限,也注意不要写成!=NULL

excel排序

全程用的C++,超时了想一想,nlogn的算法1e5也不会超时啊。。算了一下:log2 1e6才≈20。。所以说,算法本身不会超时,真的就是IO超时了?所以下次再遇到这种大规模IO的,刚开始直接就用C,尤其是的输出,不然现在string还要用c_str()表示指针,有点乱

  • scanf string,要:首先str.resize(10); 然后scanf("%s" ,&str[0]);
  • printf string,要:printf("%s", str.c_str());
  • printf 效率比cout 快很多,cout直接TLE。用printf的情况下,scanf 156ms,cin 276ms,所以用C的IO吧
  • 如果用字符数组也OK,IO直接用%s,比较大小用strcmp(s1, s2)<0说明s1<s2
#include<iostream>
#include<algorithm>
using namespace std;
struct S
{
	string num;
	string name;
	int g;
} s[100005];
int cmp1(S a,S b)
{
	return a.num<b.num;
}
int cmp2(S a,S b)
{
	if(a.name==b.name)
		return a.num<b.num;
	return a.name<b.name;
}
int cmp3(S a,S b)
{
	if(a.g==b.g)
		return a.num<b.num;
	return a.g<b.g;
}

int main()
{
	int n,i,t=1;//人数,排序方式
	while(cin>>n>>i)
	{
		if(!n) break;
		for(int j=0; j<n; j++)
		{
			s[j].num.resize(10);//必须要预先分配空间,不然会全乱了 
			s[j].name.resize(10);
			scanf("%s%s%d" ,&s[j].num[0],&s[j].name[0],&s[j].g);
//			cin>>s[j].num>>s[j].name>>s[j].g;
		}

		switch(i)
		{
			case 1:
				sort(s,s+n,cmp1);
				break;
			case 2:
				sort(s,s+n,cmp2);
				break;
			case 3:
				sort(s,s+n,cmp3);
		}
		printf("Case %d:\n",t++);//这样写挺巧妙 
		for(int j=0; j<n; j++)
			printf("%s %s %d\n" ,s[j].num.c_str(),s[j].name.c_str(),s[j].g);
//			cout<<s[j].num<<' '<<s[j].name<<' '<<s[j].g<<endl; 
	}
	return 0;
}

字符串内排序

用字符数组 或 string,两种方法都OK

char a[205];
while(gets(a))
{
	sort(a,a+strlen(a));
	printf("%s\n",a);
}
string a;
while(getline(cin,a))
{
	sort(a.begin(),a.end());
	printf("%s\n",a.c_str());
}

hash应用

谁是你的潜在朋友

用两个数组做hash,N对应读者编号,M对应书本编号,输入的时候,记录N读的书M[i],同时M[i]++以记录读这本书的人数,最后遍历读者,如果N读的书M[i]≥2,说明有共同读者,去除自己 输出M[i]-1即可:

#include<iostream>
#include<string.h>
using namespace std;
int N[10000];
int M[205];

int main()
{
	int n,m;
	cin>>n>>m;
	memset(M,0,sizeof(M));
	for(int i=0;i<n;i++)
	{
		scanf("%d",&N[i]);
		M[N[i]]++;
	}
	for(int i=0;i<n;i++)
	{
		if(M[N[i]]>=2)
			printf("%d\n",M[N[i]]-1);//减去自己 
		else printf("BeiJu\n");
	}
	return 0;
}

STL

set :Set Similarity,求两个集合的“相似度”,学到的:

  • auto
  • s.count(x)==1表示存在
  • 100.0*xxx自动变成浮点型,不用转换了
#include<iostream>
#include<set>
#include<unordered_map>
using namespace std;
const int N=105;
int n,q;

set<int>st[N];
set<int>::iterator it;
int main() {//coding 22:30->46
	cin>>n;
	for(int i=1,m,t; i<=n; i++) {
		cin>>m;
		while(m--) {
			cin>>t;
			st[i].insert(t);
		}
	}
	cin>>q;
	for(int i=0,a,b;i<q;i++){
		cin>>a>>b;
		set<int>s=st[b];
		int com=0,sum=s.size();
		for(auto it=st[a].begin();it!=st[a].end();it++)
			if(s.count(*it)==1) com++;
			else sum++;
		printf("%.1lf%\n",100.0*com/sum);//100.0会变成浮点数 
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值