前言
这一次主要做的是枚举,搜索以及剪枝,题目言简意赅
洛谷 1214 等差数列 Arithmetic Progressions
分析
枚举公差和首项,注意优化,当然dalao of ssl_zyc的博客
代码
/*
ID:lemondi1
LANG:C++
TASK:ariprog
*/
#include <cstdio>
#include <cstring>
#define rr register
using namespace std;
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
signed main(){
freopen("ariprog.in","r",stdin);
freopen("ariprog.out","w",stdout);
rr int n,m; scanf("%d%d",&n,&m);
rr int maxx=m*m<<1; rr bool v[maxx+1];
memset(v,0,sizeof(v));
for (rr int i=0;i<=m;++i)
for (rr int j=i;j<=m;++j) v[i*i+j*j]=1;
rr int flag=0,t=(n>3)*3+1;//详见zyc——one of ssl‘s dalao
for (rr int i=t;i<=maxx/(n-1);i+=t)//枚举公差
for (rr int j=0,cnt=0;j+(n-1)*i<=maxx;++j,cnt=0){//枚举首项
if (!v[j]||!v[j+(n-1)*i]) continue;//小小的剪枝
for (rr int k=j+i;k<=maxx-i&&v[k]&&cnt<n-2;k+=i) ++cnt;
if (cnt<n-2) continue;
if (!flag) flag=1,t=i;
print(j); putchar(32);
print(i); putchar(10);
}
if (!flag) printf("NONE\n");
return 0;
}
洛谷 1215 母亲的牛奶 Mother’s Milk
分析
深搜+判重,还是比较好理解的
代码
/*
ID:lemondi1
LANG:C++
TASK:milk3
*/
#include <cstdio>
#define min(a,b) (((a)<(b))?(a):(b))
#define rr register
using namespace std;
bool v[21],vis[21][21][21]; int a1,b1,c1;
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline void dfs(int a,int b,int c){
if (vis[a][b][c]) return;
vis[a][b][c]=1; v[c]|=a==0;
if (c&&a<a1) dfs(min(a1,a+c),b,c-min(a1,a+c)+a);//从c倒入a,可能没有倒完,以此类推
if (c&&b<b1) dfs(a,min(b1,b+c),c-min(b1,b+c)+b);
if (a&&b<b1) dfs(a-min(b1,a+b)+b,min(b1,a+b),c);
if (a&&c<c1) dfs(a-min(c1,a+c)+c,b,min(c1,a+c));
if (b&&a<a1) dfs(min(a1,a+b),b-min(a1,a+b)+a,c);
if (b&&c<c1) dfs(a,b-min(c1,b+c)+c,min(c1,b+c));
}
signed main(){
freopen("milk3.in","r",stdin);
freopen("milk3.out","w",stdout);
scanf("%d%d%d",&a1,&b1,&c1);
dfs(0,0,c1); rr int j=-1;
while (!v[++j]); if (j<=c1) print(j);
for (rr int i=j+1;i<=c1;++i) if (v[i]) putchar(32),print(i);
return !putchar(10);
}