摘陶陶
题目描述
话说去年苹果们被陶陶摘下来后都很生气,于是就用最先进的克隆技术把陶陶克隆了好多份> .< 然后把他们挂在树上,准备摘取。 摘取的规则是,一个苹果只能摘一个陶陶,且只能在它所能摘到的高度以下的陶陶,陶陶高度为0时,不能摘取,如果摘不到的话只能灰溜溜的走开了> .< 给出苹果数目及每个苹果可以够到的高度和各个陶陶的高度,求苹果们都摘完后剩下多少个陶陶……
输入
第一行为两个数,分别为苹果的数量n和陶陶的数量m(n,m< =2000) 以下的n行,分别为各个苹果能够到的最大高度。 再接下来的m行,分别为各个陶陶的高度。 高度均不高于300。 当然了,摘取的顺序按照输入的“苹果够到的最大高度”的顺序来摘。
输出
输出仅有一个数,是剩下的陶陶的数量
样例输入 复制
5 5
9
10
2
3
1
6
7
8
9
10
样例输出 复制
3
大体思路:带一点贪心的思想,需要对号入座一样,什么样的能力对应什么样的陶陶,即与相对应的陶陶相差最小,为最优解。话不多说看代码。
#include
#include
#include
#include
int cmp(const void*b,const void*c);//快排函数的声明
int main()
{
int n,m,cnt=0;//apple taotao
int a[2000],t[2000];
//苹果与陶陶数量的输入
scanf("%d %d",&n,&m);
//各个苹果可以够到的高度的输入
for(int i=0;it[j]&&t[j]!=0)//如果苹果可以够到淘淘且淘淘不为0
{
cnt++;//计算摘了多少个
t[j]=0;break;//摘去淘淘后淘淘变0,使摘过的不再被摘
}
}
}
printf("%d",m-cnt);//输出剩下的个数
return 0;
}
//此处为快排函数的调用,还没见过的朋友快去学吧
int cmp(const void*b,const void*c)
{
return (*(int *)c-*(int *)b);
}
I still love you very much!
题目描述
等一个喜欢的人,需要多久?
有佛祖弟子阿难,曾愿化身石桥,
受五百年风吹,五百年日晒,五百年雨打,
但求一少女从桥上经过。
忘一个喜欢的人,又需要多久?
你的好友一直想对一个女孩说"I still love you very much!",可出于某种原因,他想将这句话发到网上,好让她看见。可你的好友又怕太多人知道这句话的意思,
于是他便想将这句话中的每一个字符所对应的int值转换为二进制,二进制不足8位的在前面补0,比如字符'I'所对应的int值为73,所对应的二进制为01001001.
由于你的好友还不会字符串,所以只能来求助你了。
输入
输入一个可能带空格的字符串s,1<=strlen(s)<=1000
输出
将该字符串中的每个字符换成二进制,每个二进制占一行。
样例输入 复制
I still love you very much!
样例输出 复制
01001001
00100000
01110011
01110100
01101001
01101100
01101100
00100000
01101100
01101111
01110110
01100101
00100000
01111001
01101111
01110101
00100000
01110110
01100101
01110010
01111001
00100000
01101101
01110101
01100011
01101000
00100001
大体思路:将一个十进制的数转化为二进制可以采用除基取余法然后逆序输出所得到的余数即为二进制。
#include
#include
#include
#include
int main()
{
char arr[1000]={0};
int ans[8]={0},a[1000]={0};
gets(arr);//读取字符
int len=strlen(arr);//输入字符的长度
for(int i=0;i=0;j--)
printf("%d",ans[j]);//逆序输出存入的余数
puts("");//每个字符输出完后换行
memset(ans,0,sizeof(ans));//输出完后将ans数组的元素初始化为0
}
return 0;
}
I still love you very much!(续)
题目描述
自从他学会字符串后,又陆陆续续的在qq动态上发了几条01串的说说。
你非常了解那些01串的含义:那些只包含0,1的数字串表示的是一个数的二进制,可以先将它转换为十进制。然后根据ASCII表,
可以将那个十进制的数字转换为它所对应的字符。比如说:01001001的二进制数字串,将它转换成十进制就是73。而73所对应的字符为'I';
你很好奇他发的是啥,于是便迫不及待的敲起了代码............
输入
第一行输入一个n,(1<=n<=100)表示有n行01串。
接下来n行,每行输入一个0,1串。保证0,1串的长度一定为8。
输出
将那n行0,1串所对应的字符输出
样例输入 复制
27
01001001
00100000
01110011
01110100
01101001
01101100
01101100
00100000
01101100
01101111
01110110
01100101
00100000
01111001
01101111
01110101
00100000
01110110
01100101
01110010
01111001
00100000
01101101
01110101
01100011
01101000
00100001
样例输出 复制
I still love you very much!
大体思路:二进制转化为字符,可以先转化为十进制(按权展开),然后输出对应字符。
#include
#include
#include
#include
int main()
{
int ans=0,n;
/*注意这里有个小知识点,可以看到样例的输入是00010111这样的,连续的数字而我们转化的时候只需要其中一个
因此我们将输入的改为字符*/
char a[9]; //定义长度为9的字符,注意要比输入的字符长度要大一点,读取回车键,防止溢出
scanf("%d",&n);/*输入数组的长度//这里采用了gets来读取字符,最好采取scanf()来读入,因为gets输入的大小是不确定的
,具体原因的话和判题机的不同有关尽量不要使用gets*/
getchar();//注意这里要有getchar用来读取回车键,防止回车被读入下方的gets中
for(int i=0;i=0;j--,power++)//从末尾开始遍历读取//power为对应的次方
{
ans=ans+(a[j]-'0')*pow(2,power);//求出每个字符所对应的ascii码值//按权展开
}
printf("%c",ans);//输出对应的字符//这里并没有使用一个新的数组用来将十进制转化为对应的字符了,编译器会自动转化
}
return 0;
}
题目描述
网上流传一句话:"常在网上飘啊,哪能不挨刀啊~"。其实要想能安安心心地上网其实也不难,学点安全知识就可以。
首先,我们就要设置一个安全的密码。那什么样的密码才叫安全的呢?一般来说一个比较安全的密码至少应该满足下面两个条件:
(1).密码长度大于等于8,且不要超过16。
(2).密码中的字符应该来自下面“字符类别”中四组中的至少三组。
这四个字符类别分别为:
1.大写字母:A,B,C...Z;
2.小写字母:a,b,c...z;
3.数字:0,1,2...9;
4.特殊符号:~,!,@,#,$,%,^,&;
给你一个密码,你的任务就是判断它是不是一个安全的密码。
输入
输入数据第一行包含一个数M,接下有M行,每行一个密码(长度最大可能为50),密码仅包括上面的四类字符。
输出
对于每个测试实例,判断这个密码是不是一个安全的密码,是的话输出YES,否则输出NO。
样例输入 复制
3
a1b2c3d4
Linle@ACM
^~^@^@!%
样例输出 复制
NO
YES
NO
大体思路:根据题意模拟条件就完了。话不多说。
#include
#include
#include
#include
int main()
{
int M,cnt1=0,cnt2=0,cnt3=0,cnt4=0,len;
char ch[51];
scanf("%d",&M);//M组数据的读入
getchar();//防止换行符被读入
for(int i=1;i<=M;i++)//M组数据
{
gets(ch);//字符的读入
cnt1=0;cnt2=0;cnt3=0;cnt4=0;
len=strlen(ch);
if(len>=8&&len<=16)//确保输入的字符大小在8~16
{
for(int j=0;j='A'&&ch[j]<='Z')cnt2=1;
if(ch[j]>='a'&&ch[j]<='z')cnt3=1;
if(ch[j]>='0'&&ch[j]<='9')cnt4=1;
}
}
//如果输入的字符数量不在8~16则输出no
else
{
printf("NO\n");continue;//输出完no之后继续进入下一组数据的输入
}
//如果所有计数器相加>=3,则说明有3种类型的字符。满足题意为安全反之为不安全
if((cnt1+cnt2+cnt3+cnt4)<3)printf("NO\n");
else printf("YES\n");
}
return 0;
}
密码锁问题(JSU-ZJJ)
一个微调密码锁是这样的一种锁,这种锁你仅能转动密码盘。这是一种常见的密码盘,通过仅在允许的组中改变这些密码盘以微调某个值。
设想一行有D个编号的密码盘,每个密码盘顺序有0到9共九个数字。这类似于密码箱的组合锁。
下面是一系列B按钮,每个按钮标记有D位数字。例如,D可能是4标记就是1000 1200 1002 0111.按标记为1000的按钮,则仅转动第一个转盘一次,而其他转盘不动,而按按钮1002则转第一个转盘一次,转第四个转盘两次,剩下的不动。每个盘按循环的方式转动,即如果转到9,再转一次,就又转回0.
你的任务是模仿这样一个上锁的微调密码锁,给出最终的各密码盘的读数。
输入
输入的每个测试数据的第一行包含有D个数字(至多10个),表示密码盘的起始位置。接下来的每一行有一排有标记的按钮,表示下一次会按的按钮。
输出
对每个测试用例用一行输出最终各密码盘的读数。
样例输入 复制
0001
1003
0206
0034
1111
1003
样例输出 复制
3348
题目并不难,主要在于对题目的理解,理解题目要你干什么。(最终的题意其实就是一个多组输入)
大体思路:设置一个数组,将输入的数累加进行对应操作,得出最终结果。
(当然这题的读入可不能用int数组读入,仔细看输入为连着的数,因此我们需要采用字符数组读入)
#include
#include
#include
#include
int main()
{
char ch[11];//切记数组开大一点,读取回车符防止溢出
char sh[11];
gets(ch);//读入初始密码(初始位置)
int len;
getchar();
while(~scanf("%s",sh))//读入后续需要转动的对应位置
{
len =strlen(sh);
for(int i=0;i
题目描述
一个众所周知的事实,在每一慧星后面是一个不明飞行物UFO。 这些不明飞行物时常来收集来自在地球上忠诚的支持者。 不幸地,他们的空间在每次旅行只能带上一群支持者。 他们要做的是用一种聪明的方案让每一个团体人被慧星带走。 他们为每个慧星起了一个名字,通过这些名字来决定一个团体是不是特定的慧星带走。 那个相配方案的细节在下面被给出; 你的工作要写一个程序来通过团体的名字和彗星的名字来决定一个组是否应该与在那一颗慧星后面的不明飞行物搭配。团体的名字和慧星的名字都以下列各项方式转换成一个数字: 这个最后的数字代表名字中所有字母的信息,"A" 是 1 和 "Z" 是 26。举例来说,团体 "USACO" 会是 21*19*1*3*15=17955 。 如果团体的数字 mod 47 等于慧星的数字 mod 47,那么你要告诉这个团体准备好被带走 ! 写一个程序读入慧星的名字和团体的名字,如果搭配打印"GO"否者打印"STAY" 团体的名字和慧星的名字将会是没有空格或标点的一串大写字母(不超过6个字母)
输入
第 1 行: 彗星的名字(一个长度为1到6的字符串) 第 2 行: 团体的名字(一个长度为1到6的字符串)
输出
单独一行包含"STAY"或"GO".
样例输入 复制
COMETQ
HVNGAT
样例输出 复制
GO
水题一道。直接上代码。
#include
#include
#include
#include
int main()
{
long long sum1=1,sum2=1;
char ch[7];//数组开大一点
char sh[7];
gets(ch);
gets(sh);
int len1=strlen(ch);
int len2=strlen(sh);
for(int i=0;i
题目描述
在ICPC比赛中,气球的分配方式如下。
每当一个团队解决了一个问题,该团队就得到一个气球。
第一个解决一个问题的队伍可以得到一个额外的气球。
一场比赛有26个问题,标记为A,B,C,...,Z。你会得到比赛中已解决的问题的顺序,用字符串s表示,其中第i个字符表示问题s[i]已经被某个团队解决。没有团队会两次解决同一个问题。
确定各队收到的气球总数。请注意,有些问题可能没有被任何一个团队所解决。
输入
输入的第一行包含一个整数t(1≤t≤100)--测试用例的数量。
每个测试用例的第一行包含一个整数n(1≤n≤50)--字符串的长度。
每个测试案例的第二行包含一个长度为n的字符串s,由大写英文字母组成,表示已解决问题的顺序。
输出
对于每个测试案例,输出一个整数--各队收到的气球总数。
样例输入 复制
4
3
ABA
1
A
3
ORZ
5
BAAAA
样例输出 复制
5
2
6
7
大体思路:可以算出各个字符所出现的次数加1(第一次出现气球数为二可以在总数上+1)最后求和就好了。
#include
#include //7.2
#include
#include
int main()
{
int t,n,cnt=0;
char ch[51];int temp[26]={0};
scanf("%d",&t);//t组案例
for(int i=0;i
题目描述
国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革,以推动乒乓球运动在全球的普及。其中11分制改革引起了很大的争议,有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位,他退役之后走上了乒乓球研究工作,意图弄明白11分制和21分制对选手的不同影响。在开展他的研究之前,他首先需要对他多年比赛的统计数据进行一些分析,所以需要你的帮忙。
华华通过以下方式进行分析,首先将比赛每个球的胜负列成一张表,然后分别计算在11分制和21分制下,双方的比赛结果(截至记录末尾)。
比如现在有这么一份记录,(其中W表示华华获得一分,L表示华华对手获得一分):
WWWWWWWWWWWWWWWWWWWWWWLW
在11分制下,此时比赛的结果是华华第一局11比0获胜,第二局11比0获胜,正在进行第三局,当前比分1比1。而在21分制下,此时比赛结果是华华第一局21比0获胜,正在进行第二局,比分2比1。如果一局比赛刚开始,则此时比分为0比0。
你的程序就是要对于一系列比赛信息的输入(WL形式),输出正确的结果。
输入
每个输入文件包含若干行字符串(每行至多20个字母),字符串有大写的W、L和E组成。其中E表示比赛信息结束,程序应该忽略E之后的所有内容。
输出
输出由两部分组成,每部分有若干行,每一行对应一局比赛的比分(按比赛信息输入顺序)。其中第一部分是11分制下的结果,第二部分是21分制下的结果,两部分之间由一个空行分隔。
最后一局没有开始也要输出,即输出0:0
样例输入 复制
WWWWWWWWWWWWWWWWWWWW
WWLWE
样例输出 复制
11:0
11:0
1:1
21:0
2:1
提示
不清楚乒乓球比赛规则的可以先百度下规则
即当11分制双方10平之后,得超过对方两分才算赢。
当21分制双方20平之后,同以上。
直接上代码。思路在代码注释中。
#include
#include
#include
#include
int main() {
int a = 0, b = 0, len ,cnt =0;
char arr[72550];
memset(arr, '0', sizeof(arr));
//将E前面的所有成绩存入数组a
while (1)
{
char temp;//设置一个暂时值
scanf("%c", &temp);
if (temp == 'E')break;
arr[cnt++]=temp;//如果输入的值不为E则存进数组arr中
}
len = strlen(arr);//求出其长度
//11分制的情况
for (int i = 0; i < len; i++)
{
if (arr[i] == 'W') a++;//对应的比分++
else if (arr[i] == 'L') b++;//对应的比分++
if ((a >= 11 && a - b >= 2 )||(b >= 11 && b - a >= 2) )//注意分a赢与b赢
{
printf("%d:%d\n", a, b);//如果有人率先到达11分并且分差大于等于2输出该比分。
a = 0, b = 0;//输出一次比分后比分清零
}
}
printf("%d:%d\n", a, b);//输出没有打完的时候的比分//如果还没有打则会输出0:0//此处为关键//当比分没有达到结束比赛时则输出//比赛没有开始就输出0:0
puts("");
a = 0, b = 0;//比分初始化
//21分制的情况
for (int i = 0; i < len ; i++)
{
if (arr[i] == 'W') a++;//对应的比分++
else if (arr[i] == 'L') b++;//对应的比分++
if ((a >= 21 && a - b >= 2)||(b >= 21 && b - a >= 2) )
{
printf("%d:%d\n", a, b);//如果有人率先到达11分并且分差大于等于2输出该比分。
a = 0, b = 0;//输出一次比分后比分清零
}
}
printf("%d:%d", a, b);//输出没有打完的时候的比分//如果还没有打则会输出0:0
}
题目描述
小叶子现有一个非负整数n,它的任务是计算 n 的各位数的和 , 并且按英语输出总和中的每一个数字。
输入
每次一个整数n,n<=10^100
输出
按要求输出。
样例输入 复制
12345
样例输出 复制
one five
大体思路:计算各个位数的和,我们可以采取字符输入的方式去读入字符。省去的分解各个位数的操作。
#include //小叶子学英文
#include
#include
#include
int main()
{
char ch[10002];
gets(ch);//输入数
int sum=0,cnt=0,ans[10005];
if(ch[0]=='0'){printf("zero");return 0;}//特判输入0的时候
for(int i=0;i0)
{
ans[cnt++]=sum%10;//将和的各个数拆开存入ans数组
sum/=10;
}
int cnt1=0;
char ans1[10005];
for(int i=cnt-1;i>=0;i--)
{
ans[i]+=48;//转化回字符此处也可以不转化,后续的判断用对应的ASCII码值来判断
ans1[cnt1++]=ans[i];//顺序存入ans1数组
}
for(int i=0;i
题目描述
阿丢呢离家进,最近胃口不好,吃不下去食堂的饭了,所以决定回家改善伙食。但是呢,阿丢自己做饭很慢很慢的,而很多时候呢下午要上课,没时间回去做饭吃。所以最后决定每3天(就是每隔两天)回去一次,注意每一年的第一天阿丢是要回家的。
比如2012年1月1日阿丢要回家,输出1。2012年1月4日(隔了2天)阿丢又可以回家了,输出2。依次类推。
输入
现在要你输入一个year,一个month,一个day。
输出
输出从你给的这一年的1月1号到你输入的时间点阿丢能回去了几次。输出格式照旧!测试数据多组
样例输入 复制
2012 1 1
2012 3 1
2013 3 1
样例输出 复制
Case #1:
1
Case #2:
21
Case #3:
20
提示
要注意判断闰年哦
写过黑色星期五的我,只觉得是水题一道
#include //阿丢要回家
#include
#include
#include
int Year(int m);//判断是否为闰年函数
int main()
{
int sum[12]={0,31,59,90,120,151,181,212,243,273,304,334};//计算出对应月份的总和(平年)
int year,month,day,temp,cnt1=1;
while(~scanf("%d%d%d",&year,&month,&day))//输入年月日
{
int cnt=0;
if(Year(year)==1){
temp=sum[month-1]+day+1;//如果为闰年就加一天
}
if(Year(year)==0){
temp=sum[month-1]+day;//不是闰年
}
for(int i=1;i<=temp;i+=3)
{
cnt++;//输出样例的计数
}
printf("Case #%d:\n",cnt1);cnt1++;
printf("%d\n",cnt);
}
}
int Year(int m)//判断是否为闰年
{
if((m%4==0&&m%100!=0)||m%400==0)return 1;
else return 0;
}
阿操最讨厌写字符串的题目,看到眼前密密麻麻的字母就烦。这件事的起因就是很久很久以前的一次找重复字符的位置。 现在有一个字符串,我们要找出其中的重复的字符并输出这些字符和字符的位置,如:aabcaabc22 输出 a,0;a,1;a,4;a,5,b,2;b,6,c,3;c,7;2,8;2,9
输入
输入一行字符串(字符串中只含数字和字母)。其长度不超过100。包括多组输入。
输出
根据样例的格式将重复出现的字符位置输出
样例输入 复制
aabcaabc22
样例输出 复制
a:0,a:1,a:4,a:5
b:2,b:6
c:3,c:7
2:8,2:9
一定要想好输出格式(难点)
#include
#include
#include
#include
//jack的字符串
int main()
{
int rand[505]={0},cnt=0,k,t[1000]={0};
char ch[1005];
while(scanf("%s",ch))
{
memset(t,0,sizeof(t));
int len=strlen(ch);
for(int i=0;i1)//字符数量为1个以上的时候(重复出现)
{
cnt=0;//注意此处不要忘记将记录下标的数组归零至零开始
for(int j=i;j
串的处理
题目描述
在实际的开发工作中,对字符串的处理是最常见的编程任务。本题目即是要求程序对用户输入的串进行处理。具体规则如下:
1. 把每个单词的首字母变为大写。
2. 把数字与字母之间用下划线字符(_)分开,使得更清晰
3. 把单词中间有多个空格的调整为1个空格。
我们假设:用户输入的串中只有小写字母,空格和数字,不含其它的字母或符号。每个单词间由1个或多个空格分隔。
假设用户输入的串长度不超过200个字符。
输入
例如:
用户输入:
you and me what cpp2005program
用户输入:
this is a 99cat
输出
则程序输出:
You And Me What Cpp_2005_program
则程序输出:
This Is A 99_cat
样例输入 复制
you and me what cpp2005program
this is a 99cat
样例输出 复制
You And Me What Cpp_2005_program
This Is A 99_cat
#include //串的处理
#include
#include
#include
int main()
{
char ch[201];
int a_[201]={0},kg[201]={0};
while(gets(ch)!=NULL)
{
int len=strlen(ch);
memset(a_,0,sizeof(a_));
memset(kg,0,sizeof(kg));
if(ch[0]>='a'&&ch[0]<='z')//第一个字母为小写的时候
{
ch[0]-=32;//转化为大写
}
for(int i=1;i='a'&&ch[i-1]==' ')//新单词的时候
{
ch[i]-=32;//转化为大写
}
if(ch[i]==' '&&ch[i-1]==' ')//空格重复出现的时候
{
kg[i]=1;//记录空格
}
if(ch[i]<='z'&&ch[i]>='a'&&ch[i-1]<='9'&&ch[i-1]>='0')//前为数字和后为字母相邻出现时
{
a_[i]=1;//记录需要输出_的位置
}
if(ch[i]<='9'&&ch[i]>='0'&&((ch[i-1]<='z'&&ch[i-1]>='a')||(ch[i-1]<='Z'&&ch[i-1]>='A')))//后为数字和前为字母相邻出现时
{
a_[i]=1;//记录需要输出_的位置
}
}
for(int i=0;i