给定n个由1-n组成的序列,要求L到R这个区间内序列翻转,输出序列翻转之后的序列
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int n,m,a[N],l,r;
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>l>>r;
int f=0;
for(int i=1;i<l;i++)
{
if(f)cout<<" ";
f=1;
cout<<i;
}
for(int i=r;i>=l;i--)
{
if(f)cout<<" ";
f=1;
cout<<i;
}
for(int i=r+1;i<=n;i++)
{
if(f)cout<<" ";
f=1;
cout<<i;
}
}
也是简单题,输入包含n个项以及m行,在第二行输入第i个是第i列应该达到的目标,之后m行每行n个,要求每一列相加的和大于对应的第i列。
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
int n,m,a[N],b[N],ans[N];
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;i++)cin>>ans[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[j];
b[j]+=a[j];
}
}
for(int i=1;i<=m;i++)
{
if(b[i]<ans[i]){
cout<<"No"<<endl;
return 0;
}
}
cout<<"Yes"<<endl;
}
题目大意是一共有n个钥匙,编号为1到n,需要k个真钥匙才能开门,然后给出了m个关系,也就是在某次尝试中用了这些钥匙开门,并且给了你是否开门的结果,问一共有多少种真钥匙的可能。
状态压缩。由于钥匙一共就15把,我们枚举每一把钥匙为真的可能性,一共就是2的15次方,只需要判断当前钥匙排列是否能通过这m种是否开门的尝试方案,全部通过则说明当前钥匙的组合是可能的,就把ans++。
代码找不到了。。。。。
题目大意是给定N和M,让1到N的每一个数和M作与操作,统计操作之后二进制中的1的个数。
首先肯定是将m二进制化,m对应的位数为1,才会有与操作出现1的可能。
然后我们需要统计1到N中各个位上出现1的次数,只需要把前三位甚至前四位1出现的数字枚举一下就能发现规律
记得不要开unsigned long long,因为那个计数公式有可能出现负数的情况,开ULL到负数了会自动跳到最大值。
这个规律适用于1到64位,所以不需要特判1,当时没想到第一位也是这个规律,就想到奇数偶数了。
#include<bits/stdc++.h>
using namespace std;
#define int signed long long
const int N=1e4+10;
const int MOD=998244353;
int n,m,a[N],b[N],num,ans;
signed main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m;
num=0;
while(m!=0)
{
num++;
a[num]=m%2;
m/=2;
}
if(a[1]==1)
{
ans=(ans+(n+1)/2)%MOD;
}
for(int i=2;i<=num;i++)
{
if(a[i]==1)
{
ans=(ans+n/(1LL<<i)*(1LL<<(i-1)))%MOD;
int t=n%(1LL<<i)-((1LL<<(i-1))-1);
if(t>0)ans=(ans+t%MOD)%MOD;
}
}
cout<<ans%MOD<<endl;
}