USACO
慕希颜
这个作者很懒,什么都没留下…
展开
-
USCAO 2.3.1
此题要找出能用所给集合表示出来的最长前缀,想法是与给出的元素挨个比较,只要找到与之相等的就可以了。 此题有点动态规划的味道,写博客时想到的状态转移方程,设dp[i]表示主串S中从i开始的最长的可组成的前缀,dp[1]就是所求,状态转移方程: dp[i]=max{dp[j]+j-i}|i到j-1的字串是primitive。 i 下面的代码没用这个状态转移方程,但是思想跟原创 2013-04-22 18:37:38 · 518 阅读 · 0 评论 -
USCAO 2.4.5
这个题题意很简单,给出你分数,要你输出该分数的小数形式,但是写起来确实很麻烦,模拟么,没办法。 #include#include#includeusing namespace std;int n,d,res[110000],dd[1000000];int main(){ freopen("fracdec.in","r",stdin); freopen("fracdec.out","w",s原创 2013-04-22 18:38:11 · 469 阅读 · 0 评论 -
USCAO 3.1.3
求第N个大的数那就排着乘,一直乘到第N个大的数就好了 #include#include#includeusing namespace std; int main(){ freopen("humble.in","r",stdin); freopen("humble.out","w",stdout); int n,k,j,num[101],index[101],min,max,tail=0; lo原创 2013-04-22 18:38:28 · 593 阅读 · 0 评论 -
USCAO 3.1.5
第一感觉数据量大,所以就以B为所处理字符串最长界限,边读入边处理,开个统计数组记录出现次数,扫描(b-a+1)次就可以做好统计(每种长度扫一次),最后处理出现次数不为零的状态。#include#include#includeusing namespace std;long Hash[20000];//记录出现次数int A,B,N;struct NODE{ int id,size;};NODE n原创 2013-04-22 18:38:32 · 378 阅读 · 0 评论 -
USCAO 3.1.6
这是个简单的动态规划题,背包问题嘛~首先,把给的邮票按照面额从小到达拍个序,也算是一个小优化吧。理论上能够贴出的最大面额为K*Max,动态转移方程为: DP[i]=Min ( DP[i-W[j]] + 1 ) (i>=W[j] j=1..N),W[j]代表邮票j的面额,DP[i]存放要达到总面额为i所需最少的邮票数。初始状态:F[0]=0。 #include#include#includ原创 2013-04-22 18:38:37 · 425 阅读 · 0 评论 -
USCAO 3.2.1
记录最后5位非0的数,然后就继续乘下去。 #include#includeusing namespace std;int main(){ freopen("fact4.in","r",stdin); freopen("fact4.out","w",stdout); int n,k=1,temp=10; cin>>n; for(int i=1;i { k*=i; while(!(k%10原创 2013-04-22 18:38:41 · 449 阅读 · 0 评论 -
USCAO 3.2.2
用排列与组合的知识可以知道长度为N至多包含L个1的二进制数个数f[N,L]=C(1,N)+C(2,N)+...+C(L,N),如果I>f[N,L]则输出"1"且I-=f[N,L],依此类推到最后一位。 设所求串为S,假设S的位中最高位的1在自右向左第K+1位,那么必然满足F[K,L]=I,这样的K是唯一的。所以S的第一个1在从右至左第K+1位.因为有F[K,L]个串第K+1位上为0,所以所求原创 2013-04-22 18:38:43 · 438 阅读 · 0 评论 -
USACO 3.3.2
动态规划: 状态设置:F[a1][a2][a3][a4][a5]为买a1件物品1,a2件物品2,a3件物品3,a4件物品4,a5件物品5时,所需的最少价格 边界条件:F[0][0][0][0][0]=0; 状态转移方程:F[a1][a2][a3][a4][a5]=min{F[ a1-B[i][1] ][ a2-B[i][2] ][ a3-B[i][3] ][ a4-B[i][4] ][ a5原创 2013-04-22 18:39:01 · 466 阅读 · 0 评论 -
USACO 3.3.3
简单的说本题就是求最短路然后处理的问题。d[a][b][c][d]表示点(c,d)到点(a,b)最短路径,枚举一每个格子作为所有骑士的汇集点(i,j),用BFS求出骑士到汇集点的距离和,再枚举每个格子,以这个格子为王和某个骑士的相遇处(x,y),再枚举每个骑士坐标(m,n)。 求出d[i,j,x,y]+d[x,y,m,n]+max(abs(kx-x),abs(ky-y))-d[i,j,m,n]的最原创 2013-04-22 18:39:03 · 458 阅读 · 0 评论 -
USACO 3.4.2
#include#include#includeusing namespace std;ifstream fin;ofstream fout;void process(string s1,string s2){ string s3,s4; int b; if(!s1.empty()){ char a=s1[0]; b=s2.find(a); s4=s2.substr(0,b); s3=原创 2013-04-22 18:39:11 · 376 阅读 · 0 评论 -
USACO 3.4.4
动态规划,dp[i][j]表示第i张光盘用了j时间存了多少首哥,Max[i]表示第i张光盘存储歌曲最大数目。初始化时dp[i][0]=Max[i-1]。 #include #include using namespace std;int T[21],dp[21][21],Max[21];int main(){ ifstream fin("rockers.in"); ofstream fou原创 2013-04-22 18:39:15 · 557 阅读 · 0 评论 -
USCAO 2.2.3
此题根据循环数的规则判断一下就好了,挺简单的~ #include#include#include#include#includeusing namespace std;bool isrun(int a){ int length=(int)log10(a)+1; int q[10]; int vis[10]; int i=length-1,j=0; memset(vis,0,sizeof(v原创 2013-04-22 18:37:27 · 460 阅读 · 0 评论 -
USCAO 2.3.2
设dp[i,j]表示用i个点组成深度最多为j的二叉树的方法数,则:dp[i,j]=∑(dp[k,j-1]×dp[i-1-k,j-1])(k∈{1..i-2})边界条件:dp[1,i]=1要求的是深度恰好为K的方法数S,则S=dp[n,k]-dp[n,k-1]但需要注意的是,如果每次都取模,最后可能会有dp[n,k]#include#includeusing namespace std;int dp原创 2013-04-22 18:37:40 · 533 阅读 · 0 评论 -
USCAO 2.4.3
该题要求找出一条连接两个不同牧场的路径,使得连上这条路径后,这个更大的新牧场有最小的直径,并输出那个最小可能的直径。 那么,首先根据输入的数据求出联通的牧区形成的牧场,并找出每个牧场的直径,然后用一个双重循环找出符合要求的直径即可。 #include#include#includeusing namespace std;double dis(int x1,int y1,in原创 2013-04-22 18:38:07 · 525 阅读 · 0 评论 -
USCAO 3.1.1
由于前一段时间硬盘坏了所以也一直没写日志,等电脑修好后又赶上了各种考试+各种坑爹的上机+各种大作业,所以也一直没写,今天忙里偷闲,来贴一下uscao的代码~ 这个题没什么好说的很水很简单的求最小生成树,神马Prim、克鲁斯卡尔啊,总之解法一大堆,这里就不详细陈述了。 #include#include#includeusing namespace std;int n,map[10原创 2013-04-22 18:38:24 · 551 阅读 · 0 评论 -
USCAO 3.2.4
这个题可以用什么向量法解,也可以用线性代数里的克莱默法则,但是我看数据量也就100*100*100,所以枚举了~ #includeusing namespace std;int main(){ ifstream fin("ratios.in"); ofstream fout("ratios.out"); int a,b,c,d=1 int A,B,C,x1[3],x2[3],x3[3];原创 2013-04-22 18:38:49 · 522 阅读 · 0 评论 -
USACO 3.3.1
这年过的,从回家就没怎么写过东西,今天老爸在用台式机斗地主我就掏出本来写点吧。而且今天意外的发现一个问题之前我一直把USACO 写成了USCAO ……真是2到家了。 这道题是要求我们求出一条欧拉路,所以我们要首先判断图中是否有欧拉路 那么关于欧拉图:对于一个无向图,如果它每个点的度都是偶数,那么它存在一条欧拉回路;如果有且仅有2个点的度为奇数,那么它存在一条欧拉路;如果超过2个点的度为奇数原创 2013-04-22 18:38:59 · 532 阅读 · 0 评论 -
USACO 3.3.5
博弈论,当你在i到j中取了i之后,那么你就只能在i + 1到j中作为后手取值,故你所能取得的值为i + 1到j的和减去作为先手所取得的最大值。 初始化: dp[i][i] = sum[i][i] = a[i]; 状态转移方程: dp[i][j] = max(a[i] + sum[i + 1][j] - dp[i + 1][j], a[j] + sum[i][j - 1] - dp[i][j原创 2013-04-22 18:39:07 · 440 阅读 · 0 评论 -
USCAO 2.3.5
构图,每两个节点间有一条有向边,权重为股份,以每一个节点为开始节点,做一个DFS当该节点拥有某一个节点J的控制权的时候就从J开始做DFS,做完之后所有拥有股份>50%的按照要求输出。 #include#include#includeusing namespace std;int map[101][101],cnt[101],Max;bool vis[101],own[101];void d原创 2013-04-22 18:37:52 · 389 阅读 · 0 评论 -
USCAO 2.3.4
背包问题 //dp[ J ] 表示 钱的和为 J 的时候有多少种情况//对于第 I 种面值,如果用的话,那么 DP[J]= DP[J]+DP[J-w[ i ] ] ;#include#includeusing namespace std;long long dp[10002];int main(){ freopen("money.in","r",stdin); freopen("money原创 2013-04-22 18:37:50 · 500 阅读 · 0 评论 -
USCAO 2.2.4
这个题开始愣是没整明白他到底是要表述一个什么意思, 到底是刚好在第C次还是 此题总共有四种按键的情况,给个开关有按与不按两种选择,虽然此题最多有100盏灯,但是仔细观察会发现这些灯是每六个一循环的,所有总共有2^6=64种情况,所以只要判断前六个灯的情况就可以了。 之前我说过后面的题还会用到位运算,那么此题我们同样用位运算来模拟灯的状态,0表示关,1表示开。 对于四种操作:原创 2013-04-22 18:37:34 · 574 阅读 · 0 评论 -
USCAO 2.3.3
三种方法,DFS一下 #include#include#includeusing namespace std;int n;void dfs(int deep,int sum,int num,string s){ if(deep==n) { if(sum+num==0) cout return; } if(num>0) dfs(deep+1,sum,num*10+deep+1,s+原创 2013-04-22 18:37:42 · 429 阅读 · 0 评论 -
USCAO 2.4.1
模拟题,状态只有10*10*4=400种,两个人最多400*400=160000种,也就是说,如果超过160000步,那么肯定会出现有的状态出现了2次以上,那么就肯定是一个死循环,永远不会相遇。 #include#include#includeusing namespace std;int main(){ freopen("ttwo.in","r",stdin); freopen("ttw原创 2013-04-22 18:37:59 · 478 阅读 · 0 评论 -
USCAO 2.4.2
用BFS求出每一点到两个出口的最短路径然后再在每个点的路径中找出最长的,这里用的是以出口为起点的BFS。 #include#include#include#includeusing namespace std;struct NODE{ int x,y,w;};NODE node[204][80];NODE door[2];char map[204][80];int dis1[][2]={0原创 2013-04-22 18:38:05 · 411 阅读 · 0 评论 -
USCAO 2.4.4
此题甚水,求最短路径即可,注意在读入数据的时候若遇上两点之间有多条路经将路径更新为最短路径。 #include #include using namespace std; int ord(char c){ if ((c>='a')&&(c if ((c>='A')&&(c} int main(){ ifstream fin("comehome.in"); ofst原创 2013-04-22 18:38:09 · 557 阅读 · 0 评论 -
USCAO 3.1.2
此题为背包问题,动态规划解决之~ #include#include#includeusing namespace std;int main(){ freopen("inflate.in","r",stdin); freopen("inflate.out","w",stdout); int m,n,dp[10001],cord,time; memset(dp,0,sizeof(dp)); c原创 2013-04-22 18:38:26 · 465 阅读 · 0 评论 -
USCAO 3.1.4
本题题意很容易理解,苦于数据量比较大,并且人家有提示如果存储所有数据的话超内存。本题不仅在时间上很苛刻,在空间上的障碍也是较大的制约。所以,在这里我们可以借鉴题意中的表示方法,仅记录一个色块左下角坐标和右上角坐标,也就是离散化,然后倒序染色,以逆序来进行放置,即n to 1。逆序的好处在于放置一个矩形后,俯视看到的就是最终俯视该矩形应该看到的。因为挡着它的矩形在之前已经放置好了,所以可直接统计,可原创 2013-04-22 18:38:30 · 478 阅读 · 0 评论 -
USCAO 3.2.3
模拟题,5个轮子同时转,假设从最外面的轮子上所有的洞都有一束激光射入,那么依次检查其他轮子的孔是否对上用0 1模拟就可以,每次旋转一个轮子上的孔的起始位置都加上该轮子的旋转速度。当时间过去360秒后如果没有符合条件的则输出none。 #include #include using namespace std; int main() { ifstream fin("spin.in原创 2013-04-22 18:38:47 · 454 阅读 · 0 评论 -
USCAO 3.2.5
这种题应该见过不少了,脑子里的第一个反应就是BFS!就好象走迷宫一样嘛,求最短的路径。判重可以用hash表,将8个数转成一个8位数然后模一个大数。至于BFS就不说了,维护一个队列就好了~ #include#includeusing namespace std;bool hash[170537];struct node{ int data[9]; int pre;//记录前驱 int con原创 2013-04-22 18:38:52 · 533 阅读 · 0 评论 -
USCAO 3.2.6
要求的那个农场,我没想到设么好的方法,挨个把每个农场作为起点,跑一边dijkstra,选出最小值,就好了,至于dijkstra的实现也不局限与一种,在这里我用的优先级队列,节点安排用的向前星。 #include#include#includeusing namespace std;struct EDGE{ int u,v,next; long long w;};EDGE edge[3000];st原创 2013-04-22 18:38:54 · 453 阅读 · 0 评论 -
USACO 3.3.4
dp[i][j]为以(i,j)为右下角顶点的正方形的最大边长。状态转移方程:dp[i][j]=min(dp[i-1][j],min(dp[i][j-1],dp[i-1][j-1]))+1;其中,dp[i-1][j] , dp[i][j-1] , dp[i-1][j-1]分别为(i,j)向上、向左、向左上一格的状况。 在当且仅当三者都为1的时候,正方形才能扩充。 #include#includeu原创 2013-04-22 18:39:05 · 458 阅读 · 0 评论 -
USACO 3.4.1
自己不太会计算几何,借鉴了一下别人的方法, 1.判断多边形是否合法 任两条边都不相交即合法,注意这里的相交是严格相交,顶点相交不算相交。 2.能看到哪些边 扫描线处理 #include#include#includeusing namespace std;ifstream fin("fence4.in");ofstream fout原创 2013-04-22 18:39:09 · 463 阅读 · 0 评论 -
USCAO 2.1.2
十一长假的最后一天我来贴个水题~~ #include#include#include#includeusing namespace std;mapp;int n,cnt=0;struct node{ int x,y; double w;}fra[100000];bool cmp(node a,node b){ return a.w}int main(){ freopen("frac1.in原创 2013-04-22 18:36:58 · 429 阅读 · 0 评论 -
USCAO 2.1.3
排序额,简单点想,假设共有N个数那么就有N个位置用来存放数字,那么我们就考虑该位置该放的数有木有放对,例如:该放数字3的位置是不是放的数字3,如果不是那么该位置就要交换一次。不要去考虑数字,这样会晕的。 #include#include#include#includeusing namespace std;int main(){ freopen("sort3.in","r",stdin);原创 2013-04-22 18:37:00 · 482 阅读 · 0 评论 -
USCAO 2.1.4
在写这个题之前我想问一下,有没有知道在贴代码的时候如何使代码排版风格与原来保持一致,尤其是缩进,原来是按tab键的地方放到博客里就变成了一个空格,这样会显得代码很没有层次感。。。。求教。。。 这个题的意思大概是给出奶牛所需的各种维生素的数量和各种饲料里含有的各种维生素的量,要求你找出一种配料方案来使得用到的饲料种类最小且能满足奶牛对各种维生素的需求。 对于每种饲料只有两原创 2013-04-22 18:37:06 · 556 阅读 · 0 评论 -
USCAO 2.1.5
这道题要求每两个数之间海明距离要达到D,那只好两两比较咯,不符合要求就踢咯,N^2的时间复杂度~,至于如何判定两个数之间的海明距离,那么就用异或吧~ #include#includeusing namespace std;int n,b,d,ans[65],Max,len=1;int dis(int a,int b){ int temp=a^b;//异或求不同位 ,即海明距离 int su原创 2013-04-22 18:37:10 · 466 阅读 · 0 评论 -
USCAO 2.2.1
这是USCAO里又一道模拟题吧,看题就能够把人给看晕了,所以要仔细的把思路理好,模拟题就是按照题意的要求一步步来就好了,就是繁琐了点~ /* ID:boatswa2 PROG:preface LANG:C++ */#include#includeusing namespace std;int n;int C=0,D=0,M=0,I=0,L=0,X=0,V=0;char b[100];voi原创 2013-04-22 18:37:21 · 517 阅读 · 0 评论 -
USCAO 2.2.2
首先这个题首先有一个优化就是:n个数的总和为sum:=n*(n+1)div 2,当且仅当sum为偶数的时候才有解,sum为奇数时直接输出0并且退出程序;但是这样做了也还是会超时。 那么仔细分析一下这个题是一个0/1背包的问题,将一个集合划分成 两个“元素总和相等”的集合,设原集合的元素总和为sum,则划分后的集合的元素综合都为sum/2。那么我们可以把sum/2看成背包的容量,原集合原创 2013-04-22 18:37:23 · 497 阅读 · 0 评论 -
USACO 3.4.3
用y=1...m这些直线截题中的两条线段,算出x坐标的差值,取整。 #include using namespace std;int main(){ ifstream fin("fence9.in"); ofstream fout("fence9.out"); double m,n,p; int count = 0; fin>>n>>m>>p; for(int i=1;i { doubl原创 2013-04-22 18:39:13 · 523 阅读 · 0 评论