比赛链接:click here~~
A BNU ACM校队时间安排,模拟自能
手速题:
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int tmp;
scanf("%d", &tmp);
switch (tmp)
{
case 1:
printf("Unknown\n");
break;
case 2:
case 3:
printf("Spring Training\n");
break;
case 4:
printf("Spring Training\nBNU Contest\n");
break;
case 5:
case 6:
printf("Unknown\n");
break;
case 7:
printf("Practice Week\nSummer Training\n");
break;
case 8:
printf("Summer Training\n");
break;
case 9:
case 10:
printf("Regional Contest\n");
break;
case 11:
printf("Basic Training\nRegional Contest\n");
break;
case 12:
printf("Basic Training\nRookie Contest\n");
break;
}
}
return 0;
}
B 沙漠之旅
应该是多重背包,当时没想那么多,用模拟过的。
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
int i,j,L,X,N;
bool flag;
int a[1005];
int aa[2100];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&L,&X,&N);
for(int i=0; i<N; i++)
{
scanf("%d",&a[i]);
}
memset(aa,0,sizeof(aa));
int ANS;
for(int i=0; i<N; i++)//n^2复杂度处理两两组合
{
for(int j=0; j<N; j++)
{
ANS=a[i]+a[j];//4 5 5 6
//cout<<ANS<<endl;
aa[ANS]=1;
}
}
bool flag=0;
int t=L-X;//11
for(int i=1; i<t; i++)
{
if(aa[i]&&aa[t-i])//满足条件则跳出
{
puts("Yes");
flag=1;
break;
}
}
if(flag==0)
puts("No");
}
return 0;
}
C. Adidas vs Adivon
【解题思路】:
判断一下,在不断的对半切的过程中一直 /2,直到是一个奇数或者为0.统计次数。长和宽的次数相加。判断奇偶性就可以了。
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
int i,j,L,X,N;
bool flag;
int a[1005];
int aa[2100];
int main()
{
int t,m,n;
cin>>t;
while(t--)
{
int sum=0;
scanf("%d%d",&m,&n);
while(m%2==0)
{
m=m/2;
sum++;
}
while(n%2==0)
{
n=n/2;
sum++;
}
if(sum%2!=0)
printf("Adidas loses\n");
else
printf("Adivon prevails\n");
}
return 0;
}F. Taiko taiko
【解题思路】一种情况是Y。一种情况是N,是Y的话,递推加1,是N的话,没分,a1=(a1+1)*p;b1+=a1;累加即可
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <vector>
#include <map>
#include <set>
#include <string.h>
#include <algorithm>
using namespace std;
int i,j,L,X,N;
bool flag;
int a[1005];
int aa[2100];
int main()
{
int t,n,m,i,j;
double a1,b1,p;
scanf("%d",&t);
while(t--)
{
a1=b1=0;
scanf("%d%lf",&n,&p);
for(i=1;i<=n;i++){
a1=(a1+1)*p;
b1+=a1;
}
printf("%.6lf\n",b1);
}
return 0;
}H. 硬币水题II概率,,不解释。。
#include <stdio.h>
#include <string.h>
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
double n;
scanf("%lf", &n);
printf("%.2lf\n", 1/(n * (1 - n)));
}
return 0;
}
J. 鸣人的查克拉
【解题思路】:很有意思的一道题,简直考智商!
我的思路:最多发动2次,然后输入一个数,每次更新一下前一次的最大值,具体见代码了#include <iostream>
#include <stdio.h>
#include <math.h>
#include <vector>
#include <map>
#include <set>
#include <string.h>
#include <algorithm>
using namespace std;
int Minn=-0x3f3f3f3f;
int main()
{
int i,j,c,x,n,m;
int a1,a2,a3,a4,a5;
cin>>c>>n;
a1=c;
a2=a3=a4=a5=Minn;
for(i=1; i<=n; i++)
{
cin>>x;
if(a1>=x)
a2=max(a2,a1-x); //9-9-9-9-9 /*第一步找消耗最小的,即剩余最大*/
a3=max(a3,a2+x); //10-11-12-12-14 /*第二步找下一次发动(也就是第一次发动)能增加最多的*/
if(a3>=x)
a4=max(a4,a3-x); //9-9-9-10-10 /*第三步找第二次发动消耗的最小的,剩余最大的
a5=max(a5,a4+x); //10-11-12-12-15 /*最后找最大的!*/
}
int res1=max(a3,a5); //11-12-12-15
int res2=max(a1,res1); //11-12-12-15
cout<<res2<<endl;//15!
}
/*
1 10-9 发动,变为9
2 9 不发动,9
3 12 结束1的时刻,加3 变为12
2 12-10 发动,为10
5 15 结束,加5为15!
*/【解题思路】:
求直线与矩形交分割面积最小的那块面积的大小,计算几何,,共六种情况:
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n,x1,y1,xr,yr,a,b,c;
cin>>n;
while(n--)
{
cin>>x1>>y1>>xr>>yr>>a>>b>>c;
double s,S;
double xy0=(c+b*y1)*1.0/-a; //上下交,求出下交点
double xy1=(c+b*yr)*1.0/-a; //上下交,求出上交点
double yx0=(c+a*x1)*1.0/-b; //左右交,求出左交点
double yx1=(c+a*xr)*1.0/-b; //左右交,求出右交点
bool t1=(xy0>=x1)&&(xy0<=xr);//判断边界,在下方
bool t2=(xy1>=x1)&&(xy1<=xr);//判断边界,在上方
bool t3=(yx0>=y1)&&(yx0<=yr);//判断边界,在左方
bool t4=(yx1>=y1)&&(yx1<=yr);//判断边界,在右方
if(t1&&t2) //直线在上下交
s=(xy1+xy0-2*x1)*(yr-y1)/2.0;//梯形面积,
else if(t3&&t4) //直线在左右交
s=(yx0+yx1-2*y1)*(xr-x1)/2.0;
else if(t1&&t3)
s=(yx0-y1)*(xy0-x1)/2.0;//三角形面积,
else if(t1&&t4)
s=(yx1-y1)*(xr-xy0)/2.0;
else if(t2&&t3)
s=(yr-yx0)*(xy1-x1)/2.0;
else if(t2&&t4)
s=(xr-xy1)*(yr-yx1)/2.0;
S=fabs(xr-x1)*(yr-y1);
s=min(s,S-s);
printf("%.3lf\n",s);
}
return 0;
}
原文地址:http://blog.csdn.net/u013050857/article/details/44907165