emmm为了让博客数不那么大。
hdu 2510
打表题。
table code:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 30;
int n;
int tot=0;
int a[N][N];
bool check(){
int cnt1=0,cnt2=0;
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
cnt1+=(a[i][j]==1);
cnt2+=(a[i][j]==0);
}
}
return cnt1==cnt2;
}
void fill(){
for(int d=n-1;d>=1;--d){
for(int i=1;i<=d;++i){
if(a[d+1][i]==a[d+1][i+1]) a[d][i]=1;
else a[d][i]=0;
}
}
}
void dfs(int d){
if(d==n+1){
fill();
if(check()) ++tot;
return ;
}
a[n][d]=0;dfs(d+1);
a[n][d]=1;dfs(d+1);
}
int main(){
freopen("test.txt","w",stdout);
for(int i=1;i<=24;++i){
tot=0;n=i;
memset(a,-1,sizeof(a));
dfs(1);
printf("%d,",tot);
}
return 0;
}
AC code:
#include<cstdio>
int a[25]={0,0,0,4,6,0,0,12,40,0,0,171,410,0,0,1896,5160,0,0,32757,59984,0,0,431095,822229};
int main(){
while(1){
int n;scanf("%d",&n);
if(n==0) break;
printf("%d %d\n",n,a[n]);
}
return 0;
}
hdu 1594
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 15;
const int inf = 0x7FFFFFFF;
int t;
int a[N],ans=inf;
bool vis[N];
void dfs(int d,int sum){
if(sum>=ans) return ;
if(d==10){
ans=min(ans,sum);
return ;
}
for(int i=1;i<=9;++i){
if(!vis[i]){
vis[i]=true;
int j;
for(j=i+1;j<=10;++j)
if(!vis[j]) break;
dfs(d+1,sum+abs(a[j]-a[i]));
vis[i]=false;
}
}
}
void update(){
memset(vis,0,sizeof(vis));
ans=inf;
}
int main(){
scanf("%d",&t);
while(t--){
int x;update();
for(int i=1;i<=10;++i) scanf("%d",&x),a[x]=i;
dfs(1,0);
printf("%d\n",ans);
}
return 0;
}
有一道题狂T,但交网上ac代码无一通过。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int N = 20000 + 10;
int n;
struct node{
int pre,v;
}e[N];
int num=0,head[N];
void addedge(int from,int to){
e[++num].pre=head[from],e[num].v=to;
head[from]=num;
}
int a[N],dp[N],in[N];
int f[N];
void dfs(int u){
if(a[u]==0){
dp[u]=u;
return ;
}
int cnt=0;
for(int i=head[u];i;i=e[i].pre){
int v=e[i].v;
dfs(v);
f[++cnt]=dp[v];
}
sort(f+1,f+cnt+1);
if(a[u]!=0) dp[u]=f[(a[u]+1>>1)-1];
}
void update(){
memset(head,0,sizeof(head));
memset(in,0,sizeof(in));
num=0;
}
int main(){
while(~scanf("%d",&n)){
update();
for(int i=1;i<=n;++i){
a[i]=read();
int u;
for(int j=1;j<=a[i];++j) u=read(),++in[u],addedge(i,u);
}
for(int i=1;i<=n;++i){
if(in[i]==0){
dfs(i);
printf("%d\n",dp[i]);
break;
}
}
}
return 0;
}
BZOJ 1306 记得剪枝。
#include<bits/stdc++.h>
using namespace std;
const int N = 10;
int n;
int a[N],c[N],tot=0;
int sx[3]={0,3,1},sy[3]={3,0,1};
void dfs(int d,int i){
// printf("%d %d %d\n",d,c[d],i);
// getchar();
if(c[d]>a[d]) return ;
if(c[d]+(n-i+1)*3<a[d]) return ;
if(d==n) {++tot;return ; }
if(i==n) {
bool flag=true;
int j;
for(j=0;j<=2;++j){
if(c[d]+sx[j]==a[d]&&c[n]+sy[j]<=a[n]){flag=false;break;}
}
if(flag==true) return ;
c[d]+=sx[j],c[i]+=sy[j];
dfs(d+1,d+2);
c[d]-=sx[j],c[i]-=sy[j];
}
else{
for(int j=0;j<=2;++j){
if(c[d]+sx[j]<=a[d]&&c[i]+sy[j]<=a[i]){
c[d]+=sx[j],c[i]+=sy[j];
dfs(d,i+1);
c[d]-=sx[j],c[i]-=sy[j];
}
}
}
return ;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
dfs(1,2);
printf("%d\n",tot);
return 0;
}
BZOJ 1024
定义状态x,y,d表示长为x,宽为y,剩下的切的次数为d的答案。
每次最少都要切x/d或y/d(定义这个是一个单位),然后每次枚举切的单位数。
【这道啥鼻涕我刚开始居然毫无想法。。。果然还是太弱了。
#include<bits/stdc++.h>
using namespace std;
double x,y,ans;
int n;
double dfs(double xx,double yy,int d){
if(d==1) return max(1.0*xx/yy,1.0*yy/xx);
double mx=xx/d,my=yy/d;
double ans=233333333.0;
for(double i=1.0;i<=d/2;i+=1.0){
ans=min(ans,max(dfs(xx-mx*i,yy,d-i),dfs(mx*i,yy,i)));
ans=min(ans,max(dfs(xx,yy-my*i,d-i),dfs(xx,my*i,i)));
}
return ans;
}
int main(){
scanf("%lf%lf%d",&x,&y,&n);
printf("%.6lf\n",dfs(x,y,n));
return 0;
}