NOIP1998提高组 题解报告
T1 进制位
题目大意:自己看吧
首先让我们来看两个引理:
- 如果有解,则进制一定为\(n - 1\)
- 如果有解,则字母一定表示\(0\) 至 \(n - 1\) 的数
证明如下:
因为有 \(n - 1\) 个不同的数,所以最少 \(n - 1\) 进制。
假设为 \(n\) 进制,那么一定有一个数没有出现,假设为 \(k\)。
若\(k = 0\) 或 \(k = 1\),有 \(1 + (n - 1) = 10\)(\(n\)进制下) ,矛盾。
\(1 < k \le n-1\) ,有\(1 + (k - 1) = k\) ,矛盾。
其它 $ > n - 1$ 进制的情况同理,所以一定是 \(n - 1\) 进制,结论 \(1\) 得证。
结论 \(1\) 成立 ,则结论 \(2\) 显然。
有了以上两个结论,这道题就好做多了。
数据范围才为 \(n \le 9\) ,直接枚举每种全排列,对每一种进行判断是否满足加法表就行了。
\(Code:\)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
int n,a[9],c[366666][9],tot,num[233],vis[233];
char cnm[9];
char ch[9][9][233];
inline int my_pow(int a,int b)
{
int cnm=1;
for(;b;b>>=1)
{
if(b&1) cnm=cnm*a;
a=a*a;
}
return cnm;
}
inline bool calc(int jz,int a,int b)
{
int A=num[(int)cnm[a]],B=num[(int)cnm[b]],C=0;
int siz=ch[a+1][b+1][0];
for(int i=1;i<=siz;++i)
C+=num[(int)ch[a+1][b+1][i]]*my_pow(jz,siz-i);
if(A+B<jz)
{
if(A+B==C) return true;
return false;
}
else
{
int temp=A+B;
B=temp%jz,A=temp/jz;
B+=A*jz;
if(B==C) return true;
return false;
}
}
inline void dfs(int k)
{
if(k==n-1)
{
++tot;
for(int i=0;i<n-1;++i) c[tot][i]=a[i];
return;
}
for(int i=0;i<n-1;++i)
{
if(!vis[i])
{
vis[i]=1;
a[k]=i,dfs(k+1);
vis[i]=0;
}
}
}
int main()
{
scanf("%d",&n);
getchar();//小心换行
for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
{
scanf("%s",ch[i][j]+1);
ch[i][j][0]=strlen(ch[i][j]+1);
}
}
for(int i=1;i<n;++i) cnm[i-1]=ch[0][i][1];
dfs(0);
for(int i=1;i<=tot;++i)
{
int sum=0;
for(int j=0;j<n-1;++j) num[(int)cnm[j]]=c[i][j];
for(int j=0;j<n-1;++j)
{
for(int k=0;k<n-1;++k)
{
if(calc(n-1,j,k)) ++sum;
}
}
if(sum==(n-1)*(n-1))
{
for(int j=0;j<n-1;++j) printf("%c=%d ",cnm[j],c[i][j]);
puts("");
printf("%d\n",n-1);return 0;
}
}
puts("ERROR!");
return 0;
}
T2 拼数
题目大意:给你\(n\)个正整数,让你把它们重新排列,使得排列后形成的数最大。
水题,直接\(STL\)切掉
\(Code:\)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
int n;
string s[23];
inline bool cmp(string a,string b) {return a+b>b+a;}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) cin>>s[i];
sort(s+1,s+n+1,cmp);
for(int i=1;i<=n;++i) cout<<s[i];
return 0;
}
T3 车站
题目大意:给你列车每一站上下车人数的规律以及终点人数,求第\(x\)站人数。
水的不能再水的题,直接上代码……
\(Code:\)
#include<cstdio>
using namespace std;
int f[23],n,m,a,x;
int main()
{
scanf("%d%d%d%d",&a,&n,&m,&x);
f[1]=1,f[2]=1;
for(int i=3;i<=n;++i) f[i]=f[i-1]+f[i-2];
if(x==1 || x==2) printf("%d",a);
else if(x==3) printf("%d",2*a);
else
{
int y=(m-a*(f[n-3]+1))/(f[n-2]-1);
printf("%d",y*(f[x-1]-1)+a*(f[x-2]+1));
}
return 0;
}
NOIP1998提高组 题解报告的更多相关文章
- NOIP1999提高组 题解报告
T1 导弹拦截 题目大意:依次有\(n\) (\(n \le 10^5\))枚导弹,一套导弹拦截系统只能拦截一系列高度递减的导弹(一套系统拦截的弹道不一定相邻).求一套系统最多能拦截多少导弹,以及最少 ...
- NOIP2014提高组 题解报告
D1 T1 无线网路发射器选址 题目大意:找一个矩形,使其覆盖的目标点最大. 题目过水,直接暴力搞过去,代码就不贴了. 但我TM居然有个地方SB了,调了半天才发现输入有问题: scanf(" ...
- NOIP2016提高组解题报告
NOIP2016提高组解题报告 更正:NOIP day1 T2天天爱跑步 解题思路见代码. NOIP2016代码整合
- noip2010提高组题解
NOIP2010提高组题解 T1:机器翻译 题目大意:顺序输入n个数,有一个队列容量为m,遇到未出现元素入队,求入队次数. AC做法:直接开1000的队列模拟过程. T2:乌龟棋 题目大意:有长度为n ...
- NOIP 2014 提高组 题解
NOIP 2014 提高组 题解 No 1. 生活大爆炸版石头剪刀布 http://www.luogu.org/problem/show?pid=1328 这是道大水题,我都在想怎么会有人错了,没算法 ...
- NOIP 2001 提高组 题解
NOIP 2001 提高组 题解 No 1. 一元三次方程求解 https://vijos.org/p/1116 看见有人认真推导了求解公式,然后猥琐暴力过的同学们在一边偷笑~~~ 数据小 暴力枚举即 ...
- NOIP 2000 提高组 题解
NOIP2000 提高组 题解 No 1. 进制转换 https://www.rqnoj.cn/problem/295 水题 对于n和基数r, 每次用n mod r, 把余数按照逆序排列 注意 mod ...
- 【NOIP2018】提高组题解
[NOIP2018]提高组题解 其实就是把写过的打个包而已 道路铺设 货币系统 赛道修建 旅行 咕咕咕 咕咕咕
- NOIP1998 提高组
[NOIP2002] 提高组 T2.联接数 算法:贪心+字符串处理 [问题分析]: 按整数对应的字符串大到小连接,因为题目的例子都符合,但是不难找到反例:12 121 应该组成12121而非121 ...
随机推荐
- flask之蓝图BulePrint使用
之前flask启用程序代码和逻辑代码都是在一个页面,这样代码多了很自然不利于关于,如果要将逻辑代码和进行分离,这里需要用到Falsk的蓝图(Blueprint) 项目结构 app文件夹为项目最外层文件 ...
- select加锁分析(Mysql)
[原创]惊!史上最全的select加锁分析(Mysql) 前言 大家在面试中有没遇到面试官问你下面六句Sql的区别呢 select * from table where id = ? select * ...
- [LeetCode] 45. Jump game II ☆☆☆☆☆(跳跃游戏 2)
https://leetcode-cn.com/problems/jump-game-ii/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-b ...
- Android笔记(二十六) Android中的广播——BroadcastReceiver
为了方便进行系统级别的消息通知,Android有一套类似广播的消息机制,每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收自己所关心的广播内容,这些广播可能是来自于系统,也可能是来自于 ...
- sqlalchemy.exc.CompileError: (in table 'user', column 'username'): VARCHAR requires a length on dialect mysql
映射数据库时报错:sqlalchemy.exc.CompileError: (in table 'user', column 'username'): VARCHAR requires a lengt ...
- 别人家的java语言编写的自动化测试系统
https://gitee.com/testdevops/easyrest 但是我还不会用 ~~~~(>_<)~~~~ 目前的状况是:大概知道流程了,可是第一个用例就跑步起来 自己想写一些 ...
- 纯js验证码
纯js验证码 <!DOCTYPE html> <html> <head> <title>纯js验证码</title> </head&g ...
- Vim使用技巧(5) -- 宏的录制与使用
想象一个场景,我们怎么快速把下面的所有链接都加上双引号?可能你手速快,可以很快的加完,但是如果链接有上万个呢?你如何在十秒以内加完? 这时候就需要用到“宏”(其实除了宏vim还有其它方法加上双引号,这 ...
- HDU-1237- 简单计算器--栈的基本应用
简单计算器 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不 ...
- Clipper库中文文档详解
简介 Clipper Library(以下简称为Clipper库或ClipperLib或Clipper)提供了对线段和多边形的裁剪(Clipping)以及偏置(offseting)的功能 和其他的裁剪 ...