【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 ...
随机推荐
- 【JS】点击页面判断是否安装app并打开,否则跳转下载的方法
应用场景 App产品在运营推广上有一个需求,就是要求可以让用户在访问我们的推广网页时,就可以判断出这个用户手机上是否安装了我们的App,如果安装了则可以直接在网页上打开,否则就引导用户前往下载.从而形 ...
- C语言基础第三次作业
题目7-1,寻找最小值 1.实验代码: #include<stdio.h> int main() { int i,mark,min,n; scanf("%d", &am ...
- NET(C#)连接各类数据库-集锦
1.C#连接连接Access程序代码:------------------------------------------------------------------------------- u ...
- spring mvc 用cookie和拦截器实现自动登录(/免登录)
Cookie/Session机制详解:http://blog.csdn.net/fangaoxin/article/details/6952954 SpringMVC记住密码功能:http://blo ...
- 2018.10.08 NOIP模拟 栅栏(树状数组+rand)
传送门 今天的送分题. 首先考虑每次给要围上栅栏的矩阵里的整体加上1,如果栅栏被撤销就整体减1,最后比较两个点的值是否相同来进行判断. 然而这样的效果并不理想,很容易卡掉. 进一步思考,我们第iii次 ...
- Django入门与实践 17-26章总结
Django入门与实践-第17章:保护视图 Django 有一个内置的视图装饰器 来避免它被未登录的用户访问: 现在如果用户没有登录,将被重定向到登录页面: 现在尝试登录,登录成功后,应用程序会跳转到 ...
- spring+hibernate 整合异常 Class 'org.apache.commons.dbcp.BasicDataSource' not found
解决方法 添加 commons-dbcp.jar和commons-pool.jar包
- DIV+CSS实战(一)
一.说明 作为一个后台的程序员,我也是很少写前端,最近有一个项目,前端主要是由我来负责,就把我在项目中所学到的东西,记录下来!我的页面要嵌入到另一个系统中,所以,并不是按照传统的top,left,co ...
- Ubuntu在命令行开启远程桌面
在终端执行下列三个命令即可 gsettings set org.gnome.Vino enabled truegsettings set org.gnome.Vino prompt-enabled f ...
- 菜鸟——使用bootstrap
方法一: 直接在页面中加入bootstrap的网址,不需要做其他任何改动 <%-- Created by IntelliJ IDEA. User: JC Date: 2017/2/24 Time ...