【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 ...
随机推荐
- window.load 和$(document).ready() 、window.load和body onload区别
1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕.2.编写个数不同 w ...
- 客户被绑,蒙眼,惊问:“想干什么?” 对方不语,鞭笞之,客户求饶:“别打,要钱?” 又一鞭,“十万够不?” 又一鞭,“一百万?” 又一鞭。客户崩溃:“你们TMD到底要啥?” “要什么?...
1. 客户被绑,蒙眼,惊问:“想干什么?” 对方不语,鞭笞之,客户求饶:“别打,要钱?” 又一鞭,“十万够不?” 又一鞭,“一百万?” 又一鞭.客户崩溃:“你们TMD ...
- 第四章 代词(Les pronoms )
★人称代词 .主语人称代词 第一人称和第二人称属纯人称代词,只能代人不能代物;第三人称可代人,亦可代物.如: La Terre est ronde. Elle tourne autour du Sol ...
- swagger core 和 swagger ui 如何关联【窥探】
几个片段: package io.swagger.jaxrs.listing; import io.swagger.annotations.ApiOperation; import org.apach ...
- id 与 void * 转换
MRC 环境下: id 变量赋值给 void * 变量运行时不会有问题. id obj1 = [NSObject new];void * p = obj1; void * 变量赋值给 id 变量并调用 ...
- hdu 5685 Problem A (逆元)
题目 题意:H(s)=∏i≤len(s)i=1(Si−28) (mod 9973),求一个字符串 子串(a 位到 b 位的)的哈希值.这个公式便是求字符串哈希值的公式,(字符的哈希值 = 字符的ASC ...
- 用 PHP 编写 http 服务器
概述 众所周知,我们一般使用 PHP 开发Web程序时需要使用到比如Apache或Nginx等Web服务器来支持,那么有没有办法直接使用PHP开发HTTP服务器,答案当然是可以的,最近看了一遍Work ...
- Spring注解使用和与配置文件的关系
Spring注解使用和与配置文件的关系 1 注解概述与容器管理机制 Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repositor ...
- 【Win2D】【译】Win2D 快速入门
原文链接:http://microsoft.github.io/Win2D/html/QuickStart.htm 快速入门 这是 Win2D 的快速入门教程,将会介绍 Win2D 中的基本功能.你将 ...
- [ACM_模拟] HDU 1006 Tick and Tick [时钟间隔角度问题]
Problem Description The three hands of the clock are rotating every second and meeting each other ma ...