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;
}