【有奖】NOIP普及组模拟赛 个人邀请赛 乐多赛

题目描述
日本数学家角谷有一个猜想:任意一个自然数,经过以下过程,最终会得到1。现在请你打印出任意一个数使用角谷猜想转换为1需要几次。
演变方式:
1.如果这个数为奇数,则将它×3+1。如果这个数为偶数,则将它÷2。
2.当这个数为1时,结束计算。
输入输出格式
输入格式:
输入共1行。
第1行:a,代表演变前的数。
输出格式:
一个自然数n,表示需要n次才能用角谷猜想把这个数变成1
输入输出样例
8
3
说明
数据可能很大,要用高精度

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define N 200500
int num[N]={};
int n,m,len=;
char s[N];
unsigned long long tot=;
void mul(int k){
for(int i=;i<=len;i++){
num[i]*=k;
if(i>){
num[i]+=num[i-]/;
num[i-]%=;
} }
for(;num[len]>=;len++){
num[len+]=num[len]/;
num[len]%=;
}
}
void div(int k){
int d=;
for(int i=len;i;i--){
d=d*+num[i];
num[i]=d/k;
d%=k;
}
while(!num[len]) len--;
}
void add1(){
int t=;
num[]+=;
while(num[t]>) num[t+]+=num[t]/,num[t]%=,t++;
if(t>len) len=t;
}
bool judge(){
if(len==&&num[]==) return ;
return ;
}
bool odd(){
return num[]&;
}
void dfs(){
if(judge()) return ;
if(odd()) mul(),add1();
else div();
tot++;
dfs();
}
int main(){
cin>>s;
int p=;
len=strlen(s);
for(int i=len-;i>=;i--) num[++p]=s[i]-'';
dfs();
cout<<tot;
return ;
}
U5190 去除多余括号
题目描述
有一个四则运算的表达式(+、-、*、/),它可能有一些多余的括号可以去掉。把这些括号去掉的条件是:可以改变运算顺序,只要表达式计算结果不变即可(每去掉一组括号都不能使结果变化)。现在请你输出去掉多余括号的表达式。
输入输出格式
输入格式:
一个表达式
输出格式:
去掉所有多余括号的表达式
输入输出样例
a+(b-c)
a+b-c
1+2*3
1+2*3
说明
数据保证所有的括号合法,表达式长度不超过100个字符

#include<string>
#include<iostream>
using namespace std;
inline bool isOperator(char c){
return c=='+'||c=='-'||c=='*'||c=='/';
}
bool allMulOrDiv(const string& exp){
for(int i=,len=exp.size();i<len;++i){
if(exp[i]=='('){
int cnt=;
for(++i;true;++i){
if(exp[i]=='(') ++cnt;
else if(exp[i]==')'){
--cnt;
if(!cnt) break;
}
}
++i;
}
if(exp[i]=='+'||exp[i]=='-') return false;
}
return true;
}
int findMatchedLeft(const string& exp,int r){
int countOfRight=;
for(--r;r>=;--r){
if(exp[r]==')') ++countOfRight;
else if(exp[r]=='('){
--countOfRight;
if(!countOfRight) break;
}
}
return r;
}
string& simplify(string& exp){
int left,right=;
char head,tail,can;
while((right=exp.find(')',right))!=string::npos){
left=findMatchedLeft(exp,right);
//get info
if(left&&isOperator(exp[left-])) head=exp[left-];
else head='+';
if(right+<exp.size()&&isOperator(exp[right+])) tail=exp[right+];
else tail='+';
//analyze
if(right-left==) can=;
else if(head=='/') can=;
else if(head=='*'||head=='-') can=allMulOrDiv(exp.substr(left+,right-left-));
else can=tail=='+'||tail=='-'||allMulOrDiv(exp.substr(left+,right-left-));
//process
if(can){
exp.erase(left,).erase(right-,);
--right;
}
else ++right;
}
return exp;
}
int main(){
string exp;
getline(cin,exp);
cout<<simplify(exp);
return ;
}
更正AC代码:
#include<cstdio>
using namespace std;
int hasExcess(char s[],int leftBracket,int rightBracket){
int i,leftAcount;
//判断"-(a+b)"类型
if(s[leftBracket-]=='-'){
i=leftBracket;
leftAcount=;
while(++i<rightBracket){
if(s[i]=='(') leftAcount ++;
if(s[i]=='+'&&leftAcount==) return ;
}
}
if(s[leftBracket-]=='/') return ;
//判断"加或减(a 任意 b)加或减"类型
if(s[leftBracket-]!='*'&&s[leftBracket-]!='/'&&s[rightBracket+]!='*'&&s[rightBracket+]!='/') return ;
//判断"*(a*b)乘或除以"类型
i=leftBracket;
leftAcount=;
while(++i<rightBracket){
if(s[i]=='(') leftAcount ++;
if(s[i]=='*'&&leftAcount==) return ;
}
return ;
}
int delExcessBracket(char s[],int index){
int leftBracket,rightBracket;
while(s[index]!='\0'){
if(s[index]==')') return index;
if(s[index]=='('){
leftBracket=index;
index=rightBracket=delExcessBracket(s,index+);
if(hasExcess(s,leftBracket,rightBracket))
s[leftBracket]=s[rightBracket]=' ';
}
index++;
}
}
int main(){
char str[];
scanf("%s",str);
delExcessBracket(str,);
for(int i=;str[i]!='\0';i++) if(str[i]!=' ') printf("%c",str[i]);
return ;
}
U5191 小偷的背包
题目描述
小偷的背包问题,大家知道是0-1背包问题。只是每件将要偷的物品的重量和价值都是带有1位小数的实数。小偷的背包可以装入物品的最大重量也是带有1位小数。
输入输出格式
输入格式:
两个数m (小偷背包的承重)和 n(物品件数) (1.0<=m<=100.0, 1<=n<=20)
以下是n行是每件物品的重量和价值。
输出格式:
最大价值。(带有1位小数,如果是整数,请输出 XXX.0)
输入输出样例
34.5 3
12.4 21.5
15.3 18.4
20.2 10.2
39.9

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e4+;
int n;
double m,v[N],c[N],f[N];
int main(){
scanf("%lf%d",&m,&n);
int V=m*;
for(int i=;i<=n;i++) scanf("%lf%lf",&v[i],&c[i]),v[i]*=,c[i]*=;
for(int i=;i<=n;i++){
for(int j=V;j>=v[i];j--){
f[j]=max(f[j],f[j-(int)v[i]]+c[i]);
}
}
f[V]/=;
printf("%.1lf",f[V]);
return ;
}
U5215 不同的二叉树
题目描述
由n个节点可组成多少个不同的二叉树?
输入输出格式
输入格式:
一个正整数n。
输出格式:
不同的二叉树的个数。
输入输出样例
1
1
说明
测试数据规模:
保证40%的数据n<=35;
保证100%的数据n<=5000。
保证120%的数据n<=10000。

#include<cstdio>
#include<cmath>
int a[][],b[],n;
void catalan()
{
int i,j,len,digit,t;
a[][]=b[]=len=;
for(i=;i<=n;i++)
{
for(j=;j<len;j++)
a[i][j]=a[i-][j]*(*(i-)+);
digit=;
for(int j=;j<len;j++){
t=a[i][j]+digit;
a[i][j]=t%;
digit=t/;
}
while(digit){
a[i][len++]=digit%;
digit/=;
}
digit=;
for(int j=len-;j>=;j--){
t=digit*+a[i][j];
a[i][j]=t/(i+);
digit=t%(i+);
}
while(!a[i][len-])len--;
b[i]=len;
}
}
int main(){
scanf("%d",&n);
catalan();
for(int i=b[n]-;i>=;i--) printf("%d",a[n][i]);
return ;
}
更正AC代码:
#include<cstdio>
using namespace std;
const int N=1e6+;
int n,len;
int f[N];
void mul(int x){
for(int i=;i<=len;i++) f[i]*=x;
for(int i=;i<=len;i++){
f[i+]+=f[i]/;
f[i]=f[i]%;
}
while(f[len+]){
f[len+]=f[len+]/;
f[len+]%=;
len++;
}
}
void div(int x){
for(int i=len;i>=;i--){
f[i-]+=f[i]%x*;
f[i]/=x;
}
for(int i=len;i>=;i--)if(f[i]){len=i;break;}
}
int main(){
scanf("%d",&n);
f[len=]=;
for(int i=;i<=n;i++)mul(*i-),div(i+);
for(int i=len;i;i--) printf("%d",f[i]);
return ;
}
【有奖】NOIP普及组模拟赛 个人邀请赛 乐多赛的更多相关文章
- 2017.1.16【初中部 】普及组模拟赛C组总结
2017.1.16[初中部 ]普及组模拟赛C组 这次总结我赶时间,不写这么详细了. 话说这次比赛,我虽然翻了个大车,但一天之内AK,我感到很高兴 比赛 0+15+0+100=115 改题 AK 一.c ...
- ZROI 普及组模拟赛02总结
ZROI 普及组模拟赛02总结 先放[网址][http://zhengruioi.com/contest/96] 可能是有一段时间没有打这种正式的比赛了,今天打的很奇怪... T1 模拟水题 既然是普 ...
- 2016.9.15初中部上午NOIP普及组比赛总结
2016.9.15初中部上午NOIP普及组比赛总结 2016.09.15[初中部 NOIP普及组 ]模拟赛 又翻车了!表示时超和空超很可恨! 进度 比赛:AC+0+0+20=120 改题:AC+80+ ...
- 2016.10.29初中部上午NOIP普及组比赛总结
2016.10.29[初中部 NOIP普及组 ]模拟赛 做得好爽! 进度: 比赛:35+45+AC+0=180 改题:AC+AC+AC+0=300 幸运的数 有点无语--之前怕超限,还特意利用程序打了 ...
- 2016.9.24初中部上午NOIP普及组比赛总结
2016.9.24初中部上午NOIP普及组比赛总结 2016.09.24[初中部 NOIP普及组 ]模拟赛 其实这次我没比赛,早上去参加亲子活动去了. 不过在下午我做完了所有的题,感觉还好. 进度 现 ...
- 2016.9.17初中部下午NOIP普及组比赛总结
2016.9.17初中部下午NOIP普及组比赛总结 2016.09.17[初中部 NOIP普及组 ]模拟赛 最近几次的题目都不是自己擅长的啊... 不过含金量挺高的,也好... 进度: 比赛:0+0+ ...
- 2321. 【NOIP普及组T1】方程
2321. [NOIP普及组T1]方程 时间限制: 1000 ms 空间限制: 262144 KB 题目描述
- 2016.9.3初中部上午NOIP普及组比赛总结
2016.9.3初中部上午NOIP普及组比赛总结 链接:https://jzoj.net/junior/#contest/home/1339 这次真爽,拿了个第四!(我还被班主任叫过去1小时呢!) 进 ...
- 2016.8.18上午纪中初中部NOIP普及组比赛
2016.8.18上午纪中初中部NOIP普及组比赛 链接:https://jzoj.net/junior/#contest/home/1336 翻!车!啦!好吧,那是因为大神归来. 进度: 比赛:AC ...
随机推荐
- 转:使用vs2013打开VS2015的工程文件的解决方案(适用于大多数vs低版本打开高版本)
http://www.cnblogs.com/WayneLiu/p/5060277.html 前言:重装系统前我使用的是vs2015(有点装*),由于使用2015实在在班上太另类了, 导致我想在其他同 ...
- GitHub 基本常用知识解答2
1.如何拥有一个Git仓库的两种途径 (1)在已有的目录中,初始化一个新的. (2) 比如一个新的项目,或者一个已存在的项目,但该项目尚未有版本控制.如果你想要复制一份别人的项目, 或者与别人合作某个 ...
- IOS数组NSArray与NSMutableArray知识点
此文是对数组NSArray与NSMutableArray知识点的总结,主要是一些常见的操作,别外一些操作见其相应的文档,下面的代码部分还运用的第三方插件BlocksKit相结合: a:Foundati ...
- nginx配置入门
谢谢作者的分享精神,原文地址:http://www.nginx.cn/591.html nginx配置入门 之前的nginx配置是对nginx配置文件的具体含义进行讲解,不过对于nginx的新手可能一 ...
- 阶乘 求n!中质因数的个数
在n!中末尾有几个0 取决于n!中5的个数(2肯定比5多) 所以遍历从1到n的数,看总共有几个5即可 ..N do j = i; == ) ++ret; j /= ; end end 有个nb的方法: ...
- (转载)APP测试点总结
以下所有测试最后必须在真机上完整的执行1.安装.卸载测试 在真机上的以及通过91等第三方的安装与卸载 安装在手机上还是sd卡上 2.启动app测试3.升级测试 数字签名.升级覆盖安装.下载后手动覆盖安 ...
- linux命令详解之挂载光驱的方法
linux的硬件设备在/dev目录下,光驱也是其中./dev/cdrom表示光驱,挂载光驱的方法如下(以root身份): 代码如下: mkdir /mnt/cdrommount -t auto - ...
- 转载的vim配置文件
""""""""""""""""&quo ...
- Android中手机号、车牌号正则表达式
手机号 手机号的号段说明转载自:国内手机号码的正则表达式|蜗牛的积累 手机名称有GSM:表示只支持中国联通或者中国移动2G号段(130.131.132.134.135.136.137.138.139. ...
- 用Java实现单链表的基本操作
笔试题中经常遇到单链表的考题,下面用java总结一下单链表的基本操作,包括添加删除节点,以及链表转置. package mars; //单链表添加,删除节点 public class ListNode ...