【qboi冲刺NOIP2017复赛试题4】 全套题目+题解+程序
作为一个好人(验题人),我给大家奉上下这套题的题解,并且预祝大家这套题能够AK:
T1题面:Alice现在有n根木棍,他们长度为1,2,3....n,Bob想把某一些木棍去掉,使得Alice剩下的木棍任意3根不能构成三角形。Bob想知道至少他需要去掉多少根。
题解:不难发现,这一题所求为在[1,n]中有多少个数不是斐波那契数,因为n的范围很小,直接枚举即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#define L long long
using namespace std;
L n,a=,b=,c; int main(){
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
cin>>n;
if(n<=) {printf("0\n"); return ;}
int i;
for(i=;a+b<=n;i++){
c=a+b;
a=b; b=c;
}
cout<<n-i<<endl;
}
第二题题面:给你n堆石子,每堆石子有ai个石子,对于每一次操作,可以将某堆的一个石子移动到另外一堆。游戏终止的条件是:存在一个x(x>1),使得任意一堆石子满足:ai%x==0。(1<=i<=n)请求出游戏终止的最小操作数。
我们不难发现,x必为sum的因子,枚举所有的因子d,对于该因子d,将a数组中每一个数取模并排序,最后贪心地扫一遍即可。
时间复杂度为$O(n*d(sum^{0.5}))$
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define M 110000
#define L long long
using namespace std;
int a[M]={},b[M]={},dd[M]={},n,dn;
L ans=,minn=1e18; void sort(int x){
for(int i=;i<=n;i++) dd[b[i]]++;
int cnt=;
for(int i=;i<x;i++){
while(dd[i]) b[++cnt]=i,dd[i]--;
}
} int main(){
cin>>n;
for(int i=;i<=n;i++) scanf("%d",a+i),ans+=a[i];
for(int d=;d<=;d++) if(ans%d==){
L sum=,cnt=;
for(int i=;i<=n;i++) b[i]=a[i]%d;
sort(d);
//sort(b+1,b+n+1);
for(int i=,j=n;i<j;i++){
while(b[i]){
int delta=min(b[i],d-b[j]);
cnt+=delta;
b[j]+=delta;
b[i]-=delta;
if(b[j]==d) j--;//!!!
}
}
minn=min(minn,cnt);
}
cout<<minn<<endl;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define M 110000
#define L long long
using namespace std;
int a[M]={},b[M]={},dd[M]={},n,dn;
L ans=,minn=1e18; void sort(int x){
for(int i=;i<=n;i++) dd[b[i]]++;
int cnt=;
for(int i=;i<x;i++){
while(dd[i]) b[++cnt]=i,dd[i]--;
}
} int main(){
cin>>n;
for(int i=;i<=n;i++) scanf("%d",a+i),ans+=a[i];
for(int d=;d<=;d++) if(ans%d==){
L sum=,cnt=;
for(int i=;i<=n;i++) b[i]=a[i]%d;
sort(d);
//sort(b+1,b+n+1);
for(int i=,j=n;i<j;i++){
while(b[i]){
int delta=min(b[i],d-b[j]);
cnt+=delta;
b[j]+=delta;
b[i]-=delta;
if(b[j]==d) j--;//!!!
}
}
minn=min(minn,cnt);
}
cout<<minn<<endl;
}
第三题题解:简单乱搞题,直接暴力枚举即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#define M 1100
using namespace std;
int n,m,d;
struct pt{
int x,y; pt(){x=y=;}
pt(int xx,int yy) {x=xx; y=yy;}
}a[M];
int f[M]={},ok[M]={};
int get(int x){
if(f[x]!=x) return f[x]=get(f[x]);
return x;
}
int pf(int x){return x*x;}
bool cmp(int x,int y){
return pf(a[x].x-a[y].x)+pf(a[x].y-a[y].y)<=d*d;
}
struct edge{int u,next;}e[M*M]={}; int head[M]={},use=;
void add(int x,int y){use++;e[use].u=y;e[use].next=head[x]; head[x]=use;}
int main(){
scanf("%d%d%d",&n,&m,&d);
for(int i=;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++) if(i!=j)
if(cmp(i,j))
add(i,j);
}
for(int i=;i<=n;i++) f[i]=i;
while(m--){
char c[]; int x,y;
scanf("%s%d",&c,&x);
if(c[]=='O'){
ok[x]=;
for(int i=head[x];i;i=e[i].next) if(ok[e[i].u]){
int xx=get(x),yy=get(e[i].u);
if(xx==yy) continue;
f[xx]=yy;
}
} else{
scanf("%d",&y);
x=get(x); y=get(y);
if(x==y) printf("YES\n");
else printf("NO\n");
}
}
}
第四题题解:我们对所所有的买卖方案按 Q-P 的大小 ,从小到大排序,然后直接跑01背包即可。
#include <bits/stdc++.h>
using namespace std;
struct node
{
int p,q,v;
node(){}
bool operator < (const node &a) const
{
return q-p < a.q - a.p;
}
void read() {scanf("%d%d%d",&p,&q,&v);}
}a[];
int f[];
int main()
{
int n,m;
while (scanf("%d%d",&n,&m)!=EOF)
{
memset(f,,sizeof(f));
for (int i=; i<=n; i++) a[i].read();
sort(a+,a++n);
for (int i=; i<=n; i++)
for (int j=m; j>=a[i].q; j--)
f[j] = max(f[j], f[j-a[i].p]+a[i].v);
printf("%d\n",f[m]);
}
}
是不是很简单啊??
【qboi冲刺NOIP2017复赛试题4】 全套题目+题解+程序的更多相关文章
- 作业二:个人编程项目——编写一个能自动生成小学四则运算题目的程序
1. 编写一个能自动生成小学四则运算题目的程序.(10分) 基本要求: 除了整数以外,还能支持真分数的四则运算. 对实现的功能进行描述,并且对实现结果要求截图. 本题发一篇随笔,内容包括: 题 ...
- Individual Project "写一个能自动生成小学四则运算题目的程序"
一.题目简介 写一个能自动生成小学四则运算题目的程序. 初步拟定要实现的功能后,估计一下自己需要花多长时间.编程过程中记录自己实际用了多长时间. 然后和同学们比较一下各自程序的功能.实现方法的异同等等 ...
- ZROI 部分题目题解
ZROI 部分题目题解 335 首先发现一个性质: 对于最短的边而言,所有点的路径如果经过了这条边,那么路径的权值就是这条边的边权(废话) 那么我们把最短的边拎出来,可以发现,博物馆确定时,每个点按照 ...
- PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)
PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++: 欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/ ...
- Spark面试题(七)——Spark程序开发调优
Spark系列面试题 Spark面试题(一) Spark面试题(二) Spark面试题(三) Spark面试题(四) Spark面试题(五)--数据倾斜调优 Spark面试题(六)--Spark资源调 ...
- Java面试题整理(题目内容非原创)
面试题分类: 1.java 基础面试题 Java基础中对于io 中文件的读.写,util中的list map set这些要分清楚 还有线程.socket 都需要了解下 参考链接:http://blog ...
- 历年noip复赛试题整合
早晨打算把历年的试题都过一遍,整理一下大概会往哪个方向考,考什么,不说太多,开始吧 2013: Day1: T1 转圈游戏 : 快速幂(关键在于要会打 快速幂) 思路:因为每次都进m位,相当于每次x加 ...
- Java面试题整理:这些Java程序员面试中经常遇见的题目,必须掌握才能有好结果
1.是否可以从一个static方法内部发出对非static方法的调用? 不可以.因为非static方法是要与对象关联在一起的,必须创建一个对象后,才可以在该对象上进行方法调用,而static方法调用时 ...
- 《DNA比对》蓝桥杯复赛试题
题目描述 脱氧核糖核酸即常说的DNA,是一类带有遗传信息的生物大分子.它由4种主要的脱氧核苷酸(dAMP.dGMP.dCMT和dTMP)通过磷酸二酯键连接而成.这4种核苷酸可以分别记为:A.G.C.T ...
随机推荐
- ApplicationContextAware学习--存疑问题
先看下ApplicationContextAware的源码: package org.springframework.context; import org.springframework.b ...
- 使用Jsoup获取网页内容超时设置
使用Jsoup获取网页内容超时设置 最近使用Jsoup来抓取网页,并对网页进行解析,发现很好用.在抓取过程中遇到一个问题,有些页面总是报Timeout异常,开始想是不是被抓取网站对IP进行了限制,后来 ...
- 2018.09.01 poj2689 Prime Distance(埃式筛法)
传送门 一道挺有趣的. 第一眼以为每个数都用miller_rabin判一次,但感觉会被卡时间啊. 继续分析发现可以晒出sqrt(r)中的所有素数,然后用类似埃式筛法的方法晒出[l,r]" r ...
- 破解Unity5.3.4f1
破解的目的是将受限的个人版变为全功能的Pro版,破解后就可以使用所有功能了,界面也变成了黑色的主题. 破解网址(支持最新版的5.3.4f1): http://www.ceeger.com/forum/ ...
- 201709018工作日记--RecyclerView的使用(点击,瀑布流的实现)
参考相关博客: http://www.jianshu.com/p/55e3f1b6701f 刘望舒 http://www.jianshu.com/p/4fc6164e4709 王三的猫阿德 http ...
- 高翔《视觉SLAM十四讲》从理论到实践
目录 第1讲 前言:本书讲什么:如何使用本书: 第2讲 初始SLAM:引子-小萝卜的例子:经典视觉SLAM框架:SLAM问题的数学表述:实践-编程基础: 第3讲 三维空间刚体运动 旋转矩阵:实践-Ei ...
- Codeforces805 A. Fake NP 2017-05-05 08:30 327人阅读 评论(0) 收藏
A. Fake NP time limit per test 1 second memory limit per test 256 megabytes input standard input out ...
- Delphi XE7 用indy开发微信公众平台所有功能,可刷阅读,可刷赞,可加推广(除微支付)
http://www.cnblogs.com/devinlee/p/4565933.html Delphi XE7 用indy开发微信公众平台所有功能,可刷阅读,可刷赞,可加推广(除微支付) 关注作者 ...
- NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(转载)
原文地址:http://www.cnblogs.com/asxinyu/p/dotnet_Opensource_project_FluentValidation_1.html 阅读目录 1.基本介绍 ...
- Windows Phone 8.1 生命周期调试
之前重装了机子,今天调试时突然找不到调试生命周期的菜单栏了.最后找了5分钟,终于找回来了,特此记录以免以后重装后再出现这种状况. 项目启动调试后: 这样是没有显示调试生命周期的,接下来在工具栏右键: ...