USACO Training刷题记录 By cellur925
Section 1.1
Your Ride Is Here 貌似没啥可说
Greedy Gift Givers 上来就想stl map映射,有两个坑:如果送给别人的人数为0,那么需要特判一下,防止整数被0除;另外分给别人的钱可能会有剩余(不能整除),所以送礼者的钱数减少时不能直接减他想送出去的钱。
Friday The Thirteenth狗血模拟题,开始想要高级的一月一计算,看题解后还是用了一天一移动。
#include<cstdio>
#include<algorithm> using namespace std; int n;
int nowyear,nowday,nowmonth,week;
int tong[]; bool ren(int x)
{
if((x%==)&&(x%!=)||(x%==)) return ;
return ;
} int month(int year,int tmpm)
{
if(ren(year)&&tmpm==) return ;
else if(!ren(year)&&tmpm==) return ;
if(tmpm==||tmpm==||tmpm==||tmpm==) return ;
return ;
} int main()
{
scanf("%d",&n);
nowyear=,nowday=,nowmonth=,week=;
while()
{
if(nowyear==+n&&nowday==&&nowmonth==)
break;//到达目标年12月31日的下一天,也就是1月1日
nowday++;
week=week+;
if(week>) week=;
if(nowday>month(nowyear,nowmonth))
nowmonth++,nowday=;
if(nowmonth>)
nowyear++,nowmonth=;
if(nowday==) tong[week]++;
}
printf("%d %d ",tong[],tong[]);
for(int i=;i<=;i++)
printf("%d ",tong[i]);
return ;
}
Broken Necklace 又是一道狗血模拟题,直接枚举断点即可。然后需要断环为链。然后又几个坑:要开vis数组记录有没有采集过当前的珠子,并时刻检查;还有特判断点(origin)为w珠的情况。而且在奶牛站上交的时候还把文件名写错了==
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; int n,ans;
bool vis[];
char nl[]; int main()
{
scanf("%d",&n);
scanf("%s",nl+);
for(int i=;i<=n;i++) nl[i+n]=nl[i];
for(int x=;x<=n;x++)
{
memset(vis,,sizeof(vis));
/* int r=i+1,l=i;
if(i==n) r=1;
bool flagl=1,flagr=1;
char source_r=nl[r],source_l=nl[l];
int cntl=1,cntr=1;
while(l!=r)
{
r++;l--;
if(l<1) l=n;
if(r>n) r=1;
if(nl[l]!=source_l&&nl[l]!='w') flagl=0;
if(nl[r]!=source_r&&nl[r]!='w') flagr=0;
if(flagl&&!vis[l]) cntl++,vis[l]=1;
if(flagr&&!vis[r]) cntr++,vis[r]=1;
}*/
int cnt=;
char origin=nl[x];
vis[x]=vis[x+n]=;
for(int i=x-;i>=;i--)
{
if(vis[i]) break;
if(nl[i]==origin||nl[i]=='w') cnt++;
else if(origin=='w') cnt++,origin=nl[i];
else break;
vis[i]=vis[i+n]=;
}
ans=max(ans,cnt);
if(vis[x+]) continue;
cnt++;
origin=nl[x+];
for(int i=x+;i<=*n;i++)
{
if(vis[i]) break;
if(nl[i]==origin||nl[i]=='w') cnt++;
else if(origin=='w') cnt++,origin=nl[i];
else break;
vis[i]=vis[i+n]=;
}
ans=max(ans,cnt);
}
printf("%d",ans);
return ;
}
小结:lj模拟题目,注意细节。
Section 1.2
Milking Cows 还是很好想的区间问题,情况要想全。而且要在“最长至少有一人在挤奶的时间段”赋初值!(掉坑了)
Transformations 没有什么说的,想全情况,慢慢推导(考场1A,并没有什么可自豪)
Palindromic Squares 也是很简单。不过要注意!!进制数可能会超过10,有的要用字母表示!!!判断的时候不用,输出的时候需要预处理出一个char数组,如果模数大于10,就输出字母。
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; int B;
int a[];
char g[]={'A','B','C','D','E','F','G','H','I','J','K'}; bool judge(int x)
{
int pos=;
memset(a,,sizeof(a));
while(x)
{
a[++pos]=x%B;
x/=B;
}
int head=,tail=pos;
while(head<tail)
{
if(a[head]!=a[tail]) return ;
head++,tail--;
}
return ;
} void getf(int x)
{
int tmp[],cellur=;
memset(tmp,,sizeof(tmp));
while(x)
{
tmp[++cellur]=x%B;
x/=B;
}
for(int i=cellur;i>=;i--)
{
if(tmp[i]<) printf("%d",tmp[i]);
else printf("%c",g[tmp[i]-]);
}
printf(" ");
} int main()
{
scanf("%d",&B);
for(int i=;i<=;i++)
{
if(judge(i*i))
getf(i),getf(i*i),printf("\n");
}
return ;
}
Dual Palindromes 直接模拟就行,然后注意审清题目:从大于这个数开始算起。而不是大于等于。
Name That Number 目测自己的做法最简单(盲目自信),只要用一个map存一下每个字母对应的数字就行,题意有点绕,字典它是会输进来的。每输入一个单词进行严苛判断即可。第一次交手残了,本来可以1A的,逻辑不清楚写错了一个地方。
1.2小结:都是简单的枚举题目,细心,细心,再细心!
Section 1.3
Combination Lock 由于数据范围的锅,可以n^3直接过掉,然后预处理的时候我写的有点麻烦。需要特判极端数据1的情况(直接输出1)
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; int n,ans;
bool vis[];
char nl[]; int main()
{
scanf("%d",&n);
scanf("%s",nl+);
for(int i=;i<=n;i++) nl[i+n]=nl[i];
for(int x=;x<=n;x++)
{
memset(vis,,sizeof(vis));
/* int r=i+1,l=i;
if(i==n) r=1;
bool flagl=1,flagr=1;
char source_r=nl[r],source_l=nl[l];
int cntl=1,cntr=1;
while(l!=r)
{
r++;l--;
if(l<1) l=n;
if(r>n) r=1;
if(nl[l]!=source_l&&nl[l]!='w') flagl=0;
if(nl[r]!=source_r&&nl[r]!='w') flagr=0;
if(flagl&&!vis[l]) cntl++,vis[l]=1;
if(flagr&&!vis[r]) cntr++,vis[r]=1;
}*/
int cnt=;
char origin=nl[x];
vis[x]=vis[x+n]=;
for(int i=x-;i>=;i--)
{
if(vis[i]) break;
if(nl[i]==origin||nl[i]=='w') cnt++;
else if(origin=='w') cnt++,origin=nl[i];
else break;
vis[i]=vis[i+n]=;
}
ans=max(ans,cnt);
if(vis[x+]) continue;
cnt++;
origin=nl[x+];
for(int i=x+;i<=*n;i++)
{
if(vis[i]) break;
if(nl[i]==origin||nl[i]=='w') cnt++;
else if(origin=='w') cnt++,origin=nl[i];
else break;
vis[i]=vis[i+n]=;
}
ans=max(ans,cnt);
}
printf("%d",ans);
return ;
}
Prime Cryptarithm 模拟乘法竖式的各个步骤,注意细节,一道橙题调了好久,我好弱呀。模拟的时候多膜了。
/*
ID:cellur_2
TASK:crypt1
LANG:C++
*/
#include<cstdio>
#include<algorithm> using namespace std;
typedef long long ll; int n,cnt;
ll ans;
int seq[];
bool vis[]; bool check(int i,int j,int a,int b,int c)
{
if(!vis[(a*c)%]) return ;
int tmp=a*c/;
if(!vis[(j*c+tmp)%]) return ;
int cellur=(j*c+tmp)%;
tmp=(j*c+tmp)/;
if(!vis[i*c+tmp]) return ;
int Chemist=(i*c+tmp)%; if(!vis[(a*b)%]) return ;
int Shouzu=(a*b)%;
if(!vis[(cellur+Shouzu)%]) return ;
int qwq=(cellur+Shouzu)/;
tmp=a*b/;
if(!vis[(j*b+tmp)%]) return ;
int phd=(j*b+tmp)%;
tmp=(j*b+tmp)/;
if(!vis[i*b+tmp]) return ;
if(!vis[(Chemist+phd+qwq)%]) return ;
qwq=(phd+Chemist+qwq)/;
if(!vis[i*b+tmp+qwq]) return ; return ;
} int main()
{
freopen("crypt1.in","r",stdin);
freopen("crypt1.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&seq[i]),vis[seq[i]]=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
for(int a=;a<=n;a++)
for(int b=;b<=n;b++)
for(int c=;c<=n;c++)
if(check(seq[i],seq[j],seq[a],seq[b],seq[c])) ans++;
printf("%lld\n",ans);
return ;
}
Ski Course Design 一道可以让人深刻理解枚举的题目。在答案可能的范围内进行枚举。是某次正睿周末普转提的题目。
Wormhole 是一道题意难以理解的搜索题目。“先枚举所有的匹配方式,然后匹配完之后dfs搜找环”--redbag的简明扼要题解
枚举所有的匹配方式:是一种难得的搜索,要求我们不重不漏地枚举两两相配的情况。
dfs搜找环:
Section 1.4
Arithmetic Progressions lwz dalao表示他不能理解题目,当时可能我太弱(?)没能帮到他。现在再来看竟然一下就明白题意了。一道数论题。我们可以先处理出在范围内的双平方数集合,将他们进行标记,去重排序,暴力枚举从数列的每一项出发能产生多少等差数列(看起来是n²的,其实好像还是n³的)。还有一种方法,每次枚举前两个数然后可得公差,不过感觉貌似快不了多少(?)最可笑的是无解情况没输出,忘特判输出“NONE”了,我真傻,真的。
Mother's milk 终于写出了正确的搜索框架(一次)!但是内容并没有填充hhh。有一个细节写炸了,洛谷交竟然还能拿70分,数据真是弱啊。
/*
ID:cellur_2
TASK:milk3
LANG:C++
*/
#include<cstdio>
#include<algorithm> using namespace std; int a,b,c,m;
int ret[];
bool vis[][][]; // 记录A桶装了_,B桶装了_,C桶装了_是否可行 void dfs(int a1,int a2,int a3)
{
if(vis[a1][a2][a3]) return ;
if(!a1) ret[++m]=a3;//A桶空 记录C中所剩牛奶
vis[a1][a2][a3]=;
//模拟倒奶过程
if(a1)
{//a1还有
if(a2<b)//向a2里面倒
dfs(a1-min(a1,b-a2),a2+min(a1,b-a2),a3);
if(a3<c)
dfs(a1-min(a1,c-a3),a2,a3+min(a1,c-a3));
}
if(a2)
{
if(a1<a)
dfs(a1+min(a2,a-a1),a2-min(a2,a-a1),a3);
if(a3<c)
dfs(a1,a2-min(a2,c-a3),a3+min(a2,c-a3));
}
if(a3)
{
if(a1<a)
dfs(a1+min(a3,a-a1),a2,a3-min(a3,a-a1));
if(a2<b)
dfs(a1,a2+min(a3,b-a2),a3-min(a3,b-a2));
}
return ;
} int main()
{
freopen("milk3.in","r",stdin);
freopen("milk3.out","w",stdout);
scanf("%d%d%d",&a,&b,&c);
dfs(,,c);
int res=unique(ret+,ret++m)-(ret+);
sort(ret+,ret++res);//q离散化去重
for(int i=;i<=res;i++)
if(i!=res) printf("%d ",ret[i]);
else printf("%d",ret[i]);
printf("\n");
return ;
}
Section 2.1
Healthy Holsteins大佬们都说是裸搜索,可是我还是太弱了,不会搜。搜索需要记录当前的个数及第几种,对于每次可以选当前饲料或不选。
但是因为我们的题目需要保证字典序最小,所以先搜选当前饲料的情况。
#include<cstdio>
#include<algorithm> using namespace std; int v,mini=,G;
int sta[],feed[][],noww[],ans[]; bool check(int cnt)
{
for(int i=;i<=v;i++)
{
int tmp=;
for(int j=;j<=cnt;j++)
tmp+=feed[noww[j]][i];
if(tmp<sta[i]) return ;
}
return ;
} void dfs(int type,int cnt)
{
if(type>G)
{
if(check(cnt)&&cnt<mini)
{
mini=cnt;
for(int i=;i<=mini;i++) ans[i]=noww[i];
}
return ;
}
noww[cnt+]=type;
dfs(type+,cnt+);
noww[cnt+]=; dfs(type+,cnt);
} int main()
{
scanf("%d",&v);
for(int i=;i<=v;i++) scanf("%d",&sta[i]);
scanf("%d",&G);
for(int i=;i<=G;i++)
for(int j=;j<=v;j++)
scanf("%d",&feed[i][j]);
dfs(,);
printf("%d ",mini);
for(int i=;i<=mini;i++)
printf("%d ",ans[i]);
return ;
}
Section 2.2
Runaround Numbers 直接模拟即可,1A,需要细心。
Section 2.3
Controlling Companies 开始想不使用任何算法地水过,后来发现布星。用Vector存各个公司的儿子,但是会蜜汁RE+AC和零星的AC。话说最近用vector屡用屡WA,不用为妙。搜索真香。最朴素的搜索:存每个公司对其他公司的股份,然后分别对每个公司进行搜索。
#include<cstdio>
#include<algorithm>
#include<cstring> using namespace std; int n,x,y,opt;
int w[][],vis[],f[],sum[]; void dfs(int x)
{
if(vis[x]) return ;
vis[x]=;
for(int i=;i<=;i++)
{
sum[i]+=w[x][i];
if(sum[i]>)
{
f[i]=;
dfs(i);
}
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d%d%d",&x,&y,&opt),w[x][y]=opt;
for(int i=;i<=;i++)
{
memset(vis,,sizeof(vis));
memset(f,,sizeof(f));
memset(sum,,sizeof(sum));
dfs(i);
for(int j=;j<=;j++)
if(f[j]&&i!=j) printf("%d %d\n",i,j);
}
return ;
}
Section 2.4
The Tamworth Two 一道模拟题,模拟农夫与两头牛走的地图,需要注意如何判断走的情况无解呢?可以给一定的循环次数限制来防止死循环。
Section 3.1
Stamps dp题目,也就是完全背包。f[i]表示面值为i的最小次数。然后上界要设的稍微大一些。边界条件f[0]=0,需要先把数组赋成正无穷才知道什么时候是上限解。
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; int n,k,ans;
int stamp[],f[]; int main()
{
scanf("%d%d",&k,&n);
for(int i=;i<=n;i++) scanf("%d",&stamp[i]);
memset(f,,sizeof(f));int fAKe=f[];
f[]=;
for(int i=;i<=n;i++)
for(int j=stamp[i];j<=;j++)
if(f[j-stamp[i]]+<=k) f[j]=min(f[j],f[j-stamp[i]]+);
for(int i=;i<=;i++)
if(f[i]==fAKe)
{
printf("%d",i-);
return ;
}
return ;
}
Section 3.3
Home on the Range神似最大正方形。二维前缀和搞一搞就好,然后写这道题的时候才发现写最大正方形的时候有些bug,边界是小于0.因为第一行也可能被选到。
A Game 区间dp,写了正经题解。
Camelot 搜索,写了正经题解。
Shopping Offers完全背包,写了正经题解。
Riding The Fence 欧拉路,写了正经题解。
Section 3.4
Raucous Rockers 真·搜索
American Heritage是一道不错的二叉树基础练习题。用到了string奇淫技巧,需要熟练掌握二叉树三种遍历序列。
Electric Fence 正经计算几何,写了正经题解。
USACO Training刷题记录 By cellur925的更多相关文章
- Luogu USACO Training 刷水记录
开个坑记录一下刷USACO的Training的记录 可能会随时弃坑 只有代码和做法简述 可能没有做法简述 [USACO1.1]你的飞碟在这儿Your Ride Is He… 模拟,细节已忘 #incl ...
- 搜索刷题记录by cellur925
我好菜啊!连暴搜都不会! 注意边界退出! 特开此帖,记录搜索学习之路!(逃) 1.全排列 2.八皇后 3.数的划分 由于此题有同一划分方法算一个的限制,我们为了避免搜多,可以使搜出的结果满足单调不降性 ...
- PE刷题记录
PE刷题记录 PE60 / 20%dif 这道题比较坑爹. 所有可以相连的素数可以构成一张图,建出这张图,在其中找它的大小为5的团.注意上界的估算,大概在1W以内.1W内有1229个素数,处理出这些素 ...
- leetcode刷题记录--js
leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...
- Leetcode刷题记录(python3)
Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...
- 刷题记录:[HarekazeCTF2019]encode_and_encode
目录 刷题记录:[HarekazeCTF2019]encode_and_encode 一.知识点 JSON转义字符绕过 php伪协议 刷题记录:[HarekazeCTF2019]encode_and_ ...
- 刷题记录:[De1CTF 2019]Giftbox && Comment
目录 刷题记录:[De1CTF 2019]Giftbox && Comment 一.知识点 1.sql注入 && totp 2.RCE 3.源码泄露 4.敏感文件读取 ...
- 刷题记录:[强网杯 2019]Upload
目录 刷题记录:[强网杯 2019]Upload 一.知识点 1.源码泄露 2.php反序列化 刷题记录:[强网杯 2019]Upload 题目复现链接:https://buuoj.cn/challe ...
- 刷题记录:[XNUCA2019Qualifier]EasyPHP
目录 刷题记录:[XNUCA2019Qualifier]EasyPHP 解法一 1.error_log结合log_errors自定义错误日志 2.include_path设置包含路径 3.php_va ...
随机推荐
- Spring mvc之SimpleUrlHandlerMapping
1.配置文件如下 <bean id="method" class="com.xx.controller.xxxController" scope=&quo ...
- Spring基于注解的配置概述
以下内容引用自http://wiki.jikexueyuan.com/project/spring/annotation-based-configuration.html: 从Spring 2.5开始 ...
- MySQL错误日志、binlog日志、查询日志、慢查询日志简介
1.数据库的日志是帮助数据库管理员,追踪分析数据库曾经发生的各种事件的有力依据,mysql中提供了错误日志.binlog日志(二进制日志).查处日志.慢查询日志.在此,我力求解决以下问题:各个日志的作 ...
- ubuntu磁盘分区和挂载
- Office PDF如何批量删除书签
网上下了本PDF,不知道哪个傻逼每一页都做了一个书签,我真的想做个书签,看看自己做到哪一页都被搞乱了.狗日的,还没有批量删除功能. 方法就是,你定位到任意一个书签,然后按住Delete键,然后就可 ...
- 重载OverLoad。隐藏new
<1> using System; using System.Collections.Generic; using System.Linq; using System.Text; name ...
- unix时间戳(unix timestamp)与北京时间的互转方法
1.在linux bash下北京时间与unix时间戳互转: 获取unix timestamp: 命令:date "+%s" 输出:1372654714 获取北京时间: 命令:dat ...
- 在EasyUI的DataGrid中嵌入Combobox
在做项目时,须要在EasyUI的DataGrid中嵌入Combobox,花了好几天功夫,在大家的帮助下,最终看到了它的庐山真面: 核心代码例如以下: <html> <head> ...
- [Sciter] 资源引用
http://www.cnblogs.com/yinxufeng/p/fb343eecda564aa63bce0bdf15709ddf.html 方式一. 加载外部文件方式二. 加载内存方式三. 加载 ...
- OpenCV基本图像容器Mat的几种创建方法
參考文章:http://www.cnblogs.com/tornadomeet/archive/2012/07/19/2599376.html 实验说明: (引用) 本文主要讲一些opencv 2.0 ...