入门2-分支结构

P4414 [COCI2006-2007#2] ABC

【题目描述】

三个整数分别为 A,B,CA,B,C。这三个数字不会按照这样的顺序给你,但它们始终满足条件:A < B < CA<B<C。为了看起来更加简洁明了,我们希望你可以按照给定的顺序重新排列它们。

【输入格式】

第一行包含三个正整数 A,B,CA,B,C,不一定是按这个顺序。这三个数字都小于或等于 100100。第二行包含三个大写字母 AA、BB 和 CC(它们之间没有空格)表示所需的顺序。

【输出格式】

在一行中输出 A,B 和 C,用一个 (空格)隔开。
输入输出样例
输入
1 5 3
ABC
输出
1 3 5
输入
6 4 2
CAB
输出
6 2 4
方法一

#include <bits/stdc++.h>
using namespace std;
char A,B,C;
int a[3];
int main()
{
	cin>>a[0]>>a[1]>>a[2];
	cin>>A>>B>>C;
	sort(a,a+3);
	cout<<a[A-'A']<<" "<<a[B-'A']<<" "<<a[C-'A'];
	return 0;
}

分析:这道题参考了一位大佬的做法,具体思路如下:利用一个数组,输入三个数字,以便利用stl的sort进行排序,排序之后,通过输入的A,B,C进行排序,由因为存在,A-‘A’=0,B-‘B’=1,因此,可知排序以后,A-‘A’=0(如果,A=‘A’时)可以正好和可以和最小的对应,以此类推输出结果。
注意,A可以为’A’,‘B’,‘C’。

方法二

#include <bits/stdc++.h>
using namespace std;
int a,b,c,sum,x,y,z;
char ch;
int main()
{
	cin>>x>>y>>z;
	sum=x+y+z;
	c=max(x,max(y,z));
	a=min(x,min(y,z));
	b=sum-(a+c);
	for(int i=1;i<=3;i++)
	{
		cin>>ch;
		if(ch=='A') cout<<a<<" ";
		if(ch=='B') cout<<b<<" ";
		if(ch=='C') cout<<c<<" ";
	}
	return 0;
}
NOIP2016 普及组 T1

题目描述
P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物。她发现商店一共有 33种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起 见,P老师决定只买同一种包装的铅笔。

商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过nn支铅笔才够给小朋 友们发礼物。

现在P老师想知道,在商店每种包装的数量都足够的情况下,要买够至少nn支铅笔最少需要花费多少钱。

输入格式
第一行包含一个正整数nn,表示需要的铅笔数量。

接下来三行,每行用2个正整数描述一种包装的铅笔:其中第1个整数表示这种 包装内铅笔的数量,第2个整数表示这种包装的价格。

保证所有的7个数都是不超过10000的正整数。

输出格式
1个整数,表示P老师最少需要花费的钱。

输入输出样例
输入
57
2 2
50 30
30 27
输出
54
说明/提示
铅笔的三种包装分别是:
2支装,价格为2;
50支装,价格为30;
30支装,价格为27。
P老师需要购买至少57支铅笔。

如果她选择购买第一种包装,那么她需要购买29份,共计 2×29=58支,需要花费的钱为2×29=58。

实际上,P老师会选择购买第三种包装,这样需要买2份。虽然最后买到的铅笔数 量更多了,30×2=60支,但花费却减少为27×2=54,比第一种少。

对于第二种包装,虽然每支铅笔的价格是最低的,但要够发必须买2份,实际的花费达到了30×2=60,因此P老师也不会选择。
所以最后输出的答案是54。

在这里插入代码片#include <cstdio>
using namespace std;
int i,price,num,n,p,nu;
int main()
{
	scanf("%d",&n);
	for(i=1;i<=3;i++)
	{
		scanf("%d%d",&num,&price); 
		p=price;
		nu=num;
		 //输入并记录这个初始值的数量和价格。
		 while(num<n){num<<=1;price<<=1; //数字和价格翻倍直到大于n 
		 while(num>n){num-=nu;price-=p;  //*2可能导致买太多,故减去一些 
		 } 
		 while(num<n){  //可能减去太多又加上一些 
		 	num+=nu;
		 	price+=p; 
		 } 
		 } 
	}
	printf("%d",price);
	return 0;
}

分析
一大算法核心思想:倍增,以及位运算,a<<1相当于a*2

P1055 [NOIP2008 普及组] ISBN 号码

题目描述

每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括99位数字、11位识别码和33位分隔符,其规定格式如x-xxx-xxxxx-x,其中符号-就是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如00代表英语;第一个分隔符-之后的三位数字代表出版社,例如670670代表维京出版社;第二个分隔符后的五位数字代表该书在该出版社的编号;最后一位为识别码。

识别码的计算方法如下:

首位数字乘以11加上次位数字乘以22……以此类推,用所得的结果\bmod 11mod11,所得的余数即为识别码,如果余数为1010,则识别码为大写字母XX。例如ISBN号码0-670-82162-4中的识别码44是这样得到的:对067082162这99个数字,从左至右,分别乘以1,2,…,91,2,…,9再求和,即0×1+6×2+……+2×9=1580×1+6×2+……+2×9=158,然后取158 \bmod 11158mod11的结果44作为识别码。

你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出Right;如果错误,则输出你认为是正确的ISBN号码。

输入格式
一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。

输出格式
一行,假如输入的ISBN号码的识别码正确,那么输出Right,否则,按照规定的格式,输出正确的ISBN号码(包括分隔符-)。
输入
0-670-82162-4
输出
Right
输入
0-670-82162-0
输出
0-670-82162-4

#include <bits/stdc++.h>
using namespace std;
int main()
{
	char a[14],mod[12]="0123456789X"; //总共有13位字符,最后一位为识别码 
	int i,j=1,t=0;  //为什么mod[11]不行,因为字符串后面还有'\0'结束 
	scanf("%s",a);
	for(i=0;i<12;i++)
	{
		if(a[i]=='-')
			continue;
		else
			t+=(a[i]-'0')*j++; //减去48或者'0'字符,以为着将字符转换为数字。 
	}
	if(mod[t%11]==a[12])  //最开始的时候,我写t%11==a[12]这是不可以的,
	//因为,数字怎么可以等于字符了 
	{
		printf("Right");
	}
	else
	{
		a[12]=mod[t%11];
		printf("%s",a);
	}
	return 0;
} 

分析 用%d打印出来的结果是对应的ASCII码值;所以C语言中单个字符减去‘0’,多是用于字符转数字的时候(如:‘8’ - ‘0’ 的计算结果就是8)
小游戏

#include<iostream>
#include<cstdio>
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int main(){
int a=0,sheng=20,gong=10,fang=10,b,shengm=20,yao=0;
int guais,guaig,qian=0,c;
while(a==0){
cout<<"1.勇者商店"<<endl; 
cout<<"2.讨伐魔物"<<endl;
cout<<"3.角色资料"<<endl;
cout<<"请选择..."<<endl;
cout<<endl;
cin>>b;
if(b==1){
cout<<"1.装备"<<endl; 
cout<<"2.药品"<<endl;
cout<<"输入0退出"<<endl;
cout<<endl;
cin>>b;
if(b==1){
while(b!=0){
cout<<"1.武器"<<endl;
cout<<"2.盾牌"<<endl;
cout<<"3.盔甲"<<endl;
cout<<"输入0退出"<<endl;
cout<<endl;
cin>>b;
if(b==1){
cout<<"1.骑士长剑(+10) 价值:20"<<endl;
cout<<"2.石中剑(+20) 价值40"<<endl;
cout<<"3.魔王的右手(+90) 价值150"<<endl;
cout<<"输入4退出"<<endl;
cout<<endl;
cin>>b;
if(b==1&&qian>=20){
gong=20;
qian-=20;
cout<<"自身攻击"<<gong<<endl;
}
if(b==2&&qian>=40){
gong=30;
qian-=40;
cout<<"自身攻击"<<gong<<endl;
}
if(b==3&&qian>=150){
gong=100;
qian-=150;
cout<<"自身攻击"<<gong<<endl;
}
}
if(b==2){
cout<<"1.皇家盾牌(+10) 价值:20"<<endl;
cout<<"2.永恒堡垒(+20) 价值40"<<endl;
cout<<"3.魔王的左手(+90) 价值150"<<endl;
cout<<"输入4退出"<<endl;
cout<<endl;
cin>>b;
if(b==1&&qian>=20){
fang=20;
qian-=20;
cout<<"自身防御"<<fang<<endl;
}
if(b==2&&qian>=40){
fang=30;
qian-=40;
cout<<"自身防御"<<fang<<endl;
}
if(b==3&&qian>=150){
fang=100;
qian-=150;
cout<<"自身防御"<<fang<<endl;
}
}
if(b==3){
cout<<"1.战争盔甲(+10) 价值:20"<<endl;
cout<<"2.不灭龙甲(+20) 价值40"<<endl;
cout<<"3.魔王的精华(+90) 价值150"<<endl;
cout<<"输入4退出"<<endl;
cout<<endl;
cin>>b;
if(b==1&&qian>=20){
shengm=20;
qian-=20;
cout<<"自身生命"<<shengm<<endl;
}
if(b==2&&qian>=40){
shengm=30;
qian-=40;
cout<<"自身生命"<<shengm<<endl;
}
if(b==3&&qian>=150){
shengm=100;
qian-=150;
cout<<"自身生命"<<shengm<<endl;
}
}
}
}
if(b==2){
cout<<"1.快速回复(花费1)"<<endl;
cout<<"2.恢复药剂(花费5)*5"<<endl;
cout<<"输入0退出"<<endl;
cout<<endl;
cin>>b;
if(b==1&&qian>=1){
sheng=shengm;
qian--;
cout<<"自身生命"<<sheng<<endl;
}
if(b==2&&qian>=5){
yao=yao+5;
cout<<"药品数量"<<yao<<endl;
}
}
}
else if(b==2){
cout<<"1.小怪"<<endl;
if(gong>=15){
cout<<"2.魔头"<<endl;
if(gong>=20){
cout<<"3.大魔王"<<endl;
cout<<"输入0退出"<<endl;
cout<<endl;
cin>>b;
}
else{
cout<<"输入0退出"<<endl;
cout<<endl;
cin>>b;
} 
}
else{
cout<<"输入0退出"<<endl;
cout<<endl;
cin>>b;
} 
if(b==1){
guais=30;
guaig=5;
c=5;
while(guais>0&&sheng>0){
cout<<"1.攻击"<<endl; 
cout<<"2.防御(次数"<<c<<")"<<endl;
cout<<"3.回复(闪避)"<<endl;
cout<<endl;
cin>>b;	
if(b==1){
guais=guais-gong;
sheng=sheng-guaig;
cout<<"怪物生命"<<"-"<<gong<<"="<<guais<<endl;
cout<<"自身生命"<<"-"<<guaig<<"="<<sheng<<endl;
}
if(b==2&&c!=0){
if(fang>=guaig){
guais=guais-(fang-guaig);
cout<<"怪物生命"<<"-"<<fang-guaig<<"="<<guais<<endl;
}
else{
sheng=sheng-(guaig-fang);
cout<<"自身生命"<<"-"<<guaig-fang<<"="<<sheng<<endl;
}
c--;
}
if(b==3&&yao>0){
yao--;
sheng=sheng+20;
if(sheng>shengm)sheng=shengm;
cout<<"药品数量"<<yao<<endl;
cout<<"自身生命+20("<<sheng<<")"<<endl;
}
if(sheng<=0){
cout<<"你死了"<<endl;
break;
}
}
if(sheng>0){
qian=qian+2;
cout<<"金币"<<"+2"<<endl;
}
cout<<endl;	
}
if(b==2){
guais=50;
guaig=10;
c=7;
while(guais>0&&sheng>0){
cout<<"1.攻击"<<endl; 
cout<<"2.防御(次数"<<c<<")"<<endl;
cout<<"3.回复(闪避)"<<endl;
cout<<endl;
cin>>b;	
if(b==1){
guais=guais-gong;
sheng=sheng-guaig;
cout<<"怪物生命"<<"-"<<gong<<"="<<guais<<endl;
cout<<"自身生命"<<"-"<<guaig<<"="<<sheng<<endl;
}
if(b==2&&c!=0){
if(fang>=guaig){
guais=guais-(fang-guaig);
cout<<"怪物生命"<<"-"<<fang-guaig<<"="<<guais<<endl;
}
else{
sheng=sheng-(guaig-fang);
cout<<"自身生命"<<"-"<<guaig-fang<<"="<<sheng<<endl;
}
c--;
}
if(b==3&&yao>0){
yao--;
sheng=sheng+20;
if(sheng>shengm)sheng=shengm;
cout<<"药品数量"<<yao<<endl;
cout<<"自身生命+20("<<sheng<<")"<<endl;
}
if(sheng<=0){
cout<<"你死了"<<endl;
break;
}
}
if(sheng>0){
qian=qian+10;
cout<<"金币"<<"+10"<<endl;
}
cout<<endl;	
}
if(b==3){
guais=100;
guaig=20;
c=15;
while(guais>0&&sheng>0){
cout<<"1.攻击"<<endl; 
cout<<"2.防御(次数"<<c<<")"<<endl;
cout<<"3.回复(闪避)"<<endl;
cout<<endl;
cin>>b;	
if(b==1){
guais=guais-gong;
sheng=sheng-guaig;
cout<<"怪物生命"<<"-"<<gong<<"="<<guais<<endl;
cout<<"自身生命"<<"-"<<guaig<<"="<<sheng<<endl;
}
if(b==2&&c!=0){
if(fang>=guaig){
guais=guais-(fang-guaig);
cout<<"怪物生命"<<"-"<<fang-guaig<<"="<<guais<<endl;
}
else{
sheng=sheng-(guaig-fang);
cout<<"自身生命"<<"-"<<guaig-fang<<"="<<sheng<<endl;
}
c--;
}
if(b==3&&yao>0){
yao--;
sheng=sheng+20;
if(sheng>shengm)sheng=shengm;
cout<<"药品数量"<<yao<<endl;
cout<<"自身生命+20("<<sheng<<")"<<endl;
}
if(sheng<=0){
cout<<"你死了"<<endl;
break;
}
}
if(sheng>0){
qian=qian+100;
cout<<"金币"<<"+100"<<endl;
}
cout<<endl;	
}
}
else if(b==3){
printf("请稍后");
for(int i=1;i<=5;i++){
printf(".");
Sleep(500);
}
printf("\n自身资料\n");
printf("----------------------------------------------\n");
printf("生命: %d ",sheng);
printf("攻击: %d\n\n",gong);
printf("防御: %d ",fang);
printf("生命上限: %d\n\n",shengm);
printf("金币: %d ",qian);
cout<<endl<<endl;
}
}
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值