题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 解题报告——五十岚芒果酱的更多相关文章

  1. 冲刺Noip2017模拟赛2 解题报告——五十岚芒果酱

    题1 牛跑步(running) [题目描述] 新牛到部队,CG 要求它们每天早上搞晨跑,从 A 农场跑到 B 农场.从 A 农场到 B 农场中有 n- 个路口,分别标上号,A 农场为 号,B 农场为 ...

  2. 冲刺Noip2017模拟赛5 解题报告——五十岚芒果酱

    1. 公约数(gcd) [问题描述] 给定一个正整数,在[,n]的范围内,求出有多少个无序数对(a,b)满足 gcd(a,b)=a xor b. [输入格式] 输入共一行,一个正整数n. [输出格式] ...

  3. 冲刺Noip2017模拟赛3 解题报告——五十岚芒果酱

    题1  素数 [问题描述] 给定一个正整数N,询问1到N中有多少个素数. [输入格式]primenum.in 一个正整数N. [输出格式]primenum.out 一个数Ans,表示1到N中有多少个素 ...

  4. 冲刺Noip2017模拟赛8 解题报告——五十岚芒果酱

    1.鼎纹 [问题描述] 据说鼎纹的 种制造 式是 铜模印出来的,这是我国古代劳动 智慧 的结晶.铜模印过的地 ,会留下深深的印记,经过时间的炼化,洗 练成历史的遗存. 聪明的古代劳动人民拥有一个 a ...

  5. 冲刺Noip2017模拟赛7 解题报告——五十岚芒果酱

    1.二叉树(binary) .二叉树 (binary.cpp/c/pas) [问题描述] 二叉排序树或者是一棵空树,或者是具有下列性质的二叉树: ()若左子树不空,则左子树上所有结点的值均小于它的根结 ...

  6. 冲刺Noip2017模拟赛6 解题报告——五十岚芒果酱

    1.ksum(ksum) [问题描述] Peter喜欢玩数组.NOIP这天,他从Jason手里得到了大小为n的一个正整数 数组. Peter求出了这个数组的所有子段和,并将这n(n+)/2个数降序排序 ...

  7. 冲刺Noip2017模拟赛4 解题报告——五十岚芒果酱

    题1 韬韬抢苹果(apple) [问题描述] 又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹 果.每个韬韬都想要最大的苹果,所以发生了争执,为了解决他们的矛盾,出题人定了 ...

  8. 20161005 NOIP 模拟赛 T2 解题报告

    beautiful 2.1 题目描述 一个长度为 n 的序列,对于每个位置 i 的数 ai 都有一个优美值,其定义是:找到序列中最 长的一段 [l, r],满足 l ≤ i ≤ r,且 [l, r] ...

  9. 【HHHOJ】NOIP模拟赛 玖 解题报告

    点此进入比赛 得分: \(100+20+100=220\)(还不错) 排名: \(Rank\ 16\) \(Rating\):\(+20\) \(T1\):[HHHOJ263]「NOIP模拟赛 玖」三 ...

随机推荐

  1. [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具

    原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...

  2. Treasure Exploration POJ - 2594 【有向图路径可相交的最小路径覆盖】模板题

    Have you ever read any book about treasure exploration? Have you ever see any film about treasure ex ...

  3. 51nod 1594 Gcd and Phi 反演

    OTZ 又被吊打了...我当初学的都去哪了??? 思路:反演套路? 提交:\(1\)次 题解: 求\(\sum_{i=1}^{n}\sum_{j=1}^{n}\varphi(gcd(\varphi(i ...

  4. change([[data],fn]) 当元素的值发生改变时,会发生 change 事件。

    change([[data],fn]) 概述 当元素的值发生改变时,会发生 change 事件.大理石平台价格表 该事件仅适用于文本域(text field),以及 textarea 和 select ...

  5. RabbitMq、ActiveMq、Kafka和Redis做Mq对比

    转载自:https://blog.csdn.net/qiqizhiyun/article/details/79848834 一.RabbitMq RabbitMQ是一个Advanced Message ...

  6. 路由器配置——PAP与CHAP认证

    一.实验目的:掌握PAP与CHAP认证配置 二.拓扑图: 三.具体步骤配置: (1)R1路由器配置: Router>enable  --进入特权模式 Router#configure termi ...

  7. package.json设置环境变量

    有三种方法可以在package.json设置环境变量 npm install --save-dev cross-env { "scripts": { "dev1" ...

  8. 一个list<Map>里map其中的一个字段的值相同,如何判断这个字段相同,就把这个map的其他字段存入另一个map中

    //不建议使用Map保存这些,使用实体bean更好 package com.rxlamo.zhidao;   import java.util.*;   public class Main {     ...

  9. springboot中web应用的统一异常处理

    在web应用中,请求处理过程中发生异常是非常常见的情况.springboot为我们提供了一个默认的映射:/error,当处理中抛出异常之后,会转到该请求中处理,并且该请求有一个全局的错误页面用来展示异 ...

  10. AGC024E Sequence Growing Hard

    题意 给出\(n\),\(m\),\(mu\),问有多少个序列组\((A_0,A_1,\dots,A_n)\)满足: 序列\(Ai\)的长度恰好为\(i\) 所有元素均在\([1,m]\) \(A_{ ...