1.问题描述:最近很火的微信游戏跳一跳游戏规则如下:短跳得1分,跌落游戏结束,长跳得2分,并且长跳可连续累加,第一次2分,第二次4分,依次类推,若长中断则重新计分2分。
现给定0,1,2的组合序列,其中0:跌落 1:短跳成功 2:长跳成功
请你计算玩家当次游戏的合计得分。
输入格式:首先输入一个数字n代表当前游戏状态变化数,接着输入n个由0,1,2组合的数字,0代表结束。
输出格式:输出玩家当次游戏得分。
输入案例:
6
1 2 2 1 2 0
输出结果:10
#include
using namespace std;
int main()
{
int n, time, score = 0, con = 0, last;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> time;
if (time == 0)
{
cout << score;
break;
}
if (time == 1)
{
last = 0;
score += 1;
}
if (time == 2)
{
score += 2 * (last+1);
last++;
}
}
return 0;
}
2.最长连续公共子序列LCS
问题描述:输入两个字符串s1,s2,设s1长度为a,s2长度为b,s1与s2的最长公共子串长度为c,定义公共因子
d=c/(a+b),要求求得d并输出,结果保留两位小数
输入格式:输入两个字符串s1,s2,长度不大于100,以空格隔开
输出格式:输出公共因子d,结果保留两位小数
输入案例:
abcde abgde
输出案例:
0.20
#include
#include
using namespace std;
int main()
{
int arr[101][101];
char str1[101], str2[101];
gets(str1);
gets(str2);
int a = strlen(str1);
int b = strlen(str2);
int max = 0;
for (int i = 0; i <= a; i++)
arr[i][0] = 0;
for (int j = 0; j <= b; j++)
arr[0][j] = 0;
for(int i = 0; i < a; i++)
{
for (int j = 0; j < b; j++)
{
if (str1[i] == str2[j])
{
arr[i][j] = arr[i - 1][j - 1] + 1;
if (arr[i][j] > max)
max = arr[i][j];
}
else
arr[i][j] = 0;
}
}
int c = max;
float ans = (float)c / (a + b);
cout << c << endl;
cout << setprecision(2) << ans << endl;
return 0;
}
> 此题复习
3.描述:已知根据矩形的左下角右上角左边可以唯一确定一个矩形位置,给出多个矩形坐标对其面积单元进行涂色
其中重叠面积只涂一次,求涂色面积单元个数。
输入格式:首先输入涂色矩形个数n(n<100),接着分别输入每个矩形的左下角与右上角左边(0<=x<=100
0<=y<=100),按行分隔
输出格式:输出涂色面积单元个数
输入样例:
2
1 1 4 5
2 3 5 6
输出样例:
17
#define MAX 101
#include
using namespace std;
typedef struct Point {
int x, y;
}Point;
typedef struct Rect {
Point p1, p2;
}Rect;
int A[MAX][MAX];
Rect R[MAX];
int main() {
int n;
while (cin >> n)
{
for (int i = 0; i < MAX; i++)
for (int j = 0; j < MAX; j++)
A[i][j] = 0;
for (int i = 0; i < n; i++)
cin >> R[i].p1.x >> R[i].p1.y >> R[i].p2.x >> R[i].p2.y;
for (int i = 0; i < n; i++)
for (int j = R[i].p1.x + 1; j <= R[i].p2.x; j++)
for (int k = R[i].p1.y + 1; k <= R[i].p2.y; k++)
{
if (A[j][k] == 0)
A[j][k] = 1;
}
int ans = 0;
for (int i = 0; i < MAX; i++)
for (int j = 0; j < MAX; j++)
{
if (A[i][j])
ans++;
}
cout << ans << endl;
}
return 0;
}
> 此题复习
4.描述: 给定一组记录n(n<100)小明各个时期的考试成绩 ,格式为日期+成绩,中间以空格隔开,记录之间
分行输入 ,例如
2008/6/3 80
2009/1/1 56
….
其中日期输入要求年份1996-2100 月份1-12 日期1-31
现要求以分数为关键字从大到小对其进行排序,若分数相同则按日期从小到大排序
输入样例
4
2017/1/1 95
2017/6/10 85
2017/3/2 95
2017/1/1 65
输出样例
2017/1/1 95
2017/3/2 95
2017/6/10 85
2017/1/1 65
#define MAX 100
#define IsLeap(x) x%4==0&&x%100!=0||x%400==0
#include
#include
#include
using namespace std;
int Day[13]={
0,31,28,31,30,31,30,31,31,30,31,30,31
} ;
typedef struct{
char date[100];
int grade;
}Record;
bool cmp(Record x,Record y)
{
if(x.grade!=y.grade)
return x.grade>y.grade;
return x.date<y.date;
}
bool isValid(char* str)
{
int y,m,d;
int dd;
bool vaild=true;
sscanf(str,"%d/%d/%d",&y,&m,&d);
//sscanf的作用:从一个字符串中读进于指定格式相符的数据。利用它可以从字符串中取出整数、浮点数和字符串
//sscanf和scanf的区别:scanf是以键盘作为输入源,sscanf是以字符串作为输入源。
if(y<1996||y>2100)
vaild=false;
if(m<1||m>12)
vaild=false;
if(IsLeap(y)&&m==2)
dd=Day[m]+1;
else
dd=Day[m];
if(d<1||d>Day[m])
vaild=false;
return vaild;
}
int main(){
Record res[MAX];
bool flag[MAX];
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
flag[i]=true;
for(int i=0;i<n;i++)
cin>>res[i].date>>res[i].grade;
sort(res,res+n,cmp);
for(int i=0;i<n;i++)
if(isValid(res[i].date))
cout<<res[i].date<<" "<<res[i].grade<<endl;
}
return 0;
}
> 此题复习