USACO section 1.1 C++题解
USACO section1.1:
DONE 2017.03.03 TEXT Submitting Solutions
DONE 2017.03.04 PROB Your Ride Is Here [ANALYSIS]
DONE 2017.03.04 TEXT Contest Problem Types
DONE 2017.03.04 TEXT Ad Hoc Problems
DONE 2017.03.04 PROB Greedy Gift Givers [ANALYSIS]
DONE 2017.03.04 PROB Friday the Thirteenth [ANALYSIS]
DONE 2017.03.04 PROB Broken Necklace [ANALYSIS]
由上可见section1.1中共有四道题,没有考察算法,只是单纯看思考是否到位以及细心程度。
Prob1:Your Ride Is Here(水题)
题意:input给出两个全部由大写字母组成的单词, 每个字母对应一个数字(A-1,B-2……),
两个单词中的字母分别相乘,得到两个数字, 判断这两个数字%47的余数是否相等。
NOTE:由于数据很小,无须担心溢出,但是保险起见,还是在每次运算的过程中取余。(a%b)*(c%b) = (a*c)%b;
源代码:
/*
ID:kongse_1
PROG:ride
LANG:C++
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MOD = ;
string a, b;
int num1= ,num2=;
int main()
{
freopen("ride.in", "r", stdin);
freopen("ride.out", "w", stdout);
cin >> a >> b;
for(int i = ; i != a.size(); ++i)
num1 = (num1*(a[i]-'A'+))%MOD;
for(int i = ; i != b.size(); ++i)
num2 = (num2*(b[i]-'A'+))%MOD;
if(num1 == num2) cout << "GO" << endl;
else cout << "STAY" << endl;
fclose(stdin);
fclose(stdout);
return ;
}
Prob2:Greedy Gift Givers (水题)
题意:有n个人,没人开始身上有0块钱,每个人选择掏出x的钱给他指定的n个人买礼物,他指定的人每个人得到x/n块钱,若除不尽(x%n)则多出来的零钱归他自己。输出一轮之后每个人对应的钱数(可以是负的...)。
P.S:本来开始想要用map做一一映射,结果map自带排序,把原来输入的顺序搞没了,于是乎只能拿俩数组维护。
源代码:
/*
ID:kongse_1
PROG:gift1
LANG:C++
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = ;
string x[maxn], y[maxn], z;
int num, sum, n, money[maxn];
int find_(string curr)
{
for(int i = ; i != num; ++i)
{
if(x[i] == curr) return i;
}
}
void calculate_(int a, int b)
{
money[a] -= b;
return ;
}
int main(){
freopen("gift1.in", "r", stdin);
freopen("gift1.out", "w", stdout);
cin >> num;
for(int i = ; i != num; ++i)
{
cin >> x[i];
}
for(int i = ; i != num; ++i)
{
cin >> z >> sum >> n;
if(n)
{
calculate_(find_(z), sum-sum%n);
for(int j = ; j != n; ++j)
{
cin >> y[j];
calculate_(find_(y[j]), -sum/n);
}
}
}
for(int i = ; i != num; ++i)
{
cout << x[i] << " " << money[i] << endl;
}
fclose(stdin);
fclose(stdout);
return ;
}
Prob3:Friday the Thirteenth
题意:已知1900年1月1日是周一,统计包括1900年在内的N年间,每月13号是周一——周日的次数。
NOTE1:得到1900年1月13日是周六,根据每个月的天数算出下一个月13日是星期几,注意判断闰年即可。
NOTE2:如果按照每年作为单位一步步求,会出现一个问题:每一年算的第12次实际上算的是下一年的1月13日(+31即是度过了12月份到了一月),所以算的最后一年的循环要特判。
源代码:
/*
ID:kongse_1
PROG:friday
LANG:C++
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = ;
int month[maxn]={,,,,,,,,,,,,}, N, times[maxn], curr = ;
int whether(int year)
{
if(year% == || (year% == && year% != )) return ;
return ;
}
void caculate_(int year)
{
if(year == +N) return ;
if(whether(year)) month[] = ;
else month[] = ;
for(int i = ; i != ; ++i)
{
curr = (curr+month[i])%;
if(i == && year == +N-) break;
++times[curr];
}
caculate_(year+);
}
int main()
{
freopen("friday.in", "r", stdin);
freopen("friday.out", "w", stdout);
cin >> N;
++times[];
caculate_();
cout << times[] << " ";
for(int i = ; i != ; ++i)
{
cout << times[i];
if(i != ) cout << " ";
}
cout << endl;
fclose(stdin);
fclose(stdout);
return ;
}
Prob4:Broken Necklace(有点意思)
题意:一串项链有三种颜色:红(r),蓝(b),白(w)。从中间某一处断开,从断开的两边分别去从头取颜色相同的珠子(两边右的可摘取数,然后从两个序列中找到a[i]+b[i+1]最大值(因为是从中间断的两川,所以一定是相邻的且向左的是第i个,向右的是第(i+1)%n)个。(注意,这是一串项链,首尾相连,是个循环队列)。
而算出没一个的向左区和向右取的值也很简单,不需要每个都算,例如算出第i个可以向左取m个,那么第(i-1)个,即他的左边一定只能取(m-1)个(m!=1),m = 1即只有自己。当出现左边的颜色与当前颜色不同时再重新计算。但是有一个例外。
我们观察这样的一串:bbwbwrrwrwr 第一个b是5,第五个w则应该是1,但是事实上第五个应该是7,因为它跟右边的红色也可以相连。所以我们得到特判:当上一个是2并且当前是白色(w)时应重新计算(即w是某队队尾)。
源代码:
/*
ID:kongse_1
PROG:beads
LANG:C++
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cstdlib>
using namespace std;
const int maxn = ;
string x;
int n, num[][maxn], max_;
int whether(char a, char b)
{
if(a+b == 'r'+'b') return ;
return ;
}
void calculate_(int curr, string y)
{
char last = x[curr];
if(y == "left")
{
int wh = ;
num[wh][curr] = ;
for(int i = (curr-+n)%n;i != curr ; i = (i-+n)%n)
{
if(x[i] == last || x[i] == 'w' || last == 'w')
{
if(last == 'w') last = x[i];
++num[wh][curr];
}
else break;
}
}
else
{
int wh = ;
num[wh][curr] = ;
for(int i = (curr+)%n; i != curr ; i = (i++n)%n)
{
if(x[i] == last || x[i] == 'w' || last == 'w')
{
if(last == 'w') last = x[i];
++num[wh][curr];
}
else break;
}
}
return ;
}
int main()
{
freopen("beads.in", "r", stdin);
freopen("beads.out", "w", stdout);
cin >> n >> x;
for(int i = ; i != n; ++i)
{
if( !i || (num[][(i-+n)%n] == && x[i] == 'w') || whether(x[(i-+n)%n],x[i]) )
calculate_(i, "right");
else num[][i] = num[][i-]-;
}
for(int i = n-; i != -; --i)
{
if( i == n- || (num[][(i+)%n] == && x[i] == 'w') || whether(x[(i+)%n],x[i]) )
calculate_(i, "left");
else num[][i] = num[][i+]-;
}
for(int i = ; i != n; ++i){
max_ = max(max_, num[][i]+num[][(i-+n)%n] );
}
cout <<((max_<n)?max_:n) << endl;
fclose(stdin);
fclose(stdout);
return ;
}
自此,USACO section1.1便全部完成了。
箜瑟_qi 2016.03.04
USACO section 1.1 C++题解的更多相关文章
- USACO Section 1.3 题解 (洛谷OJ P1209 P1444 P3650 P2693)
usaco ch1.4 sort(d , d + c, [](int a, int b) -> bool { return a > b; }); 生成与过滤 generator&& ...
- [IOI1996] USACO Section 5.3 Network of Schools(强连通分量)
nocow上的题解很好. http://www.nocow.cn/index.php/USACO/schlnet 如何求强连通分量呢?对于此题,可以直接先用floyd,然后再判断. --------- ...
- bzoj usaco 金组水题题解(1)
UPD:我真不是想骗访问量TAT..一开始没注意总长度写着写着网页崩了王仓(其实中午的时候就时常开始卡了= =)....损失了2h(幸好长一点的都单独开了一篇)....吓得赶紧分成两坨....TAT. ...
- USACO Section 3.3: Riding the Fences
典型的找欧拉路径的题.先贴下USACO上找欧拉路径的法子: Pick a starting node and recurse on that node. At each step: If the no ...
- USACO Section 3.3 Camlot(BFS)
BFS.先算出棋盘上每个点到各个点knight需要的步数:然后枚举所有点,其中再枚举king是自己到的还是knight带它去的(假如是knight带它的,枚举king周围的2格(网上都这么说,似乎是个 ...
- USACO Section 5.3 Big Barn(dp)
USACO前面好像有类似的题目..dp(i,j)=min(dp(i+1,j),dp(i+1,j+1),dp(i,j+1))+1 (坐标(i,j)处无tree;有tree自然dp(i,j)=0) .d ...
- USACO Section 1.3 Wormholes 解题报告
题目 题目描述 在一个二维平面上有N个点,这N个点是(N/2)个虫洞的端点,虫洞的特点就是,你以什么状态从某个端点进去,就一定会以什么状态从另一端的端点出来.现在有一头牛总是沿着与X轴正方向平行的直线 ...
- USACO Section 1.3 Prime Cryptarithm 解题报告
题目 题目描述 牛式的定义,我们首先需要看下面这个算式结构: * * * x * * ------- * * * <-- partial product 1 * * * <-- parti ...
- USACO Section 1.1 Your Ride Is Here 解题报告
题目 问题描述 将字符串转变为数字,字母A对应的值为1,依次对应,字母Z对应的值为26.现在有一个字符串,将其中的每个字符转变为数字之后进行累乘,最终的结果对47求余数. 题目给你两个字符串,其中的字 ...
随机推荐
- SQL动态语句 拼接SQL 并输入输出值
--动态语句语法 /****************************************************************************************** ...
- oracle数据库如何打印九九乘法表
对于九九乘法表,相信对于懂IT的人并不陌生,但是外行可能会有很多的不懂,c语言也同样需要了解,它是学习的入门课程,oracle数据库书写九九乘法表有好几种方式,下面就有我为大家介绍,一起来看看吧. 九 ...
- Unity 3D Framework Designing(2)——使用中介者模式解耦ViewModel之间通信
当你开发一个客户端应用程序的时候,往往一个单页会包含很多子模块,在不同的平台下,这些子模块又被叫成子View(视图),或者子Component(组件).越是复杂的页面,被切割出来的子模块就越多,子模块 ...
- 安装vnc远程连接CentOS桌面
1.查看本机是否有安装vnc(centOS5默认有安装vnc) rpm -q vnc vnc-server 如果显示结果为: package vnc is not installedvnc-serve ...
- IE6 margin 双倍边距解决方案
一.什么是双边距Bug? 先来看图: 我们要让绿色盒模型在蓝色盒模型之内向左浮动,并且距蓝色盒模型左侧100像素.这个例子很常见,比如在网页布局中,侧边栏靠左侧内容栏浮动,并且要留出内容栏的宽度.要实 ...
- 视频swiper轮播
关于本次文章的内容,实际上是咪咕阅读详情页中的一个前端需求要做的效果,不过比起原需求,此次案例已经被删减掉许多部分了.音频部分舍弃,调用客户端接口舍弃,并做一些整理.最后留下的是这个精简版的案例.方便 ...
- Unity3D对弈游戏:狼吃羊游戏
简介 中文名:狼与羊 英文名称:Wolves&Sheep 游戏类型:休闲/棋类 玩家人数:单人或双人 游戏下载:Windows.Android 游戏描述:童年时与小伙伴常玩的一种游戏,游戏简单 ...
- salesforce中soql及sosl的伪‘Like’模糊检索
salesforce里有soql.sosl两种查询语法,soql针对模糊搜索也有‘like’关键字,然而只能针对其自带字段如:Name.Id:对于自定义添加的字段如:Message__c.Note__ ...
- 简学Python第七章__class面向对象高级用法与反射
Python第七章__class面向对象高级用法与反射 欢迎加入Linux_Python学习群 群号:478616847 目录: Python中关于oop的常用术语 类的特殊方法 元类 反射 一.P ...
- Alamofire源码解读系列(十一)之多表单(MultipartFormData)
本篇讲解跟上传数据相关的多表单 前言 我相信应该有不少的开发者不明白多表单是怎么一回事,然而事实上,多表单确实很简单.试想一下,如果有多个不同类型的文件(png/txt/mp3/pdf等等)需要上传给 ...