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的更多相关文章

  1. Luogu USACO Training 刷水记录

    开个坑记录一下刷USACO的Training的记录 可能会随时弃坑 只有代码和做法简述 可能没有做法简述 [USACO1.1]你的飞碟在这儿Your Ride Is He… 模拟,细节已忘 #incl ...

  2. 搜索刷题记录by cellur925

    我好菜啊!连暴搜都不会! 注意边界退出! 特开此帖,记录搜索学习之路!(逃) 1.全排列 2.八皇后 3.数的划分 由于此题有同一划分方法算一个的限制,我们为了避免搜多,可以使搜出的结果满足单调不降性 ...

  3. PE刷题记录

    PE刷题记录 PE60 / 20%dif 这道题比较坑爹. 所有可以相连的素数可以构成一张图,建出这张图,在其中找它的大小为5的团.注意上界的估算,大概在1W以内.1W内有1229个素数,处理出这些素 ...

  4. leetcode刷题记录--js

    leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...

  5. Leetcode刷题记录(python3)

    Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...

  6. 刷题记录:[HarekazeCTF2019]encode_and_encode

    目录 刷题记录:[HarekazeCTF2019]encode_and_encode 一.知识点 JSON转义字符绕过 php伪协议 刷题记录:[HarekazeCTF2019]encode_and_ ...

  7. 刷题记录:[De1CTF 2019]Giftbox && Comment

    目录 刷题记录:[De1CTF 2019]Giftbox && Comment 一.知识点 1.sql注入 && totp 2.RCE 3.源码泄露 4.敏感文件读取 ...

  8. 刷题记录:[强网杯 2019]Upload

    目录 刷题记录:[强网杯 2019]Upload 一.知识点 1.源码泄露 2.php反序列化 刷题记录:[强网杯 2019]Upload 题目复现链接:https://buuoj.cn/challe ...

  9. 刷题记录:[XNUCA2019Qualifier]EasyPHP

    目录 刷题记录:[XNUCA2019Qualifier]EasyPHP 解法一 1.error_log结合log_errors自定义错误日志 2.include_path设置包含路径 3.php_va ...

随机推荐

  1. LightOJ1094 - Farthest Nodes in a Tree(树的直径)

    http://lightoj.com/volume_showproblem.php?problem=1094 Given a tree (a connected graph with no cycle ...

  2. Apache 处理svg工具包Apache(tm) Batik SVG Toolkit

    Apache™ Batik SVG Toolkit¶ Overview¶ Batik is a Java-based toolkit for applications or applets that ...

  3. linux文件描述符fd(windows下的句柄)

    在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件.链接文件和设备文件 fd:file descriptor 文件描述符0,1,2分别给了标准输入.标准输出和错误输出. ls - ...

  4. 我和 HelloGitHub

    我? 我是一个本科学历.无大厂经历,普通的 Python 程序员. 虽然是计算机专业,但是大学玩了四年(Dota)后,发现自己无一技能傍身,要饿死啦!偶然间接触了 Python 这门编程语言,发现编程 ...

  5. Meteor事件

    使用事件是非常简单的.我们将学习如何使用tag,class 和id作为事件选择器. 让我们创建HTML模板三大要素.第一个是 p 标签,第二个是 myClass 类,最后一个是myId. meteor ...

  6. curl 中文乱码

    curl 中文乱码 学习了:https://blog.csdn.net/thc1987/article/details/52583789 学习了: http://blog.itpub.net/2903 ...

  7. Echarts 的样例

    jsp页面: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8 ...

  8. css中使input输入框与img(图片)在同一行居中对齐

    input,img{vertical-align:middle;},同时设置input和img的vertical-align属性,兼容ie7

  9. APUE 线程 - 程序清单

    APUE 线程 - 程序清单 程序清单11-1 打印线程ID #include "util.h" #include<pthread.h> pthread_t ntid; ...

  10. seajs载入流程图

    近期读seajs源代码,整理出了主要逻辑的流程图(注意:是逻辑示意图).感兴趣的朋友能够看看,欢迎批评指正~ http://www.gliffy.com/go/publish/image/607216 ...