2017-8-31 NOIP模拟赛
可接受序列
【题目描述】
让计算机这样读入一列非负整数:
1、读入数T。
2、接着往下读入T个数。
3、如果数列读完了,则停止,否则,转到1。
但是,往往会出现这样的问题:执行第2步时,数列已经没有T个数了。如果这样,我们称这个数列是“不可接受的”,否则,称它是“可接受的”。我们需要用最少的步数把一个数列变成“可接受的”,一步是指:
1、把数列中的某一个数加1。
2、把数列中的某一个数减1。
【输入格式】
第一行有一个数N (1<=N<=1000000),表示数列的长度,接下来有n行,描述这个数列,每一行有一个非负整数(不超过1000000)。
【输出格式】
仅一个数,表示最少的步数。
【输入输出样例】
sequence.in |
sequence.out |
7 3 1 2 3 4 5 6 |
1 |
【数据规模】
对于50%的数据,N≤1,000;
对于80%的数据,N≤100,000;
对于100%的数据,N≤1,000,000。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
using namespace std;
int n,a[];
long long ans=;
void dfs(int pos,long long cnt){
if(cnt>=ans)return;
//if(pos>n)return;
if(pos==n+){
ans=min(ans,cnt);
return;
}
if(pos==n){
dfs(pos+,cnt+a[pos]);
return;
}
for(int i=;i+pos<=n+;i++){
int step=abs(a[pos]-i);
dfs(pos+i+,cnt+step);
}
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
dfs(,);
cout<<ans;
return ;
}
20分 暴力深搜
/*
由于走到某个数字的最小操作数只与那个走到它的数字有关,所以问题满足无后效性,问题可以转变为问走到第n+1个位置的最小操作数。
f[i]表示走到第i个数字的最小操作数,那么可以以它为中心来更新后面位置的最小操作数,答案为f[n+1]
*/
#include<cstdio>
const int maxn=;
int n;
int s[maxn],f[maxn];
int main(){
freopen("sequence.in","r",stdin);
freopen("sequence.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d",&s[i]);
f[i]=maxn;
}
int a,b,c;
f[]=,f[n+]=maxn;
for(int i=;i<=n;i++){
a=i+s[i]+;
b=f[i];
if(a>n+){
c=a-n;
for(int j=n+;j>i&&f[j]>n-j+b+c;j--)f[j]=n-j+b+c;
}
else if(f[a]>b){
f[a]=b;
for(int j=a-;j>i&&f[j]>a-j+b;j--)f[j]=a-j+b;
for(int j=a+;j<=n+&&f[j]>j-a+b;j++)f[j]=j-a+b;
}
}
printf("%d\n",f[n+]);
return ;
}
100分 dp
促销
【题目描述】
某某商场搞了一个促销活动,促销活动以以下方式进行:
- 一个想要参加活动的顾客将他的发票扔进抽奖箱里。
- 在每天的最后,从抽奖箱里抽出两张发票:
a) 金额最大的发票a
b) 金额最小的发票b
- 金额最大的发票的持有者得到a-b的奖金。
每天被抽出的发票都不会再被放回抽奖箱里。
你想知道促销活动结束时一共付出了多少奖金。
【输入格式】
第一行一个N,促销进行的天数;
接下来N行,第一个数是一个ki,表示第i天收到的发票数;接下来ki个数,每个数是一个发票的金额。
【输出格式】
一个数,整个促销活动过程中一共付出了多少奖金。
【输入输出样例】
promotion.in |
promotion.out |
5 3 1 2 3 2 1 1 4 10 5 5 1 0 1 2 |
19 |
【数据规模】
对于30%的数据,发票总数M不超过2000;
对于另外20%的数据,每张发票的金额不超过2000;
对于100%的数据,发票总数M不超过1000000,每张发票的金额不超过1000000。
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
priority_queue<int>heap1;
priority_queue<int>heap2;
int n;
long long ans;
int main(){
//freopen("Cola.txt","r",stdin);
freopen("promotion.in","r",stdin);
freopen("promotion.out","w",stdout);
scanf("%d",&n);
int x,y;
for(int i=;i<=n;i++){
scanf("%d",&x);
for(int j=;j<=x;j++){
scanf("%d",&y);
heap1.push(y);
heap2.push(-y);
}
int a,b,a1,b1;
a=heap1.top();heap1.pop();
b=heap2.top();heap2.pop();
if(a!=-b){
ans+=a+b;
continue;
}
a1=heap1.top();heap1.pop();
b1=heap2.top();heap2.pop();
if(a+b1>b+a1){
heap1.push(a1);
heap2.push(b);
ans+=a+b1;
continue;
}
else {
heap1.push(a);
heap2.push(b1);
ans+=a1+b;
continue;
}
}
cout<<ans;
return ;
}
100分 两个堆
亲和数
【题目描述】
某一天,老徐看了一本趣味数学书,上面提到了亲和数:定义数对 (x,y) 为亲和数对当且仅仅当x、y为不同正整数,且x、y各自的所有非自身正因子之和等于另一个数。例如 (220,284) 和 (284,220) 都是亲和数对,因为:220的所有非自身正因子之和为:1 + 2 + 4 + 5 + 10 + 11 + 20 + 22 + 44 + 55 + 110 = 284。284的所有非自身正因子之和为:1 + 2 + 4 + 71 + 142 = 220
数对 (x,y ) 跟 (y,x) 被认为是同一数对,所以我们只考虑 x<y 的情况。
老徐对某个范围内的亲和数对的数量非常感兴趣,所以希望你能帮她编写一个程序计算给定范围内的亲和数对的数量。给定一个范围A到B,如果A≤ x ≤ B,则我们称 (x,y)在范围[A,B]内。
【输入格式】
从文件的第一行分别读入正整数A和B,其中A、B满足
1 ≤ A ≤ B ≤ 108 且 B-A ≤ 105
【输出格式】
输出文件只有一行,就是[A,B]内亲和数对的数量
【输入输出样例】
amicable.in |
amicable.out |
200 1200 |
2 |
注:[200,1200] 内的数对只有两个,分别是(220,284)和(1184 1210)
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a,b,bit[],len,q[];
bool pan(int num){
int sum=;
for(int i=;i*i<=num;i++){
if(num%i==&&i*i!=num)sum+=i+num/i;
if(i*i==num)sum+=i;
}
if(sum<=num)return ;
for(int i=;i*i<=sum;i++){
if(sum%i==&&i*i!=sum)num-=i+sum/i;
if(i*i==sum)num-=i;
if(num<)return ;
}
if(num==)return ;
}
int shu(int pos,int num,bool limit){
if(pos==len+){
if(pan(num))return ;
return ;
}
int end=limit?bit[pos]:;
int ans=;
for(int i=;i<=end;i++){
ans+=shu(pos+,num*+i,limit&&i==end);
}
return ans;
}
int dp(int x){
memset(q,,sizeof(q));
memset(bit,,sizeof(bit));
len=;
while(x){
q[++len]=x%;
x/=;
}
for(int i=len,j=;i>=;i--,j++)bit[i]=q[j];
return shu(,,);
}
int main(){
//freopen("Cola.txt","r",stdin);
freopen("amicable.in","r",stdin);
freopen("amicable.out","w",stdout);
scanf("%d%d",&a,&b);
cout<<dp(b)-dp(a-);
return ;
}
50分 数位dp(记忆化没写成)
/*
对于一个给定正实数x,如果x≡0(mod i),那么x≡0(mod x/i)。
这样一来我们可以将区间放缩,由[1,n]缩小到[1,√n],每次如果x≡0(mod i),SUM+=i+n/i;值得一说的是,区间到达√n的时候,需要进行特判。 如果x≡0(mod √n),那么需要和只需要加一个√n就好了。
*/
#include<cstdio>
int a,b,ans;
int div(int n){
int i=,m=;
for(;i*i<n;i++)if(n%i==)m+=i+n/i;
if(i*i==n)return m+i;
return m;
}
int main (){
scanf("%d %d",&a,&b);
for(;a<=b;a++){
int x=div(a);
if(x>a&&div(x)==a)ans++;
}
printf("%d",ans);
return ;
}
100分
2017-8-31 NOIP模拟赛的更多相关文章
- 2017.6.11 NOIP模拟赛
题目链接: http://files.cnblogs.com/files/TheRoadToTheGold/2017-6.11NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B.zip 期 ...
- 2017 10.25 NOIP模拟赛
期望得分:100+40+100=240 实际得分:50+40+20=110 T1 start取了min没有用,w(゚Д゚)w O(≧口≦)O T3 代码3个bug :数组开小了,一个细节没注意, ...
- 2017.5.27 NOIP模拟赛(hzwer2014-5-16 NOIP模拟赛)
期望得分:100+100+60+30=290 实际得分:100+20+60+0=180 当务之急:提高一次正确率 Problem 1 双色球(ball.cpp/c/pas) [题目描述] 机房来了新一 ...
- NOI.AC NOIP模拟赛 第六场 游记
NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...
- 【HHHOJ】NOIP模拟赛 玖 解题报告
点此进入比赛 得分: \(100+20+100=220\)(还不错) 排名: \(Rank\ 16\) \(Rating\):\(+20\) \(T1\):[HHHOJ263]「NOIP模拟赛 玖」三 ...
- 【HHHOJ】NOIP模拟赛 捌 解题报告
点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
随机推荐
- 【python】python调用shell方法
在python脚本中,有时候需要调用shell获取一下信息,下面介绍两种常用的调用方法. 第一种,os.system() 这个函数获取的是命令的执行状态,比如 >>> import ...
- Node.js学习笔记(2):基本模块
Node.js学习笔记(2):基本模块 模块 引入模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在No ...
- java多线程系列 JUC原子类 CAS及原子类
根据数据类型,可以将JUC包中的原子操作类可以分为4类. 1. 基本类型: AtomicInteger, AtomicLong, AtomicBoolean ;2. 数组类型: AtomicInteg ...
- jqueryeasyUI dialog 弹出窗口超出浏览器,导致不能关闭的bug解决方案
jqueryeasyUI dialog 弹出窗口超出浏览器,导致不能关闭的bug解决方案 2014年8月30日 3233次浏览 相信很多前端朋友都用过jqueryeasyUI,jqueryeasyUI ...
- Spring Boot2.0之多数据源事务管理
结合前面做的小项目,如果我把test01 test02下面的 service 都加了 事务的注解 这样启动时候会报错! 事务管理器里面不能有两个事务!!!! 这时候需要用 @Transactiona ...
- 【Codeforces】Gym 101156G Non-Attacking Queens 打表
题意 求$n\times n$的棋盘上放$3$个皇后使得互相不攻击的方案数 拓展是$m\times n$棋盘上放$k$皇后,暴力打表找到了公式 OEIS 代码 import java.math.Big ...
- BZOJ_1999_[Noip2007]Core树网的核_单调队列+树形DP
BZOJ_1999_[Noip2007]Core树网的核_单调队列+树形DP Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T ...
- codevs 1144 守望者的逃离
传送门 1144 守望者的逃离 2007年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 恶 ...
- 【LeetCode】017. Letter Combinations of a Phone Number
题目: Given a digit string, return all possible letter combinations that the number could represent. A ...
- 关于Tensorflow 加载和使用多个模型的方式
在Tensorflow中,所有操作对象都包装到相应的Session中的,所以想要使用不同的模型就需要将这些模型加载到不同的Session中并在使用的时候申明是哪个Session,从而避免由于Sessi ...