三人组11.17训练赛
感觉这场似乎做崩了。。。
A hdu 2891
一开始,一直在往dp上想, 但其实应该醒悟过来的,因为我没有办法吧n*n的效率优化到 nlogn 或者 N,但是可能是经验太少了,一直到最后我才醒悟了,但是太晚了。
其实这题和北邮校赛的那道题不是一模一样的吗???
仔细想想,就是一样的解法啊。还是那种最简单的二分答案即可。 我们只需要二分最低血量,判断能够维持该血量就可以了。 判断On,扫一遍 ,然后我用一种很奇怪的jud AC了:先跑一遍完全背包,然后用来判断可行性
但是我觉得这种方法肯定是有问题的。。。 难道是数据太水了??
void beibao(){
memset(value,0,sizeof(value));
for(int i=1;i<=m;i++){
for(int j=f[i].time;j<=n;j++){
value[j]=max( value[j-f[i].time]+f[i].add , value[j]);
}
}
}
int sum[N];
int jud(int h){
int rest=hp;
int pre=0;
for(int i=1;i<=n;i++){
sum[i]=a[i]+sum[i-1];
// printf("i=%d r-a=%d\n",i,rest);
rest=hp-sum[i];
if(rest<h){ //当前血量小于h
rest=hp-sum[i-1]+value[i-1];
if(rest>hp) rest=hp;
rest-=a[i];
if(rest<h){
return 0;
}
}
}
return 1;
}
D 欧拉回路
一开始看错题了。。。 题意是要求扇形面中绝缘面与导电面的分布情况,然后给定k是接电的数量。然后求出字典序最小的序列,循环一圈正好0~2^k 都出现一遍,且只出现一遍。 其实这不就是欧拉图么,以前学图的时候学到这个地方就停了下来,所以这方面确实是有所欠缺,还不是很清楚,真好趁着这个机会补一补。另开一篇吧。 这边就只贴个代码了4
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
int vis[2500];
int a[2500];
int n;
int aim;
int l;
void dfs(int x)
{
int y=x&((1<<(n-1))-1); // x & 1111..1 (长度为n-1),=取后n-1位数字
y=y*2; //左移一位,长度变为 n
if(vis[y]==0)
{
vis[y]=1;
dfs(y);
// a[l++]=0; 如果我们放在前面,做前序遍历,会发现这样是错误的,因为他不管后面出现的数字
a[l++]=0; //因为回溯,所以第一个数字反而存在最后
}
if(vis[y+1]==0) //末尾为1
{
vis[y+1]=1;
dfs(y+1);
a[l++]=1;
}
}
/*
l= 7 6 5 4 3 2 1 0
y= 0 1 2 5 3 7 6 4
0 0(n-1) 0 1 0 1 1 1 0 0
这就是样例的dfs序,可以发现由于是一条回路,所以最后两个0 实际上就是前两个0
*/
int main() {
//freopen("1.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
l=0;
memset(vis,0,sizeof(vis));
printf("%d ",1<<n);
dfs(0);
for(int i=0;i<n-1;i++)
printf("%d",a[i]);
for(int i=l-1;i>=n-1;i--) //
{
printf("%d",a[i]);
}
printf("\n");
}
return 0;
}
E sb题
居然连copy 用都不要用都可以过,我还立了个flag。。。
F ac自动机模板题
G 简单bash博弈,但是要打出表来找规律,否则会超时
然后还有一大堆计算几何搞不了啊
当下很犹豫。。。