130407周赛 (三)

2014-11-24 03:12:45 · 作者: · 浏览: 10
f("%s",ddd);
scanf("%d",&a);
while(a -- )
{
int x ;
scanf("%d",&x);
x --;
q[i] |= 1 << x;
}
}
int low = 0 ,high = m ;
while(high >= low)
{
int mid = (high + low) / 2 ;
int num ;
int l = f[mid];
for (int i = 0 ; i < l; i ++)
{
num = 0 ;
for (int j = 0 ; j < n ; j ++)
{
if((q[j] & qq[mid][i]) == qq[mid][i])
num ++;
}
if(num >= k)
{
ans = mid ;
low = mid + 1 ;
break;
}
}
if(low <= mid) high = mid - 1 ;

}
printf("%d\n",ans);
}
return 0;
}

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PI acos(-1.0)
#define Max 2005
#define inf 1<<28
#define LL(x) (x<<1)
#define RR(x) (x<<1|1)
#define FOR(i,s,t) for(int i=(s);i<=(t);++i)
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
#define mp(a,b) make_pair(a,b)
using namespace std;

string st;
int q[1005];
int n , m , k, ans ;
bool vis[1005];
int qq[20][1<<16];
char ddd[25];
int f[20];
int main()
{
//mem(f,0);
//mem(qq,0);
for (int i = 0 ; i <= 1<<15 ; i ++)
{
int num = i ;
int ans = 0 ;
while( num )
{
if(num & 1 ) ans ++;
num /= 2;
}
qq[ans][f[ans] ++] = i ;
}
while(scanf("%d%d%d",&n,&m,&k) != EOF)
{
mem(q,0);
ans=0;
for (int i = 0 ; i < n ; i ++)
{
int a ;
scanf("%s",ddd);
scanf("%d",&a);
while(a -- )
{
int x ;
scanf("%d",&x);
x --;
q[i] |= 1 << x;
}
}
int low = 0 ,high = m ;
while(high >= low)
{
int mid = (high + low) / 2 ;
int num ;
int l = f[mid];
for (int i = 0 ; i < l; i ++)
{
num = 0 ;
for (int j = 0 ; j < n ; j ++)
{
if((q[j] & qq[mid][i]) == qq[mid][i])
num ++;
}
if(num >= k)
{
ans = mid ;
low = mid + 1 ;
break;
}
}
if(low <= mid) high = mid - 1 ;

}
printf("%d\n",ans);
}
return 0;
}

1006 Dwarven Sniper’s hunting


最长距离肯定是子弹的最大射击距离,二分时间,找出最短的时间可以射击到敌人。


[cpp]
double xx1,yy1,xx2,yy2,lx,ly,vd,vb,l;
int main()
{
while(scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf",&xx1,&yy1,&xx2,&yy2,&lx,&ly,&vd,&vb,&l))
{
if(xx1 == 0 && xx2 == 0 && yy1 == 0 && yy2 == 0 && lx == 0 && ly ==0 && vd == 0 && vb == 0 && l ==0 )
return 0;
double ftime = (double)l / (double)vb ;//子弹飞的时间
double left = ftime ,right = 1e7;
double mid = (left + right ) / 2 ;
while(right - left > 1e-11)
{
mid = (left + right ) / 2 ;
double nowx = xx1 + lx * mid ;//敌人当前位置
double nowy = yy1 + ly * mid ;
double dis = sqrt((xx2 - nowx) * (xx2 - nowx ) + (yy2 - nowy ) * (yy2 - nowy));//俩人的距离
double dis1 = (mid - ftime) * vd ;//需要跑的距离
if(dis1 >= fabs(dis - l))
right = mid ;
else
left = mid ;
}
mid = (