NOIP2015普及组
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普及组的更多相关文章
- NOIP2015普及组总结
NOIP2015普及组总结 这次考试总体感觉不错,不过觉得时间有点紧,在最后30分钟才打完. 第一题(金币coin):大大的W!爆搜O(N),一分钟打完: 第二题(扫雷游戏mine):同上: 第三题( ...
- [NOIP2015 普及组] 扫雷游戏
[NOIP2015 普及组] 扫雷游戏 难度:入门 题目描述 扫雷游戏是一款十分经典的单机小游戏.在nn行mm列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格).玩家翻开 ...
- NOIP2015普及组第四题推销员
好久没有写博客了,今天再写一篇.还是先看题: 试题描述 阿明是一名推销员,他奉命到螺丝街推销他们公司的产品.螺丝街是一条死胡同,出口与入口是同一个,街道的一侧是围墙,另一侧是住户.螺丝街一共有 N 家 ...
- 洛谷【P2669】NOIP2015普及组 T1金币
我对模拟的理解:http://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.luogu.org/problemnew/show/P266 ...
- [NOIP2015普及组]求和
题目 题目描述 一条狭长的纸带被均匀划分出了n个格子,格子编号从1到n.每个格子上都染了一种颜色color_i用[1,m]当中的一个整数表示),并且写了一个数字numberi. 定义一种特殊的三元组: ...
- NOIP2015 普及组 洛谷P2671 求和 (数学)
一道数学题...... 采用分组的思想,我们要统计答案的数对满足两个条件:同奇偶,同颜色.所以可以按这两个要求分组. 然后就是分组处理了,对于每组(有k个数),这里面的任意两对数都是满足条件的,可推出 ...
- [NOIP2015] 普及组
金币 模拟 #include<iostream> #include<cstdio> using namespace std; int main(){ int k,n; scan ...
- NOIP2015 普及组(Junior) 解题报告
1. 金币 (coin.cpp/c/pas) 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天),每天收到两枚金币:之后三天(第四.五.六天),每天收到三枚金币 ...
- NOIP2015普及组复赛A 推销员
题目链接:https://ac.nowcoder.com/acm/contest/243/A 题目大意: 略 分析: 方法就是把疲劳值从小到大排个序,然后从尾部开始一个一个取,当选到第i(i > ...
- 【NOIP2015普及组】推销员_详解
题目 题目大意 阿明是一名推销员--螺丝街是一条直线,一端有入口,一共有 \(N(<100,000)\) 家住户,第 \(i\) 家住户到入口的距离为 \(S_i\) 米.由于同一栋房子里可以有 ...
随机推荐
- CAD坐标显示不全怎么办?CAD坐标常见问题解答!
今天小编来和大家聊一下浩辰CAD看图王中关于CAD坐标的那些事,比如:CAD坐标为何显示不全?CAD坐标显示结果和之前不一样?以及不能精准捕捉CAD坐标等情况,应该如何轻松解决?今天就和小编一起来了解 ...
- corkscrew在ssh中发生错误
使用绝对路径 ProxyCommand="corkscrew 127.0.0.1 12345 jump.123.com 2020" abc@efg.com 改为 ProxyComm ...
- nginx转发端口路由器再转发
场景 nginx 转发端口 路由器二次转发了,端口不一样 (shiro 或者其他一些权限控制架构会自动跳转,导致的端口不对.) proxy_set_header Host $host:$proxy_p ...
- vs code for macOS的安装
参考下载链接:http://www.pc6.com/mac/147684.html 汉化方法: 中文设置方法(如下图)在插件设置的搜索栏中输入"chinese",选择第一个简体中文 ...
- C# Linq不同类型数组之间的转换
string[] strArray = "a,b,c,d,e,f,g".Split(new char[]{ ',' }); int[] intArray; //C# 3.0下用此句 ...
- PI ID关联IR配置问题
例如问题:无数据 1.软件组织生成的id与ID配置id不一致(由于删除软件组织重新创建) 1.1找到需要修改位置 1.2 IR查询id 1.3 替换指定需要插入'-'
- 32.自定义Java异常捕获处理类及其使用
自定义异常捕获处理类 /** * <h1>异常捕捉</h1> * */ public class ExceptionHandler implements Thread.Unca ...
- JS日期格式化方法 封装
//--------------------------------------------------- // 日期格式化 // 格式 YYYY/yyyy/YY/yy 表示年份 // MM/M 月份 ...
- Java流程控制之用户交互Scanner
Scanner对象 java.util.Scanner是Java5的新特征,可以通过Scanner类来获取用户的输入 #基本语法# Scanner s = new Scanner(System.in) ...
- pyhon_元组(tuple)
定义: 元组中可以存储不一样类型的数据,使用小括号存储数据,中间用逗号进行分割. 元组中的数据定义好后,无法进行修改,有保护数据的目的. 格式化字符串定义多个值的时候,本质上也是元组. 测试: inf ...