【有奖】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 ...
随机推荐
- 为网站添加ico图标
1.将目标图片装换为.ico格式 在线转换工具:http://www.bitbug.net/ 2.将装换后的图标放入项目文件中,一般命名为favicon 3.在项目文件的index页面中引入 < ...
- Azure SQL Database 时间点还原(Point in Time Restore)功能
微软中国TechNet 7 Oct 2014 9:17 PM Comments 0 Likes 原文地址:http://blogs.technet.com/b/azuretw/archive/20 ...
- 解决SharePoint 文档库itemadded eventhandler导致的上传完成后,编辑页面保持报错的问题,错误信息为“该文档已经被编辑过 the file has been modified by...”
在文档库中添加itemadded 后,在上传文件后,会自动打开文档属性的编辑页面,在保存的时候就会报错,说这个文档已经被编辑过了.这是应为默认itemadded实践是异步执行的,会在edit页面打开之 ...
- 在iOS 8中使用UIAlertController
iOS 8的新特性之一就是让接口更有适应性.更灵活,因此许多视图控制器的实现方式发生了巨大的变化.全新的UIPresentationController在实现视图控制器间的过渡动画效果和自适应设备尺寸 ...
- fragment 切换
1.Fragment的添加方式 FragmentTransaction ft = getFragmentManager().beginTransaction(); ft.hide ft.show ft ...
- 怎么录制Android或IOS动画教程
前一篇文章介绍了用DemoCreator制作Android视频教程,今天再介绍一种方法. 那就是用GifCam软件录制,此软件录制导出成Gif动画图片,可直接放在你的文章里面,效果比flash要好. ...
- 虚拟机Linux----Ubuntu1204----root登录设置
说明:装好的ubuntu12.04登录时,默认是看不到root用户的,需要设置一下. 1.先用普通用户登录,打开终端,切换为root用户,如下: su root 2.修改 sudo gedit /et ...
- KEIL与ADS1.2共存
出现的问题: 原来电脑已经安装了ADS1.2.现在安装keil5编译一个32位新唐单片机程序时,出现了如下错误: Error: L6411E: No compatible library exists ...
- Dreamweaver 制作图片热点之后,点击热点部分会有个提示框,怎么去掉
可以这么写试试看<map name="Map"> <area shape="rect" coords="364,31,517,64& ...
- 由fdopen和fopen想到的
ISO C并没有规定fdopen,而是POSIX的补充. FILE *fopen(const char *path, const char *mode); FILE *fdopen(int fd, c ...