题目: 所属类别
丢失的牛
#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;
}
正确的代码我还没打出来,到时候再说吧
总的来说,虽然没有令我的心灵满意,但是我的却诚实的感到满意了
真是厚颜无耻
好了,没了。