冲刺Noip2017模拟赛1 解题报告——五十岚芒果酱
题1 国际象棋(chess)
【问题描述】
有N个人要参加国际象棋比赛,该比赛要进行K场对弈。每个人最多参加2场对弈,最少参加0场对弈。每个人都有一个与其他人都不相同的等级(用一个正整数来表示)。在对弈中,等级高的人必须用黑色的棋子,等级低的人必须用白色的棋子。每一个人最多只能用一次黑色的棋子和一次白色的棋子。为了增加比赛的可观度,观众希望K场对弈中双方的等级差的总和最小。
比如有7个选手,他们的等级分别是30; ; ; ; ; ; ,要进行3场比赛。最好的安排是Player vs Player , Player7 vs Player , Player vs Player ,此时等级差的总和等于(-) + (-) + (-) = 5达到最小。
【输入格式】
第一行两个正整数N,K。
接下来有N行,第i行表示第i-1个人等级。
【输出格式】
在第一行输出最小的等级差的总和。
【输入样例】 【输出样例】 【数据范围】
在90%的数据中,≤N≤
在100%的数据中,≤N≤
保证所以输入数据中等级的值小于108,≤K≤N-
题目
tag:贪心 排序
思路:在这种两两对弈的情况下,有n*(n-1)/2种可能性,但是原题已限定条件(每一个人最多只能用一次黑色的棋子和一次白色的棋子,即只能和数值比自己大的选择1个,比自己小的选择1个),极大的缩小了选择的可能。由于k<=n-1,易得贪心策略----在排序后相邻数值的差放入新数组,再次排序选最小的k个。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 100010
using namespace std;
int n,m,i,cnt,a[maxn],s[maxn];
long long ans;
int read()
{
int x=;
char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<=''){
x=x*+ch-'';
ch=getchar();
}
return x;
}
int main()
{
//freopen("chess.in","r",stdin);
//freopen("chess.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=;i<=n;++i) a[i]=read();
sort(a+,a+n+);
for(i=;i<n;++i) s[i]=a[i+]-a[i];
sort(s+,s+n);
for(i=;i<=m;++i) ans+=s[i];
cout<<ans<<endl;
return ;
}
题2 单词化简(abbreviate)
【题目描述】
最近情报人员得到了一些经过加密的文章,每个单词都很长。破译人员想到先把单词化简一下,方法是把每个单词尽量取短些的前缀,但所取的前缀不能是其他单词的前缀。
这个任务现在就交给你来完成。
解释:“字符串s1是s2的前缀”是说把字符串s2的后面去掉某些,只保留与s1相同长度是,s2就与s1完全相同。如:“abc“是”abcaade“和”abc“的前缀,但不是”abadc“的前缀。
数据范围
单词数N,<=n<=; 每个单词长度不超过50;并且都是由小写字母构成。
保证所给单词没有一个单词是另一个单词的前缀。
【输入文件】
第一行一个整数N,表示单词的个数。
下面有N行,每行一个单词。
【输出文件】
共N行,每行一个单词,是对应上面N个单词化简后的单词。
【样例输入1】 abc
efg
ijh
【样例输出1】
a
e
i 【样例输入2】 aac
aad
aae
【样例输出2】
aac
aad
aae
题目
tag:贪心 字符串
思路:数据量较小,找到每个字符串与其他所有字符串最长的重合部分截至点。优化可考虑按字典序排序,由于字符串与上下两个的契合度最高,上下比较即可。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char a[][],n,i,j,k;
int ans[];
int main()
{
//freopen("abbreviate.in","r",stdin);
//freopen("abbreviate.out","w",stdout);
scanf("%d",&n);
for(i=;i<=n;++i) scanf("%s",a[i]);
for(i=;i<=n;++i)
for(j=;j<=n;++j){
if(i!=j){
int ret=;
for(k=;k<strlen(a[i])&&k<strlen(a[j]);++k){
if(a[i][k]==a[j][k]) ret++;
else{
ans[i]=max(ret,ans[i]);
break;
}
}
}
}
for(i=;i<=n;++i){
for(j=;j<=ans[i];++j) printf("%c",a[i][j]);
printf("\n");
}
return ;
}
题3 火星上的加法运算(madition)
【问题描述】
最近欢欢看到一本有关火星的书籍,其中她被一个加法运算所困惑,由于她的运算水平有限,想向你求助,作为一名优秀的程序员,你当然义不容辞。
【文件输入】
输入文件第一行输入一个运算的进制N(<=n<=),接下来的两行为需要进行运算的字符,其中每个字符串的长度不超过200位,其为N进制的数,其中包括0-9以及a-z(代表10-)。
【文件输出】
输出文件内容为在N进制下这两个数的和。
【输入样例1】 abcdefghij
【输出样例1】
bdfi02467j
【输入样例2】 99999jjjjj 【输出样例2】
iiiij00000
题目
tag:高精度
思路:模拟高精度加法,注意去前导0。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
char ys1[],a1[],b1[],c[];
int ys2[],a2[],b2[],n,i,lena,lenb,lenc;
void init()
{
for(i=;i<=;++i) ys1[i]=''+i;
for(i=;i<=;++i) ys1[i]='a'+i-;
for(i=;i<=;++i) ys2[i]=i-;
for(i=;i<=;++i) ys2[i]=i-;
}
int main()
{
//freopen("Madition.in","r",stdin);
//freopen("Madition.out","w",stdout);
init();
scanf("%d",&n);
scanf("%s",a1);
scanf("%s",b1);
lena=strlen(a1),lenb=strlen(b1),lenc=max(lena,lenb);
for(i=;i<lena;++i) a2[lena-i-]=ys2[a1[i]];
for(i=;i<lenb;++i) b2[lenb-i-]=ys2[b1[i]];
for(i=;i<lenc;++i){
c[i]+=a2[i]+b2[i];
c[i+]+=c[i]/n;
c[i]%=n;
}
if(c[lenc]) lenc++;
while(!c[lenc-]&&lenc-) lenc--;
for(i=lenc-;i>=;--i) printf("%c",ys1[c[i]]);
return ;
}
题4 队列安排(arrange)
【问题描述】
一个学校里老师要将班上N个同学排成一列,同学被编号为1~N,他采取如下的方法:
. 先将1号同学安排进队列,这时队列中只有他一个人;
. ~N号同学依次入列,编号为i的同学入列方式为:老师指定编号为i的同学站在编号为1~i -1中某位同学(即之前已经入列的同学)的左边或右边;
. 从队列中去掉M(M<N)个同学,其他同学位置顺序不变。
在所有同学按照上述方法队列排列完毕后,老师想知道从左到右所有同学的编号。
【输入文件】
输入文件arrange.in的第1行为一个正整数N,表示了有N个同学。
第2~第N行,第i行包含两个整数k,p,其中k为小于i的正整数,p为0或者1。若p为0,则表示将i号同学插入到k号同学的左边,p为1则表示插入到右边。
第N+1行为一个正整数M,表示去掉的同学数目。
接下来M行,每行一个正整数x,表示将x号同学从队列中移去,如果x号同学已经不在队列中则忽略这一条指令。
【输出文件】
输入文件arrange.out仅包括1行,包含最多N个空格隔开的正整数,表示了队列从左到右所有同学的编号,行末换行且无空格。
【样例输入】 【样例输出】 【样例说明】
将同学2插入至同学1左边,此时队列为: 将同学3插入至同学2右边,此时队列为: 将同学4插入至同学1左边,此时队列为: 将同学3从队列中移出,此时队列为: 同学3已经不在队列中,忽略最后一条指令
最终队列: 【数据规模与约定】
对于20%的数据,有N≤;
对于40%的数据,有N≤;
对于100%的数据,有N, M≤。
题目
tag:链表
思路:裸的链表。(可以不用像我写的这么麻烦,你可以用下面这个来理解、当模版)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 100010
using namespace std;
int pre[maxn],Next[maxn],head,tail,i,n,m;
int read()
{
int x=;
char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<=''){
x=x*+ch-'';
ch=getchar();
}
return x;
}
void add(int x,int y,int o)
{
if(o){
if(y==tail){
Next[y]=x;
pre[x]=y;
tail=x;
}
else{
pre[x]=y;
Next[x]=Next[y];
pre[Next[y]]=x;
Next[y]=x;
}
}
else{
if(y==head){
Next[x]=y;
pre[y]=x;
head=x;
}
else{
Next[x]=y;
pre[x]=pre[y];
Next[pre[y]]=x;
pre[y]=x;
}
}
}
void del(int x)
{
if(x==head){
head=Next[x];
pre[Next[x]]=;
}
else if(x==tail){
tail=pre[x];
Next[pre[x]]=;
}
else{
Next[pre[x]]=Next[x];
pre[Next[x]]=pre[x];
}
pre[x]=Next[x]=;
}
int main()
{
//freopen("arrange.in","r",stdin);
//freopen("arrange.out","w",stdout);
int y,o;
scanf("%d",&n);
head=tail=;
for(i=;i<=n;++i){
y=read();
o=read();
add(i,y,o);
}
scanf("%d",&m);
for(i=;i<=m;++i){
y=read();
if(pre[y]||Next[y]) del(y);
}
for(i=head;i;i=Next[i]) printf("%d ",i);
return ;
}
┈━═┈━═┈━═┈━═┈━═┈━═┈━═┈━═华丽分割线┈━═┈━═┈━═┈━═┈━═┈━═┈━═┈━═☆
芒果君:其实这次题目的难度对我来说……然而只拿了一半分,比如链表我本来有足够信心拿全分结果少写了2行代码……出完成绩还没一刻钟就改到AK了,有点郁闷,不过听一听古风歌心情就好多啦~这个解题报告写得比较简略不过实在没什么好写的?怎么说呢,还是要把自己的状态调整好,千万不要随便受影响了,顺其自然吧。
结束。
冲刺Noip2017模拟赛1 解题报告——五十岚芒果酱的更多相关文章
- 冲刺Noip2017模拟赛2 解题报告——五十岚芒果酱
题1 牛跑步(running) [题目描述] 新牛到部队,CG 要求它们每天早上搞晨跑,从 A 农场跑到 B 农场.从 A 农场到 B 农场中有 n- 个路口,分别标上号,A 农场为 号,B 农场为 ...
- 冲刺Noip2017模拟赛5 解题报告——五十岚芒果酱
1. 公约数(gcd) [问题描述] 给定一个正整数,在[,n]的范围内,求出有多少个无序数对(a,b)满足 gcd(a,b)=a xor b. [输入格式] 输入共一行,一个正整数n. [输出格式] ...
- 冲刺Noip2017模拟赛3 解题报告——五十岚芒果酱
题1 素数 [问题描述] 给定一个正整数N,询问1到N中有多少个素数. [输入格式]primenum.in 一个正整数N. [输出格式]primenum.out 一个数Ans,表示1到N中有多少个素 ...
- 冲刺Noip2017模拟赛8 解题报告——五十岚芒果酱
1.鼎纹 [问题描述] 据说鼎纹的 种制造 式是 铜模印出来的,这是我国古代劳动 智慧 的结晶.铜模印过的地 ,会留下深深的印记,经过时间的炼化,洗 练成历史的遗存. 聪明的古代劳动人民拥有一个 a ...
- 冲刺Noip2017模拟赛7 解题报告——五十岚芒果酱
1.二叉树(binary) .二叉树 (binary.cpp/c/pas) [问题描述] 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: ()若左子树不空,则左子树上所有结点的值均小于它的根结 ...
- 冲刺Noip2017模拟赛6 解题报告——五十岚芒果酱
1.ksum(ksum) [问题描述] Peter喜欢玩数组.NOIP这天,他从Jason手里得到了大小为n的一个正整数 数组. Peter求出了这个数组的所有子段和,并将这n(n+)/2个数降序排序 ...
- 冲刺Noip2017模拟赛4 解题报告——五十岚芒果酱
题1 韬韬抢苹果(apple) [问题描述] 又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹 果.每个韬韬都想要最大的苹果,所以发生了争执,为了解决他们的矛盾,出题人定了 ...
- 20161005 NOIP 模拟赛 T2 解题报告
beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...
- 【HHHOJ】NOIP模拟赛 玖 解题报告
点此进入比赛 得分: \(100+20+100=220\)(还不错) 排名: \(Rank\ 16\) \(Rating\):\(+20\) \(T1\):[HHHOJ263]「NOIP模拟赛 玖」三 ...
随机推荐
- 02_已解决 [salt.minion :1758][ERROR ][52886] Returner mysql.returner could not be loaded: 'mysql' __virtual__ returned False: Could not import mysql returner; mysql python client is not installed.
总结:python2.7下的salt,要把 mysql-python也安装,并不是python3环境,看清,看清 Returners组件,master自动把值写入mysql数据库中,出现的问题 1.本 ...
- CodeForces 840B - Leha and another game about graph | Codeforces Round #429(Div 1)
思路来自这里,重点大概是想到建树和无解情况,然后就变成树形DP了- - /* CodeForces 840B - Leha and another game about graph [ 增量构造,树上 ...
- scrapy 学习笔记2 数据持久化
前情提要:校花网爬取,并进行数据持久化 数据持久化操作 --编码流程: 1:数据解析 2:封装item 类 3: 将解析的数据存储到实例化好的item 对象中 4:提交item 5:管道接收item然 ...
- @Async 异步注释 @EnableAsync
@SpringBootApplication @ComponentScan(basePackages = "com.fddsfsg") //@EnableSwagger2 @Ena ...
- Comet OJ - Contest #2 (D 错综的光影所迷惑的思念是) 容斥计数
题意:给定一颗 $n$ 个节点的树,定义 $dis(x,y)$ 为树上点 $x$ 到 $y$ 的路径经过的边数. 定义一个点集 $S$ 的 $f(S)$ 为 $f(S)=max\left \{dis( ...
- GAN生成式对抗网络(四)——SRGAN超高分辨率图片重构
论文pdf 地址:https://arxiv.org/pdf/1609.04802v1.pdf 我的实际效果 清晰度距离我的期待有距离. 颜色上面存在差距. 解决想法 增加一个颜色判别器.将颜色值反馈 ...
- 【线性代数】6-4:对称矩阵(Symmetric Matrices)
title: [线性代数]6-4:对称矩阵(Symmetric Matrices) categories: Mathematic Linear Algebra keywords: Eigenvalue ...
- linux mysql5.7设置中文字符集
ubuntu16.04已测试 注意版本,好像从5.6根5.5就不一样,配置文件更深了一层. 1.用vim或nano编辑 /etc/mysql/mysql.conf.d/mysqld.cnf 2.[ ...
- pymysql基本使用
导入模块 import pymysql 连接(看一下password有没有,没有的话会怎么样,有很多参数,有些参数也是可以不传的) conn = pymysql.connect(user = &quo ...
- c 判断数字是否有限
/* isfinite example */ #include <stdio.h> /* printf */ #include <math.h> /* isfinite, sq ...