A - Park Lighting
题意:每个灯能亮两个格子,最少几个灯能全覆盖
判断:水题
#include<iostream>
using namespace std;
int main(){
int N,n,m;
cin>>N;
while(N--){
cin>>n>>m;
int k=m*n;
if(k%2==0)
cout<<k/2<<endl;
else
cout<<k/2+1<<endl;
}
}
B - 免费馅饼
题意:数轴0-10,以5为起点,输入n,接下来n组xT,一组一个馅饼,输入xT,x为坐标点,T为第几秒,问怎么样接到馅饼最多,每秒只能走一格
判断:基础动规
#include<iostream>
#include<cstring>
#include<cstdio>
int m[100005][15];
using namespace std;
int main(){
int N,x,t,maxn=0;
scanf("%d",&N);
for(int i=0;i<N;i++){
scanf("%d%d",&x,&t);
m[t][x]++;//每秒每点的数量存下来
maxn=max(maxn,t);
}
for(int i=maxn-1;i>=0;i--)//从最基层比起
{
for(int j=0;j<=10;j++){//计算第i秒每个位置最大数量
int a=max(wz[i+1][j+1],wz[i+1][j-1]);//每秒只能走一格,向左走还是向右走
int b=max(wz[i+1][j],a);//在原地掉下来的多还是向另一边掉的多
wz[i][j]=b+wz[i][j];//加上最大值
}
}
cout<<wz[0][5]<<endl;
}
C - Swap
题意:
判断:二分图匹配算法待补充,还是没看出来这道题跟匈牙利算法之间有什么关系
扩充题:HDU2063-过山车
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=505;
int line[N][N];
int girl[N],used[N];
int k,m,n;
bool found(int x)//x号女嘉宾
{
for(int i=1; i<=n; i++)//每位男嘉宾轮流
{
if(line[x][i]&&!used[i])//女嘉宾有意愿并且男嘉宾还不曾配对
{
used[i]=1;//这位男孩已经配对
if(girl[i]==0||found(girl[i]))//如果这位男士还不曾被女孩占有,曾经要这个男士的女孩追求别人去了
{
girl[i]=x;//这位男士就给这位女士带走了
return 1;
}
}
}
return 0;
}
int main()
{
int x,y;
while(scanf("%d",&k)&&k)//可能组合数
{
scanf("%d %d",&m,&n);//男生和女生人数
memset(line,0,sizeof(line));
memset(girl,0,sizeof(girl));
for(int i=0; i<k; i++)
{
scanf("%d %d",&x,&y);//记录有意愿的人类
line[x][y]=1;
}
int sum=0;
for(int i=1; i<=m; i++)//以女生数进行循环
{
memset(used,0,sizeof(used));
if(found(i)) sum++;//匹配成功
}
printf("%d\n",sum);
}
return 0;
}
D - 食物链
题意:第一种说法是"1 X Y",表示X和Y是同类。
第二种说法是"2 X Y",表示X吃Y。
1) 当前的话与前面的某些真的话冲突,就是假话;
2) 当前的话中X或Y比N大,就是假话;
3) 当前的话表示X吃X,就是假话
你的任务是根据给定的N(1 <= N <= 50,000)和K句话(0 <= K <= 100,000),输出假话的总数。
判断:做题时想不明白怎么判断与前面的某些真话冲突
E - Frogger
题意:终点起点以及过渡点坐标均给出,求能从起点到终点的路径中最大路径的最小