YUSS Round 1

A. 国庆快乐

签到题。

#include<bits/stdc++.h>

using namespace std;

int main()
{
printf("Happy 70th Anniversary of People's Republic of China");
return 0;
}

B. 买彩旗

这道题是一道基本的计算题。不少同学使用float或者double存储钱数,但其实只需要将钱数$\times10$后再除以单价$\times10$(即$46$)即可。(被除数和除数同时乘以一个数,商不变)

#include<bits/stdc++.h>

using namespace std;

int a,b;

int main()
{
scanf("%d%d",&a,&b);
printf("%d",(a*10+b)/46);
return 0;
}

C. 做作业时间

这道题同样也考察了基本的计算。

易知总时间应当是$(c\times60+d)-(a\times60+b)$分钟,那么如何将这个分钟数转化为小时+分钟的形式呢?

我们知道,在带余除法中:被除数$\div$除数$=$商$\cdots$余数。

那么,易知被除数应该是总时间,除数为小时和分钟的进率,$60$。此时,商即为小时数,余数即为分钟数。

在C++中整除运算可直接使用'/',取模运算可直接使用'%'。

#include<bits/stdc++.h>

using namespace std;

int a,b,c,d;

int main()
{
scanf("%d%d%d%d",&a,&b,&c,&d);
printf("%d %d",((c*60+d)-(a*60+b))/60,((c*60+d)-(a*60+b))%60);
return 0;
}

D. 等比数列

这道题稍有难度,考察了对循环和数学知识的使用。

因为$n\leq30$,所以可以直接用for循环计算;因为$1+2+4+8+\cdots+2{30}\leq2{31}-1$,所以用int存的下。

但是循环的方式太过复杂。

我们可以推导出:$$\sum_{i=0}{n}2i=2^{n+1}-1$$

推导过程如下:

令$A=\sum_{i=0}{n}2i$,

则$2A=\sum_{i=0}{n}2i\cdot2=\sum_{i=0}{n}2{i+1}=\sum_{i=1}{n+1}2i$

所以$A=2A-A=(\sum_{i=1}{n+1}2i)-(\sum_{i=0}{n}2i)=2{n+1}-20=2^{n+1}-1$

由此,我们可以得到这道题更为简略的代码。

在C++中,幂运算可以使用pow函数。使用方法如下:

pow(a,b)

它等价于$a^b$.

#include<bits/stdc++.h>

using namespace std;

int n,sum;

int main()
{
scanf("%d",&n);
sum=pow(2,n+1)-1;
printf("%d",sum);
return 0;
}

E.排队接水

这道题用到的算法叫做贪心。

小学奥数告诉我们,按接水用时从少到多排队,就能使总等待时间最小。

所以只需要将所有数据读入后从小到大进行排序即可。

答案应为:$$\frac{\sum_{i=1}^{n}T_i(n-i)}{n}(T_1\le T_2\le T_3\le \cdots \le T_n)$$

#include<bits/stdc++.h>

using namespace std;

int n;
double ans; struct node {
int num,time;
}p[1001]; bool cmp(node a,node b) {
if(a.time==b.time) {
return a.num<b.num;
}
else {
return a.time<b.time;
}
} void Read() {
scanf("%d",&n);
for(int i=1;i<=n;i++) {
p[i].num=i;
scanf("%d",&p[i].time);
}
} void Print() {
sort(p+1,p+n+1,cmp);
for(int i=1;i<=n;i++) {
ans+=(n-i)*p[i].time;
}
ans/=n;
printf("%.2lf",ans);
return;
} int main()
{
Read();
Print();
return 0;
}

F. 借教室

有个算法叫做二分。

举个例子,你手上有一本书,你要翻到第$x$页,假定你不知道这本书共有多少页,且无法估计这一页在书的几分之几处,那你最快翻到这一页的策略是什么?

很显然,先翻到一半的位置,看页码比你的目标页码是大了还是小了,然后再选取这本书的前(后)一半,再次对半翻……

明白这个策略了吗?如果明白了,那恭喜你,你已经学会二分这种算法了。

但是二分的使用需要一定的前提条件,这个序列必须满足单调性

但这道题还需要一个叫做差分数列的东西。

很好理解,是吧。那你把这两样东西放一起拼拼凑凑,这道题就可以了。

#include<bits/stdc++.h>
#define N 1000001 using namespace std; int L,R,mid,n,m;
int r[N],d[N],s[N],t[N],day[N]; bool Judge(int x) {
memset(day,0,sizeof(day));
for(int i=1;i<=mid;i++) {
day[s[i]]+=d[i];
day[t[i]+1]-=d[i];
}
if(day[1]>r[1]) {
return true;
}
for(int i=2;i<=n;i++) {
day[i]+=day[i-1];
if(day[i]>r[i]) {
return true;
}
}
return 0;
} long long lower_bound(int l,int r) {
while(l<r) {
mid=(l+r)/2;
if(Judge(mid)) {
r=mid;
}
else {
l=mid+1;
}
}
return r;
} void Read() {
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) {
scanf("%d",&r[i]);
}
for(int i=1;i<=m;i++) {
scanf("%d%d%d",&d[i],&s[i],&t[i]);
}
return;
} int main()
{
Read();
L=1;
R=m;
if(m!=lower_bound(L,R)) {
printf("-1\n%lld",lower_bound(L,R));
}
else {
printf("0");
}
return 0;
}

G. 中国高铁

(个人觉得这是题面写得最好的一道题。)

这题考了一个分层图。

简单来说,在未修建任意一条高铁前,你只需关注第$1$层图。

在修建了一条高铁后,你就将上面一张图中的高铁起点与下面一张图的高铁终点相连,边权为原边权的一半。

如此,最多有$k+1$张平行的图。

因为上下平行的各张图都是相同的,所以这并不影响最短路的正确性。

因为题目不要求要把$k$条高铁都修建完,所以取每张图中$dis[n]$的最小值即可。

#include<bits/stdc++.h>
#define N 60
#define M 3010
#define INF 0x3f3f3f3f using namespace std; int n,m,k,cnt,ans=INF;
int head[N],dis[N][N];
bool vis[N]; struct node {
int now,d,num;
bool operator < (const node& rhs) const {
return rhs.num<num;
}
}; struct edge {
int nxt,to,w;
}e[M]; void addEdge(int u,int v,int w) {
e[++cnt]=(edge){head[u],v,w};
head[u]=cnt;
return;
} void Read() {
memset(dis,127,sizeof(dis));
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++) {
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addEdge(u,v,w);
addEdge(v,u,w);
}
return;
} void Dijkstra() {
priority_queue <node> q;
dis[1][0]=0;
q.push((node){0,0,1});
while(!q.empty()) {
node t=q.top();
q.pop();
for(int i=head[t.num];i;i=e[i].nxt) {
if(dis[e[i].to][t.now]>t.d+e[i].w) {
dis[e[i].to][t.now]=t.d+e[i].w;
q.push((node){t.now,dis[e[i].to][t.now],e[i].to});
}
if(t.now+1<=k) {
if(t.d+e[i].w/2<dis[e[i].to][t.now+1]) {
dis[e[i].to][t.now+1]=t.d+e[i].w/2;
q.push((node){t.now+1,dis[e[i].to][t.now+1],e[i].to});
}
}
}
}
return;
} void Print() {
for(int i=0;i<=k;i++) {
ans=min(ans,dis[n][i]);
}
printf("%d",ans);
return;
} int main()
{
Read();
Dijkstra();
Print();
return 0;
}

YUSS Round 1的更多相关文章

  1. SQL Server 随机数,随机区间,随机抽取数据rand(),floor(),ceiling(),round(),newid()函数等

    在查询分析器中执行:select rand(),可以看到结果会是类似于这样的随机小数:0.36361513486289558,像这样的小数在实际应用中用得不多,一般要取随机数都会取随机整数.那就看下面 ...

  2. SQL中Round(),Floor(),Ceiling()函数的浅析

    项目中的一个功能模块上用到了标量值函数,函数中又有ceiling()函数的用法,自己找了一些资料,对SQL中这几个函数做一个简单的记录,方便自己学习.有不足之处欢迎拍砖补充 1.round()函数遵循 ...

  3. oracle的round函数和trunc函数

    --Oracle trunc()函数的用法/**************日期********************/1.select trunc(sysdate) from dual --2013- ...

  4. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  5. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  6. 【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP

    [BZOJ1662][Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁 ...

  7. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  8. mathlab之floor,ceil,round,int以及fix函数

    建议自己动手敲敲,网上很多人自己都没搞清楚然后好多错的.毕竟自己亲眼看到结果才有说服力. 以下是我亲眼见到的结果. 1.double floor(double)函数 floor()函数是常用的取整函数 ...

  9. SQL SERVER四舍五入你除了用ROUND还有其他方法吗?

    引言 今天和测试沟通一个百分比计算方式时遇到一个问题, 我在存储过程里用到了强转CAST(32.678 AS DECIMAL(5,1))  我认为该方式只会保留一位小数,我给测试的回复是我并没有用到四 ...

随机推荐

  1. python3多线程的运用

    Python3线程 很大一堆数据需要处理,加速效率使用多线程可以节省运算的时间. 多线程基础 threading.active_count() 目前多少个激活的线程 threading.enumera ...

  2. caffe windows10 vs2015 cuda8.0 ->vs2013

    http://blog.csdn.net/xjz18298268521/article/details/52190184 http://www.cnblogs.com/xuanyuyt/p/57269 ...

  3. 【VS开发】程序如何捕捉signal函数参数中指定的信号

    当说到signal的功能时,我们都知道它会捕捉我们所指定的信号,然后调用我们所指定的信号处理函数.但它是如何捕捉我们指定的信号的呢?下面我就以msdn上关于signal的example为例,说明sig ...

  4. 对spring的简单了解

    对spring的简单了解 什么是spring Spring是一个开源框架,是为了解决企业应用开发的复杂性而创建的,同时Spring也是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架 特点 ...

  5. java properties文件转义字符和中文乱码解决

    properties文件的分隔符是   =或者 : 第一次出现的就是分割符,第二次出现的也不需要转义,也即是(忽略掉[],只是着重描述字符) [\=]     [\:]   或者  [=]  [:] ...

  6. 022 Android .9图片的含义及制作教程

    1.图片(.9.png格式)的概念 (1)9patch图片是andriod app开发里一种特殊的图片形式,文件的扩展名为:.9.png (2)9patch图片的作用就是在图片拉伸的时候保证其不会失真 ...

  7. C之指针加减运算

    法则:1.指针减指针,语法正确,结果得一个整型值,表示两数值之间的对象类型的空间距离,而不是对象之间的字节数差值 2.指针加指针,语法错误,     3.指针加整形值,语法正确,表示后移N个空间单位 ...

  8. 机器学习-EM算法-GMM模型笔记

    GMM即高斯混合模型,下面根据EM模型从理论公式推导GMM: 随机变量X是有K个高斯分布混合而成,取各个高斯分布的概率为φ1,φ2,... ,φK,第i个高斯分布的均值为μi,方差为Σi.若观测到随机 ...

  9. docker 实践十一:docker 跨主机通讯

    在上一篇了解了关于 docker 的网络模型后,本篇就基于上一篇的基础来实现 docker 的跨主机通信. 注:环境为 CentOS7,docker 19.03. 本篇会尝试使用几种不同的方式来实现跨 ...

  10. windows下使用linux terminal

    windows下使用linux terminal 1.下载安装包 2.安装 3.解决乱码 0.前言 其实,写这个的目的是怕自己忘了,方便以后配置和分享 1.下载安装包 安装包下载地址: http:// ...