usaco月赛,2017.1总结

时间:2023-01-17 12:38:30

T1:跳舞的奶牛

大致题意:一个体积为k的舞台能够同时容纳k只奶牛一起跳舞,他们每头奶牛的跳舞时间不同,如果有一只奶牛跳完了第k+1头奶牛就会立刻上场跳舞,当所有奶牛跳完舞以后我们认为这次表演结束。现在给出奶牛个数,最多用时,每头奶牛的跳舞时间。求舞台最小为多大。

思路:本来写了个程序以为这道题很简单,刚开始排一下序然后就行了,结果交了以后发现只过了五组,然后才发现这道题不能改变顺序(所以说为什么我改变顺序了还是能过五组,usaco的数据也好水......),所以说我想到了堆,然后就用堆写了一下。

做法:枚举舞台的大小i(从小往大枚举,方便输出),首先舞台的大小不会大于奶牛的个数。开始时老老实实的把前i个奶牛给存进堆里,然后开一个变量(这里用bowl来说),找到堆的最小值j,让bowl=bowl+(j-bowl),j-bowl表示这头奶牛剩余的时间;然后再把下一个奶牛存进堆,这时候存的时候应该存的值是bowl+原来奶牛跳舞的时间(因为弹出奶牛的时候要j-bowl),如果到最后bowl(bowl存的其实就相当于跳舞用的总时间,但是最后一个奶牛进去堆后,别忘了台上还是有奶牛的,所以应该在想办法吧台上的奶牛跳舞所用的时间也加进去)还是小于timemaxx,那就直接输出。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue> using namespace std; priority_queue<int,vector<int>,greater<int> >q;
int a[];
int n,t; int main()
{
freopen("cowdance.in","r",stdin);
freopen("cowdance.out","w",stdout);
cin>>n>>t;
for(int i=;i<=n;i++)
cin>>a[i];
for(int i=;i<=n;i++)
{
int j;
for(j=;j<=i;j++)
q.push(a[j]);
int bowl=;
while(j<=n && bowl<=t)
{
bowl+=(q.top()-bowl);
q.pop();
q.push(a[j++]+bowl);
}
while(!q.empty())
{
bowl+=(q.top()-bowl);
q.pop();
}
if(bowl<=t){cout<<i<<endl;return ;}
}
fclose(stdin);fclose(stdout);
return ;
}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

T2:传统游戏石头剪刀布

题目大意:两只奶牛玩石头剪刀布,第一只奶牛很笨,只会出自己想出的,而第二只奶牛能够预测出第一只奶牛要出的,所以第二只能稳赢第一只。但是第二只奶牛很懒,他在一轮比赛中只想换一次手势,现在给出:

一轮中会有多少次出拳的机会;第一只奶牛出拳的顺序。

求第二只奶牛最多能胜利多少场。

思路:数据量为十万,所以必须思考一下线性的做法,但其实这道题也很简单(总觉得这回铜组的T2比较难,要手写一堆if),因为我们已经知道第一只奶牛的出拳的顺序。

把数据给的字母换成数字。然后用六个变量分别记录换手势前和后石头,剪刀,布个能赢多少次。扫一遍,边扫边判断,改变六个变量的值,然后就很简单了。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath> using namespace std; int n;
int a[];
int maxx=-;
int h1=,s1=,p1=,h2=,s2=,p2=; int max(int a,int b,int c)
{
int w=b;
if(a>b) w=a;
if(c>w) w=c;
return w;
} int main()
{
freopen("hps.in","r",stdin);
freopen("hps.out","w",stdout);
cin>>n;
for(int i=;i<=n;i++)
{
char c;
cin>>c;
if(c=='H')a[i]=;
else if(c=='S')a[i]=;
else if(c=='P')a[i]=;
}
for(int i=;i<=n;i++)
{
if(a[i]==)h2++;
if(a[i]==)s2++;
if(a[i]==)p2++;
}
for(int i=;i<=n;i++)
{
if(a[i]==){h1++;h2--;}
if(a[i]==){s1++;s2--;}
if(a[i]==){p1++;p2--;}
int ans=max(h1,s1,p1)+max(h2,s2,p2);
if(ans>maxx) maxx=ans;
}
cout<<maxx<<endl;
fclose(stdin);fclose(stdout);
return ;
}

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

T3:神奇的奶牛的代码

题目大意:奶牛们想选用一个基本的字符串,然后进行无数次的复制,复制规则如下:把已有字符串的最后一个字符放到最后,再把这串字符加到原有字符的后边,e.g.cow->cowwco->cowwcoocowwc->......

输入数据包含:基本字符串;一个整数n(n<=10^18);

求:经过无数次变换后第n个字符是什么。

思路:n<=10^18......绝对long long。然后就开始考虑了,这个怎么搞呢,首先不是按照他的套路搞一个字符串然后一直加(本人亲测,这个只能过4组,应该有优化可以多过一点,但是我本来就是写个暴力玩玩,所以没想那么多)。还是要找规律的。

就用输入样例来说:

COW -> COWWCO -> COWWCOOCOWWC
             1 2 3 4 5678                             凑合看一下吧QWQ

然后我们把最后的结果分一下COWWCOOCOWWC 表示生成的过程。这样我们发现第八个是在第三组里面(加下划线的一组,蓝色的一组,黑色的一组),也就是说,必须要进行2次才会出现第八的字符,这时候字符的总数有3*2^2,其中,3是原始字符的长度m,第一个2是一个在这道题中不会变得常数,第二个2表示要进行n次才会出现第八个字符,然后我们考虑怎么确定第八个字符在原始字符串里的位置。

根据题目我们知道,黑色字符串与蓝色字符串的区别就在于第一个O应该是在最后,那么我们设想一下,如果没有把最后一个字符放在最前边的规则,那么第八个字符在这个字符串中应该是第七个字符,而这时蓝色字符串与黑色字符串就应该是一样的,也就是说第七个字符就等于第7-6=1个字符,C。

如果让求的字符是第11个,那么根据刚才的思想这个在蓝色字符串中对应的就应该是第11-1=10-6=4个,这时候就把它转换到蓝色的字符串中了,但是因为它还是没有进到初始的字符串中,所以我们还需要继续往下分,那么又可以根据刚才的思想把它分到带下划线的字符串里,但是这是我们转换到的第四个字符是非常特殊的,因为如果根据上一段的思想的话,这个字符在还原的时候应该是第六个,也就是说这时候我们需要特判一下,不应该是4-1,而应该是让它等于3*2^1=6;然后再继续往下分。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<ctime>
#include<cstring>
#include<cmath> using namespace std; long long n;
string a;
long long k[]; int main()
{
freopen("cowcode.in","r",stdin);
freopen("cowcode.out","w",stdout);
cin>>a>>n;
k[]=;
for(int i=;i<=;i++)
k[i]=k[i-]*;
int m=a.size();
long long u=n/m;
long long w=(double)(log(u*1.0)/log(*1.0));
for(int i=;i<=;i++)
{
if(u==k[i] && n%m==) {w--;break;}
}
long long q=;
for(int i=;i<=w;i++)
q*=;
long long num=n;
while(num>m)
{
bool flag=;
for(int i=;i<=;i++)
{
if(num==(m*k[i]+)) {num=m*k[i+];flag=;break;}
}
if(!flag) num--;
num-=m*k[w--];
while(num<=m*k[w]) w--; //因为不一定你剪完以后就一定是下一个,就像样例的那样。
}
cout<<a[num-]<<endl;
fclose(stdin);fclose(stdout);
return ;
}

usaco月赛,2017.1总结的更多相关文章

  1. USACO月赛数据

    终于找到了usaco月赛的数据…… 根据月赛的名称,我们可以写出数据地址.比如08年一月的月赛即是:http://contest.usaco.org/JAN08  这里要注意区分大小写.

  2. &lbrack;题解&rsqb;某模拟题(USACO月赛部分题&plus;noip2005部分题)

    题目描述 农场上有N(1 <= N <= 50,000)堆草,放在不同的地点上.FJ有一辆拖拉机,也在农场上.拖拉机和草堆都表示为二维平面上的整数坐标,坐标值在1..1000的范围内.拖拉 ...

  3. Telephone Lines USACO 月赛

    以前做过这套题目 这个题又重新写了:http://www.cnblogs.com/jh818012/archive/2013/05/05/3182681.html 还是以前的思路 一直错在一个地方:决 ...

  4. usaco 月赛 2005 january sumset

    2013-09-18 08:23 打表找规律 w[i]:=w[i-1];  奇 w[i]:=w[i-1]+w[i div 2];     偶 //By BLADEVIL var w :..] of l ...

  5. usaco 月赛 2005 january watchcow

    2013-09-18 08:13 //By BLADEVIL var n, m :longint; pre, other :..] of longint; last :..] of longint; ...

  6. USACO月赛2005 january volume

    2013-09-18 08:12 由题可知,ans=∑i  ∑j(x[i]-x[j]) 最后整理完之后应该是不同系数的X[i]相加,所以这道题就成了求不同x[i]的系数 对于X[i],它需要减前面(i ...

  7. bzoj 1600 &amp&semi;amp&semi; Usaco 月赛 2008 建造栅栏 题解

    [原题] 1600: [Usaco2008 Oct]建造栅栏 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 785  Solved: 443 [Subm ...

  8. usaco 17&period;Jan 铜组T3

    上午在打usaco月赛的铜组题,T1T2是用来秒杀的,然而T3卡了一上午,下面给出题面: 题意大概就是输入一个N*N的矩阵,矩阵中元素只有0与1两种状态,每次操作以左上角的点为矩阵中某一矩阵的左上方顶 ...

  9. hihoCoder 1185 连通性&&num;183&semi;三(Tarjan缩点&plus;暴力DFS)

    #1185 : 连通性·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 暑假到了!!小Hi和小Ho为了体验生活,来到了住在大草原的约翰家.今天一大早,约翰因为有事要出 ...

随机推荐

  1. 【译】Java中的对象序列化

    前言 好久没翻译simple java了,睡前来一篇. 译文链接: http://www.programcreek.com/2014/01/java-serialization/ 什么是对象序列化 在 ...

  2. PLSQL Developer win7 64位 安装方法

    安装32位的Oracle客户端( instantclient-basic-win32-11.2.0.1.0).Win7 64位系统暂无PLSQLDeveloper,所以下一个32位的. 下载insta ...

  3. 一个简单的Spring测试的例子

    在做测试的时候我们用到Junit Case,当我们的项目中使用了Sring的时候,我们应该怎么使用spring容器去管理我的测试用例呢?现在我们用一个简单的例子来展示这个过程. 1 首先我们新建一个普 ...

  4. API之IP地址查询---权威的IP地址查询接口集合

    原文地址:http://yushine.iteye.com/blog/1717586 推荐实用IP138 http://www.baidu.com/s?wd=IP&rsv_spt=1& ...

  5. 正则表达式匹配URL或者网址

    正则表达式 (http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])? ...

  6. php利用自定义key,对数据加解密的方法

    客户端和服务端通信时,有个场景很常见,通过一个id作为url参数来回传递.假设现在业务上只有这个id标识,那么需要稍微安全一点的通信,对这个id进行加密传输,到服务端再进行解密.这里需要一个服务端进行 ...

  7. 1031 Hello World for U (20 分)

    1031 Hello World for U (20 分) Given any string of N (≥5) characters, you are asked to form the chara ...

  8. LevelDB场景分析1--整体结构分析

    基本用法 数据结构 class DBImpl : public DB { private:     struct CompactionState;     struct Writer;// Infor ...

  9. C&sol;S结构软件测试要点汇总

    C/S结构测试要点   1.安装/卸载: 1.安装包:完整性,安装包大小是否达到要求,显示基本信息是否正确,步骤是否明确,内容是否合理. 2.首次安装: 1)是否与其他已安装的软件冲突. 2)各种杀毒 ...

  10. &lbrack;golang note&rsqb; 包和导入

    package的作用        √ package是golang最基本的分发单位和工程管理中依赖关系的体现.        √ 每个golang源代码文件开头都拥有一个package声明,表示该g ...