USACO 1.4

前言

这一次主要做的是枚举,搜索以及剪枝,题目言简意赅


洛谷 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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值