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 ...
随机推荐
- Python、PyCharm、Django框架安装
一.下载Python环境 1.1 下载Python环境,以下网址: https://www.python.org/downloads/release/python-373/ 下载安装包: 1.2点击安 ...
- Python3标准库使用样例
原:https://doughellmann.com/blog/the-python-3-standard-library-by-example/the-python-3-standard-libra ...
- JS如何做2048(详细)
在做2048之前,我们首先要了解它的游戏规则,以及运行逻辑 首先,来看上半部分 除了标题外还有记录每次获得的分数,以及总分数,还有一个重新开始按钮,这个最大分数会保存下来. 来看页面内容 页面内容由1 ...
- 如何使用JavaScript开发AR(增强现实)移动应用 (一)
本文封面配图是去年Jerry看的一部电影<异形:契约>的剧照. 所谓AR(Augmented Reality), 即增强现实,是一种将通过计算机渲染出的虚拟图像与真实世界巧妙融合的手段,背 ...
- 碰撞器Colider 触发器
碰撞器可以让所依附的游戏物件对其他碰撞体产生碰撞行为(其他游戏物体必须具有Rigidbody组件) 对于不规则形状的物体,通常使用组合式碰撞体而不是网格碰撞器,以为网格碰撞器以模型的网格为基础,更为复 ...
- 记录--linux下mysql数据库问题
本次主要记录一下linux下mysql数据库的一些问题,也是之前经常用到的知识,这里简单总结一些问题,方便自己以后的回顾.原来一直使用的是阿里云的RDS数据库mysql版,主要是因为上次阿里云做活动可 ...
- [转]memcached对key和value的限制 memcached的key最大长度和Value最大长度
转自: 老白干之再干 memcached的简单限制就是键(key)和item的限制.最大键长为250个字符.可以接受的储存数据不能超过1MB,因为这是典型slab 的最大值.这里我们可以突破对key长 ...
- Tensorflow&CNN:裂纹分类
版权声明:本文为博主原创文章,转载 请注明出处:https://blog.csdn.net/sc2079/article/details/90478551 - 写在前面 本科毕业设计终于告一段落了.特 ...
- linux网络编程之socket编程(十三)
今天继续学习socket编程,从今天起开始学习UDP,具体内容如下: ①.无连接 UDP协议它内部并没有维护端到端的一些连接状态,这跟TCP是不同的,TCP是基于连接的,而在连接的时候是需要进行三次握 ...
- NodeJS开发博客(三) 数据的保存
什么是cookie 存储在浏览器的一段字符串(最大5k) 跨域不共享 格式如 k1=v1 k2=v2 因此可以存储结构化数据 每次发送http请求,会将请求域的cookie一起发送给server se ...