题意
思路
代码
while(t--)
{
scanf("%d%d",&n,&m);
for(int i=0;i<=1024;i++) for(int j=0;j<=1024;j++) f[i][j]=0;
f[0][0]=1;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&v,&w);
f[w][v]=1;
for(int j=0;j<1024;j++)
{
for(int k=v;k<=m;k++)
f[j][k]|=f[j^w][k-v];
}
}
int ans=-1;
for(int i=0;i<1024;i++) if(f[i][m]) ans=i;
cout<<ans<<endl;
}
于是考虑使用bitset进行压位,将循环体积的那一层循环优化掉,代码如下:
#include
using namespace std;
#define N 1050
int n,m,t,x,y;
bitset<N> f[N],g[N];
int main()
{
cin>>t;
while(t--)
{
scanf("%d%d",&n,&m);
for(int j=0;j<1024;++j) f[j].reset();
f[0][0]=1;
for(int i=1;i<=n;++i)
{
cin>>x>>y;
for(int j=0;j<1024;++j)
{
g[j]=f[j];
g[j]<<=x;
}
for(int j=0;j<1024;++j)
{
f[j]|=g[j^y];
}
}
int ans=-1;
for(int i=0;i<1024;i++) if(f[i][m]) ans=i;
cout<<ans<<endl;
}
return 0;
}
#include
using namespace std;
#define ll long long
#define N 500010
int t,n;
ll a[N],b[N],x[N],y[N];
bool work(ll xx,ll yy)
{
for(int i=1;i<=n;i++)
if(!(x[i]==xx || y[i]==yy || yy-xx==y[i]-x[i] || yy+xx==y[i]+x[i]))
return false;
return true;
}
bool check()
{
int p=0;
for(int i=2;i<=n;i++)
{
if(x[i]==x[1]) continue;
p=1;
if(work(x[1],y[i])) return true; //注意这里是找到一个不在这条线上的点 以这个点做“米”字与原来那条确定的线的交点。
if(work(x[1],y[i]-(x[i]-x[1]))) return true;
if(work(x[1],y[i]+(x[i]-x[1]))) return true;
break;
}
if(p==0) return true; //注意特判在一条线上的点
return false;
}
int main()
{
cin>>t;
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%lld%lld",&a[i],&b[i]);
bool is_ok=false;
for(int i=1;i<=n;i++)x[i]=a[i],y[i]=b[i];
if(check()) is_ok=true;
for(int i=1;i<=n;i++)x[i]=b[i],y[i]=a[i];
if(check()) is_ok=true;
for(int i=1;i<=n;i++)x[i]=a[i]+b[i],y[i]=a[i]-b[i];
if(check()) is_ok=true;
for(int i=1;i<=n;i++)x[i]=a[i]-b[i],y[i]=a[i]+b[i];
if(check()) is_ok=true;
if(is_ok) printf("YES\n");
else printf("NO\n");
}
return 0;
}
#include
using namespace std;
#define ll long long
const ll mod =1e9+7;
ll n,m,t;
ll qmi(ll a, ll k, ll p)
{
ll res = 1;
while (k)
{
if (k & 1) res = (ll)res * a % p;
a = (ll)a * a % p;
k >>= 1;
}
return res%p;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n>>m;
if(n==m) printf("0\n");
else
{
if(m==0) printf("%lld\n",(n*qmi(2,mod-2,mod))%mod);
else
{
printf("%lld\n",((n-m)%mod*qmi(2,mod-2,mod))%mod);
}
}
}
return 0;
}
#include
using namespace std;
#define N 1000010
int t,a[N],n;
int main()
{
cin>>t;
while(t--)
{
scanf("%d",&n);
for(int i=0;i<=n;i++) scanf("%d",&a[i]);
for(int i=n;i>=1;i--) a[i-1]+=a[i]/2;
if(a[0]>0) printf("Alice\n");
else printf("Bob\n");
}
return 0;
}