学了些DP
学校题库有\(BUG\)
首先要满足条件\(x,y\)的二进制有1的位必然包含\(a\),然后让\(s-2a\),也就是除去二进制包含\(a\)有1的位,然后\(<0\)肯定无解,其次是如果有与\(a\)同一级的含\(1\)二进制位也不合法
点击查看代码
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define lid (rt<<1)
#define rid (rt<<1|1)
// #define endl '\n'
#define pii pair<int,int>
//#define int long long
#define pb push_back
#define ts cout<<"----------------"<<endl;
#define bs bitset<65>
using namespace std;
ll a,s;bool has[65];
int main()
{
freopen("and.in","r",stdin);
freopen("and.out","w",stdout);
// freopen("in.in","r",stdin);
// freopen("out.out","w",stdout);
int T;
cin>>T;
while(T--)
{
cin>>a>>s;
// cout<<bs(a)<<" "<<bs(s)<<endl;
bitset<65> x,y,t;
memset(has,0,sizeof has);
// memset(aa,0,sizeof aa);memset(bb,0,sizeof bb);
for(ll i=0;i<=60;i++)
{
if(a>>i&1ll)
{
x[i]=1;
has[i]=1;
y[i]=1;
s-=(1ll<<i);
s-=(1ll<<i);
}
}
if(s<0)
{
cout<<"No"<<endl;continue;
}else
{
// cout<<"Yes"<<endl;
bool f=1;
for(ll i=0;i<=60;i++)
{
if(s>>i&1ll)
{
if(has[i])f=0;
}
}
if(f)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
return 0;
}
模拟退火立大功
点击查看代码
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define lid (rt<<1)
#define rid (rt<<1|1)
// #define endl '\n'
#define pii pair<int,int>
#define ull unsigned long long
#define pb push_back
#define ts cout<<"----------------"<<endl;
#define bs bitset<65>
using namespace std;
const int N = 2e5+5;
int n,k;
mt19937 rnd(chrono::system_clock::now().time_since_epoch().count());
int rand(int l,int r)
{
uniform_int_distribution<int> range(l, r);
return range(rnd) ;
}
struct ac
{
int a,b;
}a[N];
bool cmp(ac a,ac b)
{
if(a.a==b.a)return a.b>b.b;
return a.a>b.a;
}
bool vis[N];
ll ans;
ll calc()
{
ll res=1;
for(int i=1;i<=k;i++)
{
res=res*a[i].a+a[i].b;
}
ans=max(ans,res);
return res;
}
void SA()
{
sort(a+1,a+1+n,cmp);
for(double t=3000;t>=1e-7;t*=0.998)
{
ll now=calc();
int u=rand(1,INT_MAX)%n+1,v=rand(1,INT_MAX)%n+1;
swap(a[u],a[v]);
ll nn=calc();
if(nn>now)continue;
if((double)exp((double)(nn-now)/t)>(double)rand(1,INT_MAX)/INT_MAX)continue;
swap(a[u],a[v]);
}
}
double Tm()
{
return (double)clock()/CLOCKS_PER_SEC;
}
int main()
{
speed();
// freopen("in.in","r",stdin);
// freopen("out.out","w",stdout);
freopen("func.in","r",stdin);
freopen("func.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i].a>>a[i].b;
}
random_shuffle(a+1,a+1+n);
while(Tm()<0.8)SA();
cout<<ans<<endl;
return 0;
}
正解,设\(A_1(A_2+B_2)+B_1>A_2(A_1+B_1)+B_2\)则\((A_1-1)B_2>(A_2-1)B_2\)
排个序,然后\(dp\)即可,记得处理边界啊
点击查看代码
#include <bits/stdc++.h>
#define speed() ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define ll long long
#define lid (rt<<1)
#define rid (rt<<1|1)
// #define endl '\n'
#define pii pair<int,int>
#define ull unsigned long long
#define pb push_back
#define ts cout<<"----------------"<<endl;
#define bs bitset<65>
using namespace std;
const int N = 2e5+5;
ll n,k,dp[15][N];
struct ac
{
ll a,b;
}a[N];
bool cmp(ac a,ac b)
{
return (b.a-1)*a.b>(a.a-1)*b.b;
}
int main()
{
speed();
freopen("func.in","r",stdin);
freopen("func.out","w",stdout);
// freopen("in.in","r",stdin);
// freopen("out.out","w",stdout);
cin>>n>>k;
for(int i=1;i<=n;i++)
{
cin>>a[i].a>>a[i].b;
}
sort(a+1,a+1+n,cmp);
dp[0][0]=1;//sb
for(int i=1;i<=n;i++)dp[0][i]=1;
for(int i=1;i<=k;i++)
{
for(int j=1;j<=n;j++)
{
dp[i][j]=max(dp[i][j-1],dp[i-1][j-1]*a[j].a+a[j].b);
// cout<<i<<" "<<j<<" "<<dp[i]
}
}
// for(int i=1;i<=n;i++)
// {
// for(int j=0;j<=k;j++)
// {
// dp[i][j]=dp[i-1][j];
// if(j)dp[i][j]=max(dp[i][j],dp[i-1][j-1]*a[i].a+a[i].b);
// }
// }
ll ans=0;
for(int i=1;i<=n;i++)ans=max<ll>(ans,dp[k][i]);
cout<<ans<<endl;
return 0;
}
预设性\(DP\)详见