T1

金币

很简单的题,控制天数这个变量

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<set>
using namespace std;
const int maxn=100010;
const int INF=0x3fffffff;
int x;
int main(){
cin>>x;
int ans=0,b=0;
for(int i=1;i<=x;i++){
for(int j=1;j<=i;j++){
ans+=i;
b++;
if(b>=x) break;
}
if(b>=x) break;
}
cout<<ans<<endl;
return 0;
}

  

T3 求和

这道题还是比较好的

涉及公式推理,推理很重要!!!!

https://blog.csdn.net/ThinFatty/article/details/53054377?locationNum=4&fps=1

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<set>
using namespace std;
const int maxn=1010;
const int INF=0x3fffffff;
//欸这种题我就只想得到暴力。。。。
//但是很明显不行的。。。仔细思考应该需要找规律,推公式。。。 简化
//很好的一道题
long long num[100001],col[10001];
struct node{
long long ab,a,b,op;
//op是出现次数,ab是预处理的sum(编号*数字),a是预处理的sum数字,b是预处理的sum标号
}d[10001][2];
int n,m;
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++) scanf("%lld",&num[i]);
for(int i=1;i<=n;i++) {
scanf("%lld",&col[i]);
d[col[i]][i%2].op++;
d[col[i]][i%2].ab+=i*num[i];
d[col[i]][i%2].a+=num[i];
d[col[i]][i%2].b+=i;
d[col[i]][i%2].ab%=10007;
d[col[i]][i%2].a%=10007;
d[col[i]][i%2].b%=10007;
};
long long ans=0;
for(int i=1;i<=m;i++){
for(int j=0;j<=1;j++){
if(d[i][j].op<2) continue;
ans+=(d[i][j].op-2)*d[i][j].ab;
ans%=10007;
ans+=d[i][j].a*d[i][j].b;
ans%=10007;
}
}
printf("%lld\n",ans);
return 0;
}

  

T4 推销员

先来分析一下题目。从题目中的样例,我们可以得到一个猜想:后面的决策一定包含前面的决策。这个结论是可以证明的,证明过程这里就不赘述了。因此,我们只需要分阶段一步步在决策中添加住户即可。对于某一个决策,我们设离入口最远的住户编号是x,编号为i的住户离入口的距离是s[i],添加的疲劳值是a[i],则要添加住户无非就是两种情况:一是在最远住户之前找一个住户添加入决策中,这样新累积的疲劳值是a[i];二是在最远住户之后找一个住户添加入决策中,这样新累积的疲劳值是a[i]+s[i]*2-s[x]*2。对于这两种情况分别找出添加的疲劳值的最大值,然后再进行选择即可。可是,用直接的方法找最大值是O(n)的,这样使得整个程序是O(n^2),又因为n可达100000,因此这个方案不可行。此时我们就可以采用优先队列来处理,将找最大值的复杂度减小到O(logn)。用两个优先队列Q1,Q2分别表示最远住户前面的住户所添加的疲劳值组成的队列和最远用户后面的住户所添加的疲劳值组成的队列,其中要注意的是,Q1中第i住户所对应的元素是a[i],而在Q2中第i住户所对应的元素是a[i]+s[i]*2。然后,对于每次决策,分别取Q1和Q2的顶端元素,比较Q1的顶元素和Q2的顶元素-s[x]*2(相当于比较a[i]和a[j]+s[j]*2-s[x]*2,即两个住户所新添加的疲劳值),如果选择最远住户前面的住户,则将答案累加后直接pop即可,如果选择最远住户后面的住户,就要注意将x后移,并将新的已成为最远住户前面住户的元素加入Q1中。在操作过程中,我们用一个v数组标记该住户是否被选过,以便在提取最大值的时候不出现重复。

根据题目的数据范围,也能知道不能暴力或者dp

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<stack>
#include<cstdio>
#include<queue>
#include<map>
#include<vector>
#include<set>
using namespace std;
const int maxn=100010;
const int INF=0x3fffffff;
//这道题的数据规模明显说明了不能用暴力或者dp
//于是思考,怎样对下一步进行选择,因为这个是一步一步的选择下去的,后面的包含前面的,每次都在还没有走过的需要消耗最多能力的那个选择
//那么怎么选择,可以分为从当前位置向前走或者是向后走,那么就有两种选择,
//向前走,不用走多余的路,那么疲惫值就是a[i]
//向后走,需要走多余的路,那么疲惫值就是a[i]+2*s[i] (当然需要剪掉)
//那么为了提高效率,设置两个优先队列,分别存储前面的和后面的疲惫之最大的
typedef pair<int,int> pa;
priority_queue<pa> q1,q2;
//priority_queue<pa> temp1,temp2;
//用一个v数组标记该住户是否被选过,以便在提取最大值的时候不出现重复
int n;
bool vis[maxn]={0};
int dis[maxn],tri[maxn];
int main(){
cin>>n;
for(int i=1;i<=n;i++) scanf("%d",&dis[i]);
for(int i=1;i<=n;i++) {
scanf("%d",&tri[i]);
q2.push(make_pair(tri[i]+2*dis[i],i)); //q2在这里放进去
}
int ans=0;
int index=0; //这个是现在到的那个地方
for(int i=1;i<=n;i++){
while(!q1.empty()&&vis[q1.top().second]) q1.pop(); //把访问过的都弹出去
while(!q2.empty()&&(vis[q2.top().second]||q2.top().second<index)) q2.pop();//访问过的并且已经小于当前的了就弹出去
int t1=-1,t2=-1;
if(!q1.empty()) t1=q1.top().first;
if(!q2.empty()) t2=q2.top().first-2*dis[index]; //两个疲惫值
if(t1>t2){ //选前面的,那么就要q1弹出去
vis[q1.top().second]=1;
ans+=t1;
q1.pop();
}
else{
vis[q2.top().second]=1;
ans+=t2;
while(index<q2.top().second){ //q1在这里放进去,现在位置之前的
q1.push(make_pair(tri[index],index));
index++;
}
q2.pop();
}
printf("%d\n",ans);
/*
temp1=q1;
while(!temp1.empty()){
cout<<temp1.top().second<<" ";
temp1.pop();
}
cout<<endl;
temp2=q2;
while(!temp2.empty()){
cout<<temp2.top().second<<" ";
temp2.pop();
}
cout<<endl;
*/
} return 0;
}

  

NOIP2015普及组的更多相关文章

  1. NOIP2015普及组总结

    NOIP2015普及组总结 这次考试总体感觉不错,不过觉得时间有点紧,在最后30分钟才打完. 第一题(金币coin):大大的W!爆搜O(N),一分钟打完: 第二题(扫雷游戏mine):同上: 第三题( ...

  2. [NOIP2015 普及组] 扫雷游戏

    [NOIP2015 普及组] 扫雷游戏 难度:入门 题目描述 扫雷游戏是一款十分经典的单机小游戏.在nn行mm列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开 ...

  3. NOIP2015普及组第四题推销员

    好久没有写博客了,今天再写一篇.还是先看题: 试题描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家 ...

  4. 洛谷【P2669】NOIP2015普及组 T1金币

    我对模拟的理解:http://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P266 ...

  5. [NOIP2015普及组]求和

    题目 题目描述 一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n.每个格子上都染了一种颜色color_i用[1,m]当中的一个整数表示),并且写了一个数字numberi. 定义一种特殊的三元组: ...

  6. NOIP2015 普及组 洛谷P2671 求和 (数学)

    一道数学题...... 采用分组的思想,我们要统计答案的数对满足两个条件:同奇偶,同颜色.所以可以按这两个要求分组. 然后就是分组处理了,对于每组(有k个数),这里面的任意两对数都是满足条件的,可推出 ...

  7. [NOIP2015] 普及组

    金币 模拟 #include<iostream> #include<cstdio> using namespace std; int main(){ int k,n; scan ...

  8. NOIP2015 普及组(Junior) 解题报告

    1. 金币 (coin.cpp/c/pas) 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天),每天收到两枚金币:之后三天(第四.五.六天),每天收到三枚金币 ...

  9. NOIP2015普及组复赛A 推销员

    题目链接:https://ac.nowcoder.com/acm/contest/243/A 题目大意: 略 分析: 方法就是把疲劳值从小到大排个序,然后从尾部开始一个一个取,当选到第i(i > ...

  10. 【NOIP2015普及组】推销员_详解

    题目 题目大意 阿明是一名推销员--螺丝街是一条直线,一端有入口,一共有 \(N(<100,000)\) 家住户,第 \(i\) 家住户到入口的距离为 \(S_i\) 米.由于同一栋房子里可以有 ...

随机推荐

  1. SourceInsight中inc文件中的符号不能同步问题

    解决方法: 打开Options->Preferences->Syntax Formatting->File Types,然后选中对应的开发语言,如C/C++ Source File, ...

  2. ORACLE之自治事务

    在创建存储过程时,可以用关键字: PRAGMA AUTONOMOUS_TRANSACTION 创建自治事务. 常用场景: 触发器抛错导致事务回滚,日志的记录需要用自治事务进行记录 代码抛错,导致数据库 ...

  3. Cloud9 3.0 SDK安装

    Cloud9 IDE是一个基于Node.JS构建的JavaScript程序开发Web IDE.它拥有一个非常快的文本编辑器支持为JS, HTML, CSS和这几种的混合代码进行着色显示.Cloud9 ...

  4. lxml.etree.XMLSyntaxError: Opening and ending tag mismatch: meta line 4 and head, line 6, column 12 报错分析与解决方案

    报错分析: 我们检查代码没有任何问题,但报错显示:开始和结束标记不匹配. html:因为html是超文本标记语言,代码不规范也能解析. python:python是编程语言,代码不规范则解析不了. 解 ...

  5. 记录:安装nginx

    练习的项目,数据都是跨域获取,上线后就不能再获取到数据,就用到nginx来做代理 注意点:        我用的是阿里云轻量服务器,防火墙在默认情况下是把80端口占据了,然而,安装nginx后,ngi ...

  6. ModuleNotFoundError: No module named 'numpy.testing.nosetester'解决方法

    在import numpy的时候编译器提示这个问题. 问题的原因是numpy版本>1.18,而scipy的版本<=0.19 解决方案: 卸载当前版本scipy(0.19),安装更高版本sc ...

  7. 光纤加速计算 383-高速信号处理板 XCKU060的双路QSFP+光纤PCIe 卡 XCKU060板卡

    基于kintex UltraScale XCKU060的双路QSFP+光纤PCIe 卡 一.板卡概述 本板卡系北京太速科技自主研发,基于Xilinx UltraScale Kintex系列FPGA   ...

  8. ORACLE查看表占用空间的大小

    查询object的大小,按照降序排序 select  * from user_segments s  where s.BYTES  is not null  order by s.BYTES desc ...

  9. vue引入swiper的报错以及swiper在vue中的交互事件处理

    安装遇到找不到 css的问题,百度查了一些帖子也不行,可能是swiper 升级6.0后的一些变化导致 安装成功的帖子:转载于:https://www.jianshu.com/p/0150d2ee109 ...

  10. Mac怎么安装Andriod模拟器

    Mac上怎么安装 Andriod 系统模拟器?有的朋友可能需要在自己用的 Mac 电脑上安装Andriod 系统模拟器,用于开发或测试一些安卓软件.介绍下怎么在 Mac 上用 Parallels De ...