Description
一般大学采用之计分法
A90 - 100 4 点
B80 - 89 3 点
C70 - 79 2 点
D60 - 69 1 点
E0 - 59 0 点
例如:某位学生修习三门课,其课目、学分及成绩分别为:
英文:三学分、92 分;化学:五学分、80 分;数学:二学分、60分,则GPA的算法如下:
科目 学分 分数 点数 分数×点数
英文 3 92 4 12
化学 5 80 3 15
数学 2 60 1 2
合计 10 29
29/10=2.9
2.9即为某生的GPA
下面有请你写一个用于计算GPA的程序。
Input
Output
Sample Input
3 3 92 5 80 2 60
Sample Output
2.90
#include<stdio.h>
int main()
{
int n;
while(~scanf("%d",&n))
{
int i;
double a[120],b[120];
for(i=0; i<n; i++)
{
scanf("%lf%lf",&a[i],&b[i]);
if(b[i]>=90)
b[i]=4;
else if(b[i]>=80)
b[i]=3;
else if(b[i]>=70)
b[i]=2;
else if(b[i]>=60)
b[i]=1;
else if(b[i]>=0&&b[i]<60)
b[i]=0;
}
int cnt=0;
double s=0,k=0;
for(i=0; i<n; i++)
{
if(b[i]==-1)
{
cnt++;
continue;
}
s+=a[i]*b[i];
k+=a[i];
}
if(cnt==n||k==0)//此处为坑点
printf("-1\n");
else
printf("%.2lf\n",s/k);
}
return 0;
}
ps:此题我个人理解错误导致wrong了13次,我以为K==0时,就是当全部科目的学分都为0时GPA是存在的并且此时最终的答案是0.00。。但是我想错了,k==0就是分母为0,所以GPA不存在。。
Description
小Hi最近在玩一个字符消除游戏。给定一个只包含大写字母"ABC"的字符串s,消除过程是如下进行的:
1)如果s包含长度超过1的由相同字母组成的子串,那么这些子串会被同时消除,余下的子串拼成新的字符串。例如"ABCCBCCCAA"中"CC","CCC"和"AA"会被同时消除,余下"AB"和"B"拼成新的字符串"ABB"。
2)上述消除会反复一轮一轮进行,直到新的字符串不包含相邻的相同字符为止。例如”ABCCBCCCAA”经过一轮消除得到"ABB",再经过一轮消除得到"A"
游戏中的每一关小Hi都会面对一个字符串s。在消除开始前小Hi有机会在s中任意位置(第一个字符之前、最后一个字符之后以及相邻两个字符之间)插入任意一个字符('A','B'或者'C'),得到字符串t。t经过一系列消除后,小Hi的得分是消除掉的字符的总数。
请帮助小Hi计算要如何插入字符,才能获得最高得分。
Input
输入第一行是一个整数T(1<=T<=100),代表测试数据的数量。
之后T行每行一个由'A''B''C'组成的字符串s,长度不超过100。
Output
对于每一行输入的字符串,输出小Hi最高能得到的分数。
Sample Input
3 ABCBCCCAA AAA ABC
Sample Output
9 4 2
Hint
第一组数据:在"ABCBCCCAA"的第2个字符后插入'C'得到"ABCCBCCCAA",消除后得到"A",总共消除9个字符(包括插入的'C')。
第二组数据:"AAA"插入'A'得到"AAAA",消除后得到"",总共消除4个字符。
第三组数据:无论是插入字符后得到"AABC","ABBC"还是"ABCC"都最多消除2个字符。
Description
fjxmlhx不喜欢网上的 marshtomps 。所以他决定把所有的 “marshtomp”(名字不区分大小写) 改为 “fjxmlhx;
Input
输入包含多行,每行字符串不超过200的长度,一个单词不会一半出现在上一行,剩下的在下一行。直到文件结束(EOF)
Output
输出 替换之后的字符串。
Sample Input
The Marshtomp has seen it all before. marshTomp is beaten by fjxmlhx! AmarshtompB
Sample Output
The fjxmlhx has seen it all before. fjxmlhx is beaten by fjxmlhx! AfjxmlhxB
#include<stdio.h>
#include<ctype.h>
#include<string.h>
char a[1010],b[10],c[1010],e[1010];
int main()
{
char d[]= {"fjxmlhx"};
while(gets(c))
{
memset(e,'\0',sizeof(e));
int i,lc,j;
lc=strlen(c);
for(i=0; i<lc; i++)
a[i]=tolower(c[i]);//把字符全部转化成小写
int k=0;
for(i=0; i<lc; i++)
{
if(i+9<=lc)
{
int ans=0;
memset(b,'\0',sizeof(b));
for(j=i; j<i+9; j++)//找到连续的长度为9的字符串
b[ans++]=a[j];//注意ans要从0开始即要让b的下标从0开始,不然的话会出错的
ans=0;
if(!strcmp(b,"marshtomp"))//判断此字符串是否等于marshtomp
{
for(j=i; j<i+7; j++,ans++)
e[k++]=d[ans];
i+=9;
}
}
e[k++]=c[i];
}
puts(e);//坑点就是最后一次输出并没有换行,所以用了puts
}
return 0;
}
ps:此题倒是没有什么难的,但是由于以前很少写字符串的题,所以比赛时做这道题也是费了点时间。。
Description
小Ho很喜欢在课间去小卖部买零食。然而不幸的是,这个学期他又有在一教的课,而一教的小卖部姐姐以冷若冰霜著称。第一次去一教小卖部买零食的时候,小Ho由于不懂事买了好一大堆东西,被小卖部姐姐给了一个“冷若冰霜”的眼神,食欲都下降了很多。
从那以后,小Ho就学乖了,去小卖部买东西只敢同时买3包以内的零食,并且价格加起来必须是5的整数倍,方便小卖部姐姐算价格。
但是小Ho不擅长计算,所以他把小卖部里所有零食的价格以及他对这个零食的渴望度都告诉了你,希望你能够帮他计算出在不惹恼小卖部姐姐的前提下,能够买到零食的渴望度之和最高是多少?
Input
每个输入文件包含多组测试数据,在每个输入文件的第一行为一个整数Q,表示测试数据的组数。
每组测试数据的第一行为一个正整数N,表示小卖部中零食的数量。
接下来的N行,每行为一个正实数A和一个正整数B,表示这种零食的价格和小Ho对其的渴望度。
一种零食仅有一包。
对于100%的数据,满足1 <= Q <= 10,1<=N<=50,0<A<=10,1<=B<=100。
对于100%的数据,满足A的小数部分仅可能为0.5或0。
Output
对于每组测试数据,输出一个整数Ans,表示小Ho可以获得最大的渴望度之和。
Sample Input
1 4 0.5 6 4.5 7 5.0 4 2.0 9
Sample Output
17
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
struct zxc
{
double x;
int y;
} a[1010];
bool cmp(struct zxc a,struct zxc b)
{
return a.y>b.y;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,i;
scanf("%d",&n);
for(i=0; i<n; i++)
{
scanf("%lf%d",&a[i].x,&a[i].y);
}
sort(a,a+n,cmp);
int j,k,s,maxn=0;
for(i=0; i<n; i++)
{
for(j=i+1; j<n; j++)
{
for(k=j+1; k<n; k++)
{
s=0;
if((int)(a[i].x+a[j].x+a[k].x)==(a[i].x+a[j].x+a[k].x))//先判断是否是整数
{
if(!((int)(a[i].x+a[j].x+a[k].x)%5))//判断是否满足条件是5的倍数
{
s=a[i].y+a[j].y+a[k].y;
}
}
if(s>maxn)
{
maxn=s;
}
}
s=0;
if((int)(a[i].x+a[j].x)==a[i].x+a[j].x)//同上
{
if(!((int)(a[i].x+a[j].x)%5))//同上
s=a[i].y+a[j].y;
if(s>maxn)
maxn=s;
}
}
s=0;
if(a[i].x==(int)a[i].x)//同上
{
if(!((int)(a[i].x)%5))//同上
s=a[i].y;
if(s>maxn)
maxn=s;
}
}
printf("%d\n",maxn);
}
return 0;
}
ps:这是一道贪心题,不过我用的是最笨的方法,原谅我由于时间紧迫,还是这个代码,比较容易懂,以后复习时会优化这个代码的。。
Description
我们假设海岸是无限延伸的直线,陆地在海岸的一边,大海在另一边。每个小岛是一个点位于大海那一片区域。详见图片;
每一个雷达的安装位置只能够在海岸线上,只能够覆盖半径为 d 的圆形区域。所以,如果小岛与雷达距离小于等于d才能够覆盖。
我们可以用笛卡尔积坐标系,定义海岸线是 x轴,大海在x 上方,陆地在x 轴下方,给你每个小岛在大海中的位置,并且给出雷达的覆盖范围 d ,你的任务是写一个程序,找到最少需要安装的雷达数量且能够覆盖所有的小岛。一个位置表示 (x,y )坐标。
Figure A Sample Input of Radar Installations
Input
Output
对于每组数据输出一个答案,每个答案占一行,输出最小需要的雷达数量,如果不能够满足要求,则输出 -1;
输出格式为:详见样例输出格式。
Sample Input
3 2 1 2 -3 1 2 1 1 2 0 2 0 0
Sample Output
Case 1: 2 Case 2: 1
Description
青蛙举行了运动会,要求青蛙跳跃小河。河流宽度为 L (1<= L <= 1000000000). 河里会有 n 个石头沿着垂直于河岸的直线排成一排,青蛙以跳到石头上,然后再次跳跃。青蛙最多能够跳 m 次;现在青蛙们想知道他们最少应该有多大的跳跃能力才能够到达河对岸?
Input
多组数据;
每行输入 L,n,m;
接下来输入n个数,代表第 i 个石头距离开始位置的距离,两个石头不可能出现在一起。
Output
输出一个数,代表至少需要的跳跃距离(最小的最大跳跃能力);
Sample Input
6 1 2 2 25 3 3 11 2 18
Sample Output
4 11