20190114基础测试



题目: 所属类别

  • 丢失的牛(我是超链接) 送分,暴力

  • 恐怖服装(我是超链接) 送分

  • 分油(我是超链接) 模拟,递归

  • convention(原网址找不到了) 二分答案


丢失的牛

#include<bits/stdc++.h>
using namespace std;
int juli=0; //移动的距离
int temp=0;//移动的次数 
int k;
int x,y;
int n;
int main()
{
    cin>>x>>y;
    if(x<y)
    {
    	n=y-x;
    	if(n<=1) juli=n;
		else if(n<=4) juli=n+6;
		else if(n<=16) juli=n+30;
		else if(n<=64) juli=n+126;
		else if(n<=256) juli=n+510;
		else if(n<=1024) juli=n+2046;
		cout<<juli<<endl;
		return 0;
	}
	if(x>y)
	{
		n=x-y;
    	if(n<=2) juli=n+2;
		else if(n<=8) juli=n+14;
		else if(n<=32) juli=n+62;
		else if(n<=128)	juli=n+254;
		else if(n<=512) juli=n+1022;
		else if(n<=2048) juli=n+2058;
		cout<<juli<<endl;
		n=y-x;
		return 0;
	}
	if(x=y)
	{
		cout<<0<<endl;
		return 0;
	}
	return 0;
}

这是暴力的方法,下面还有非暴力的:

#include<bits/stdc++.h>
using namespace std;
int x,y,watersum=0;
int main()
{
	cin>>x>>y;
	int k=1,pos=x,lastpos=x;
	if(x==y) { cout<<0; return 0;}
	else
	while(1)
	{
		pos=x+k;
		watersum+=abs(pos-lastpos);
		if((x<y&&pos>y)||(x>y&&pos<y))	{ watersum-=abs(pos-y); break;}
		if((x<y&&pos==y)||(x>y&&pos==y)) break;
		lastpos=pos;
		k*=-2;
	}
	cout<<watersum;
	return 0;
}

对于这道题,主要是画一下图,模拟一下就好了。但是,我在输出时调试代码没删,于是造成了一些有趣的后果。(忏悔ing)。


2.恐怖服装

简单粗暴的暴力,但是有可能超时

#include<bits/stdc++.h>
using namespace std;
int n,cow[20010],cloth,sum=0;
int main()
{
	cin>>n>>cloth;
	for(int i=1;i<=n;i++) scanf("%d",&cow[i]);
	for(int i=1;i<n;i++)
		for(int j=i+1;j<=n;j++)
		if(cow[i]+cow[j]<=cloth) sum++;
	cout<<sum;
	return 0;
}

复杂的二分查找

#include <bits/stdc++.h>
using namespace std;
int s,a[20005],ans=0;
bool check(int x,int y)
{
	return(x+y<=s);
}
int main()
{
	int n;
	cin>>n>>s;
	for (int i=1;i<=n;i++)
	cin>>a[i];
	sort(a+1,a+1+n);
	int le=1,ri=n,p;
	while (le+1<ri)
	{
		int mid=(le+ri)/2;
		if (check(a[1],a[mid])) le=mid;
		else                    ri=mid;
	}
	if (check(a[1],a[ri])) p=ri;
	else                   p=le;
	//分界;
 for (int i=1;i<p;i++)
 {
 	le=1,ri=p;
	while (le+1<ri)
	{
		int mid=(le+ri)/2;
		if (check(a[i],a[mid])) le=mid;
		else                    ri=mid;
	}
	if (check(a[i],a[ri])) 
	{
    if (ri>i) ans+=ri-i;
	}
	else
	{   
	if (le>i) ans+=le-i;
	}

 }
	cout<<ans; 	
	return 0;
}

3.分油

比较复杂的递归模拟,边界就是有没有搜索过(或者是否次数过多)

#include<bits/stdc++.h>
using namespace std;
int maxx[4],a[4],score[4],minsum=100000,mem[101][101][101];
void dfs(int x,int y,int z,int step)
{
	if(mem[x][y][z]>0)
	{
		if(step>=mem[x][y][z]) return ;
		if(step<mem[x][y][z]) mem[x][y][z]=step;
	}
	else mem[x][y][z]=step;
	if(x==score[1]&&y==score[2]&&z==score[3])
	{
		if(step<minsum) minsum=step;
		return ;
	}
	if(maxx[2]-y<x) dfs(x+y-maxx[2],maxx[2],z,step+1);
	else dfs(0,y+x,z,step+1);
	if(maxx[3]-z<x) dfs(x+z-maxx[3],y,maxx[3],step+1);
	else dfs(0,y,z+x,step+1);
	if(maxx[1]-x<y) dfs(maxx[1],y+x-maxx[1],z,step+1);
	else dfs(x+y,0,z,step+1);
	if(maxx[1]-x<z) dfs(maxx[1],y,z+x-maxx[1],step+1);
	else dfs(x+z,y,0,step+1);
	if(maxx[2]-y<z) dfs(x,maxx[2],z+y-maxx[2],step+1);
	else dfs(x,y+z,0,step+1);
	if(maxx[3]-z<y) dfs(x,y+z-maxx[3],maxx[3],step+1);
	else dfs(x,0,y+z,step+1);
}
int main()
{
	memset(mem,0,sizeof(mem));
	for(int i=1;i<=3;i++) cin>>maxx[i];
	for(int i=1;i<=3;i++) cin>>a[i];
	for(int i=1;i<=3;i++) cin>>score[i];
	dfs(a[1],a[2],a[3],0);
	cout<<minsum;
	return 0;
}

4.convention

这道题是路由器安置的翻版,很有难度,自然我没有AC。
但是我样例没过,一个奇怪的数据却过了,真是奇怪
(RP爆发)
附上我错的代码:

#include<bits/stdc++.h>
using namespace std;
int n,cowtime[100010],buss,sits;
bool check(int mintime)
{
	int waitcow=1,gout=buss;
	for(int i=1;i<=n;i++)
	{
		if((cowtime[i]-cowtime[waitcow]>mintime))
		{
			gout--;
			waitcow=i;
		}
		if((cowtime[i]-cowtime[waitcow]==mintime)||(i-waitcow+1==sits))
		{
			gout--;
			waitcow=i+1;
		}
	}
	return gout>=0;
}
int main()
{
	scanf("%d %d %d",&n,&buss,&sits);
	for(int i=1;i<=n;i++) scanf("%d",&cowtime[i]);
	sort(cowtime+1,cowtime+n+1);
	int L=0,R=1000000010,Mid;
	while(L+1<R)
	{
		Mid=(L+R)/2;
		if(check(Mid)) R=Mid;
		else L=Mid;
	}
	if(check(L)) printf("%d",L);
	else printf("%d",R);
	return 0;
}

正确的代码我还没打出来,到时候再说吧


总的来说,虽然没有令我的心灵满意,但是我的却诚实的感到满意了
真是厚颜无耻
好了,没了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值