A. UVALive 6661 Equal Sum Sets
从队友的博客里面借鉴出来了两种解法,基本上算掌握了吧。
1.二进制枚举法:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n,s,t;
int num;
while(scanf("%d%d%d",&n,&s,&t)&&(n+s+t))
{
num=0;
for(int i=1; i<=(1<<n); i++)
{
int sum=0,res=0;
for(int j=1; j<=n; j++)
{
if(i&(1<<(j-1)))
{
res++;
sum+=j;
}
}
if(res==s&&sum==t) num++;
}
cout<<num<<endl;
}
return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<algorithm>
#define maxn 100005
using namespace std;
int n,k,s,ans;
void dfs(int sum,int num,int now)
{
if(num==k)
{
if(sum==s) ans++;
}
for(int i=now+1;i<=n;i++)
{
if(sum+i<=s)
dfs(sum+i,num+1,i);
}
}
int main()
{
while((scanf("%d%d%d",&n,&k,&s)&&(n+k+s)!=0))
{
ans=0;
dfs(0,0,0);
cout<<ans<<endl;
}
return 0;
}
C - Count the Regions dfs+离散化
解法:
花了一早上时间,终于通过队友的代码慢慢的掌握了这道题的算法,不断地debug。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int dis[4][2]={0,-1,1,0,0,1,-1,0},lenx,leny,vis[500][500];
void dfs(int i,int j)
{
if(vis[i][j]||i<0||j<0||i>=2*lenx+3||j>=2*leny+3) return ;
vis[i][j]=1;
for(int l=0;l<4;l++)
{
int ix=i+dis[l][0];
int iy=j+dis[l][1];
dfs(ix,iy);
}
}
int main()
{
int n;
while(scanf("%d",&n)&&n)
{
memset(vis,0,sizeof(vis));
int sum=0,v[500][10]={0},a[500][500],x[500],y[500];
for(int i=0;i<n;i++)
{
scanf("%d%d%d%d",&a[i][0],&a[i][1],&a[i][2],&a[i][3]);
x[i*2]=a[i][0];
x[i*2+1]=a[i][2];
y[i*2]=a[i][1];
y[i*2+1]=a[i][3];
}
sort(x,x+2*n);
sort(y,y+2*n);
lenx=unique(x,x+2*n)-x;
leny=unique(y,y+2*n)-y;
for(int i=0;i<n;i++)
{
for(int j=0;j<lenx;j++)
{
if(x[j]==a[i][0]&&!v[i][0]) v[i][0]=1,a[i][0]=2*j+2;
if(x[j]==a[i][2]&&!v[i][2]) v[i][2]=1,a[i][2]=2*j+2;
}
for(int j=0;j<leny;j++)
{
if(y[j]==a[i][1]&&!v[i][1]) v[i][1]=1,a[i][1]=2*j+2;
if(y[j]==a[i][3]&&!v[i][3]) v[i][3]=1,a[i][3]=2*j+2;
}
}
for(int i=0;i<n;i++)
{
for(int j=a[i][0];j<=a[i][2];j++) vis[j][a[i][1]]=1,vis[j][a[i][3]]=1;
for(int j=a[i][3];j<=a[i][1];j++) vis[a[i][0]][j]=1,vis[a[i][2]][j]=1;
}
for(int i=0;i<2*lenx+2;i++)
{
for(int j=0;j<2*leny+2;j++)
if(!vis[i][j])
{
dfs(i,j);
sum++;
}
}
cout<<sum<<endl;
}
return 0;
}