267这场打得不怎么样……
个人感觉就是……阶梯性好强……题和题之间跳跃性真的需要这么大么……
有n个房间,每行是这个房间现在有几个人,总共能住几个人,问:有几个房间里有2个空位……
23333 代码如下
Code:
#include <cmath>
#include <cctype>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
bool cmp(const int a, const int b)
{
return a > b;
}
int main()
{
int n=0;
cin>>n;
int cnt=0;
for(int i=1;i<=n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
if(b-a>=2)cnt++;
}
cout<<cnt;
return 0;
}
不知道孩纸们知不知道这个运算符 :' ^ '
按位异或,如果这一位上的二进制位相同则为0,不同则为1.
这题的意思是有这么多个玩家,他们用二进制表示他们有哪些种类的兵力,最后一行是菲德尔,问有多少个人和他的兵种差距不大于k种。
那么……就直接用菲德尔(人)的兵种那个数字和别人异或一下看看有几个1咯~
代码如下:
Code
#include <cmath>
#include <cctype>
#include <cstdio>
#include <string>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
bool cmp(const int a, const int b)
{
return a > b;
}
int army[1024];
int cnt_s(int a)
{
int cnt=0, tmp=a;
while(tmp!=0)
{
cnt+=tmp%2;
tmp/=2;
}
return cnt;
}
int main()
{
int n,m,k;
cin>>n>>m>>k;
memset(army,0,sizeof army);
for(int i=1;i<=m+1;i++)
scanf("%d",&army[i]);
int cnt=0;
for(int i=1;i<=m;i++)
if(cnt_s(army[i]^army[m+1])<=k)cnt++;
cout<<cnt;
return 0;
}
先获得每一个数的sum数组(它及它之前的所有数字之和)
然后通过sum[i]-sum[i-m]获得每一个m连数组的和
dp获得结果
代码如下:
Code:
#include<stdio.h>
#include<string.h>
typedef __int64 ll;
ll pre[5005],cur[5005],sum[5005],a[5005];
int n,m,k;
int main(void){
int i,j;
while(~scanf("%d%d%d",&n,&m,&k)){
sum[0]=0;
for(i=1;i<=n;i++){
scanf("%I64d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
memset(pre,-1,sizeof(pre));
for(i=m;i<=n;i++)
pre[i]=cur[i]=sum[i]-sum[i-m];
for(i=2;i<=k;i++){
memset(cur,0,sizeof(cur));
ll temp=0;
for(j=m;j+m<=n;j++){
if(pre[j]==-1) continue;
if(pre[j]>temp) temp=pre[j];
cur[j+m]=temp+sum[j+m]-sum[j];
}
memcpy(pre,cur,sizeof(pre));
}
ll ans=0;
for(i=1;i<=n;i++) if(cur[i]>ans) ans=cur[i];
printf("%I64d\n",ans);
}
return 0;
}