A. Magic Spheres
题意:你有a,b,c个不同种类的球,两个同种类的球可以合成一个其他种类的球,问你能否使得自己有x,y,z个不同种类的球。
题解:如果a>x那么就有(a-x)/2个多余的球,否则就有(x-a)个缺少的球。其他两种球也这么分析。最后看总数是多余还是缺少。当时秒了这个水题。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int a,b,c,x,y,z,da,db,dc,cnt;
int main()
{
scanf("%d%d%d%d%d%d",&a,&b,&c,&x,&y,&z);
da=a-x;
if(da>0)cnt+=da/2;
else cnt+=da;
db=b-y;
if(db>0)cnt+=db/2;
else cnt+=db;
dc=c-z;
if(dc>0)cnt+=dc/2;
else cnt+=dc;
if(cnt>=0)puts("Yes");
else puts("No");
}
B.Testing Robots
题意:一个机器人按照LRUD这4个指令运动。地图是n*m的,起始位置x0,y0。当指令结束或者机器人踩到炸弹时,机器人爆炸。当机器人要走出边界时,机器人不会动。把一个炸弹安放在(1,1),进行一次测试。安在(1,2),进行一次测试。…把炸弹每次安在一个不同的位置,都做一次测试,然后让你输出机器人走0步爆炸的格子有几个,走1步爆炸的有几个。。。走完爆炸的有几个。
题解:说的很绕。其实没走完就爆炸的格子要么只有1个,要么没有(那一步要走出边界,机器人没走),最后走完的要爆炸的就是n*m-之前的和。这个题题意很麻烦,耽误了我很多时间。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int xo,yo,n,m,len,cnt[100010];
char s[100010],vis[510][510];
int main()
{
scanf("%d%d%d%d%s",&n,&m,&xo,&yo,s);
len=strlen(s);
cnt[len]=n*m;
for(int i=0;i<len;++i)
{
if(!vis[xo][yo])
{
vis[xo][yo]=1;
cnt[i]=1;
--cnt[len];
}
if(s[i]=='L'&&yo-1>=1)--yo;
if(s[i]=='R'&&yo+1<=m)++yo;
if(s[i]=='U'&&xo-1>=1)--xo;
if(s[i]=='D'&&xo+1<=n)++xo;
}
for(int i=0;i<=len;++i)
printf("%d%c",cnt[i],i==len?'\n':' ');
}
C.Sorting Railway Cars
题意:给出一个n的排列,你可以从中拿出一个数然后把这个数放到数列的头或者末尾去,问要把排列从小到大排序最少需要几步。
题解:显然如果这个序列里面有连续上升的子序列那么这个子序列就不用改变位置。并且如果有2条分开的连续上升的子序列,也会有一条被一个个地放到前面或者后面。那么问题就是求一个最长连续上升子序列。当时也是很快做完了。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int f[100010],n,ans;
int main()
{
scanf("%d",&n);
for(int i=1,a;i<=n;++i)
{
scanf("%d",&a);
f[a]=f[a-1]+1;
ans=max(ans,f[a]);
}
printf("%d\n",n-ans);
}
D.Lazy Student
题意:给出一个图的所有边的边权以及这条边是否在这个图的最小生成树上面,让你找出一个符合题意的原图。原图中不能有重边自环。
题解:构造这个图。以边权为第一关键字,是否在生成树上为第二关键字排序。然后把生成树建成一条链[1,n]。如果不在生成树上就加环(u,v)(u<=n,v<=n,abs(v-u)>=2)。如果加不了环了说明没有这个图。当时还是想了一阵子的。。而且wa了3次。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct node{
int w,id,f;
}data[100010];
int n,m,fa[100010],u=1,x=1,y=3,ans[100010][2];
bool cmp(node a,node b)
{
if(a.w==b.w)return a.f>b.f;
return a.w<b.w;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
fa[i]=i;
for(int i=1;i<=m;++i)
scanf("%d%d",&data[i].w,&data[i].f),data[i].id=i;
sort(data+1,data+m+1,cmp);
for(int i=1;i<=m;++i)
{
if(data[i].f)
{
ans[data[i].id][0]=u;
ans[data[i].id][1]=u+1;
++u;
}
else
{
if(y>u)
{
puts("-1");
return 0;
}
else
{
ans[data[i].id][0]=x;
ans[data[i].id][1]=y;
++x;
if(y-x<=1)++y,x=1;
}
}
}
for(int i=1;i<=m;++i)
printf("%d %d\n",ans[i][0],ans[i][1]);
}
E.Freelancer’s Dreams
刚看题以为是线性规划,最后看别人题解发现是凸包。。唉算了反正我两个都不会。
这次CFdiv2比较水,前面4个题,2题比较拖时间,4题有一定的思维量,但是还是很水= =。