15分档每一套里还是2道。但是还是不会很难,多少会涉及一点点算法(应该是这样的不然设置成15分就完全没有理由嘛)
然后每道题多少会写一点点题解并且还原一下当时的心路历程。
每一套里的两道15分难度我觉得差距不是很大,类型也不是很好分,在这里干脆就直接按顺序写了(还要向10分题那样分类确实多多少少有点浪费时间了 还是节省点时间做点更有意义的事情。。。。)
L1-003. 个位数统计
给定一个k位整数N = dk-1*10k-1 + ... + d1*101 + d0 (0<=di<=9, i=0,...,k-1, dk-1>0),请编写程序统计每种不同的个位数字出现的次数。例如:给定N = 100311,则有2个0,3个1,和1个3。
输入格式:
每个输入包含1个测试用例,即一个不超过1000位的正整数N。
输出格式:
对N中每一种不同的个位数字,以D:M的格式在一行中输出该位数字D及其在N中出现的次数M。要求按D的升序输出。
输入样例:100311
输出样例:
0:2 1:3 3:1
在输出的时候也要判断一下是否为0,不为0就输出,为0不做操作(既然要判断是否为0那么就要初始化)。
#include<bits/stdc++.h>
#define ms(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
int main(){
char a[1004];
int b[10];
scanf("%s",a);
ms(b,0);
for(int i=0;i<strlen(a);i++){
b[a[i]-48]++;
}
for(int i=0;i<10;i++){
if(b[i]!=0){
printf("%d:%d\n",i,b[i]);
}
}
return 0;
}
L1-005. 考试座位号
每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座位就座。但有些考生迟到了,试机已经结束,他们只能拿着领到的试机座位号码求助于你,从后台查出他们的考试座位号码。
输入格式:
输入第一行给出一个正整数N(<=1000),随后N行,每行给出一个考生的信息:“准考证号 试机座位号 考试座位号”。其中准考证号由14位数字组成,座位从1到N编号。输入保证每个人的准考证号都不同,并且任何时候都不会把两个人分配到同一个座位上。
考生信息之后,给出一个正整数M(<=N),随后一行中给出M个待查询的试机座位号码,以空格分隔。
输出格式:
对应每个需要查询的试机座位号码,在一行中输出对应考生的准考证号和考试座位号码,中间用1个空格分隔。
输入样例:4
10120150912233 2 4
10120150912119 4 1
10120150912126 1 3
10120150912002 3 2
2
3 4
输出样例:
10120150912002 2
10120150912119 1
N范围1000,M范围<n,时间复杂度O(n*m)<10^6,可以暴力,直接输入到结构体内,再按试机号遍历相同就输出考号和考试座位号。So easy。
#include<bits/stdc++.h>
#define ms(a,x) memset(a,x,sizeof(a))
using namespace std;
struct pp{
ll num;
int num1;
int num2;
}stu[1005];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>stu[i].num>>stu[i].num1>>stu[i].num2;
}
int k;
int q;
cin>>k;
while(k--){
cin>>q;
for(int i=0;i<n;i++){
if(q==stu[i].num1){
cout<<stu[i].num<<" "<<stu[i].num2<<endl;
break;
}
}
}
return 0;
}
L1-015. 跟奥巴马一起画方块
美国总统奥巴马不仅呼吁所有人都学习编程,甚至以身作则编写代码,成为美国历史上首位编写计算机代码的总统。2014年底,为庆祝“计算机科学教育周”正式启动,奥巴马编写了很简单的计算机代码:在屏幕上画一个正方形。现在你也跟他一起画吧!
输入格式:
输入在一行中给出正方形边长N(3<=N<=21)和组成正方形边的某种字符C,间隔一个空格。
输出格式:
输出由给定字符C画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的50%(四舍五入取整)。
输入样例:10 a
输出样例:
aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa aaaaaaaaaa
#include<bits/stdc++.h>
#define ms(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
int main(){
int n;
char c;
cin>>n>>c;
int m;
if(n%2==0)m=n/2;
else m=n/2+1;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cout<<c;
}
cout<<endl;
}
return 0;
}
L1-016. 查验身份证
一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:
首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:
Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2
现在给定一些身份证号码,请你验证校验码的有效性,并输出有问题的号码。
输入格式:
输入第一行给出正整数N(<= 100)是输入的身份证号码的个数。随后N行,每行给出1个18位身份证号码。
输出格式:
按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理,只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常,则输出“All passed”。
输入样例1:4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
输出样例1:
12010X198901011234
110108196711301866
37070419881216001X
输入样例2:
2
320124198808240056
110108196711301862
输出样例2:
All passed
这种题目长长长的其实就是唬人的,看起来长实际上是一个模拟题,只需要仔细
#include<bits/stdc++.h>
#define ms(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
int gcd(int a,int b){
if(b==0)return a;
return gcd(b,a%b);}
int lcm(int a,int b){
return a/gcd(a,b)*b;}
int main(){
char a[105][20];
int c[17];
int n;
double b[17]={7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char m[11]={'1','0','X','9','8','7','6','5','4','3','2'};
int flag[105];
bool flag1=true;
cin>>n;
ms(flag,0);
for(int i=0;i<n;i++){
cin>>a[i];
}
double zz=0.0;
for(int i=0;i<n;i++){
double zz=0.0;
for(int j=0;j<17;j++){
if(a[i][j]>='0'&&a[i][j]<='9'){
zz+=(int)(a[i][j]-'0')*b[j];
}
else flag[i]=1;
}
//cout<<(int)zz%11<<' '<<m[(int)zz%11]<<endl;
if(m[(int)zz%11]!=a[i][17])flag[i]=1;
}
for(int i=0;i<n;i++){
if(flag[i]){
flag1=false;cout<<a[i]<<endl;
}
}
if(flag1)cout<<"All passed"<<endl;
return 0;
}
L1-017. 到底有多二
一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字“-13142223336”是个11位数,其中有3个2,并且是负数,也是偶数,则它的犯二程度计算为:3/11*1.5*2*100%,约为81.82%。本题就请你计算一个给定整数到底有多二。
输入格式:
输入第一行给出一个不超过50位的整数N。
输出格式:
在一行中输出N犯二的程度,保留小数点后两位。
输入样例:-13142223336
输出样例:
81.82%
模拟。两个标志量,一个记录判断是否为负数,一个判断是否为偶数。最后按要求乘倍数。
对了,补充一句废话,需要注意是50位整数,一定是用数组了。
就这么简单的题感受一下当时有多弱智,现在我都还原不出来当时的心路历程
正确代码:
#include<bits/stdc++.h>
#define ms(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
int main(){
char a[55];
cin>>a;
int len=strlen(a);
double res=0;
for(int i=0;i<len;i++){
if(a[i]=='2')res++;
}
bool fs=false,ou=false;
double ans=0;
if((int)a[len-1]%2==0)ou=true;
if(a[0]=='-')fs=true;
if(fs){
if(ou){
ans=res/(len-1)*3.0;
}
else ans=res/(len-1)*1.5;
}
else {
if(ou){
ans=res/len*2.0;
}
else ans=res/len*1.0;
}
printf("%.2lf%%\n",ans*100);
return 0;
}
L1-019. 谁先倒
划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就输了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。
下面给出甲、乙两人的酒量(最多能喝多少杯不倒)和划拳记录,请你判断两个人谁先倒。
输入格式:
输入第一行先后给出甲、乙两人的酒量(不超过100的非负整数),以空格分隔。下一行给出一个正整数N(<=100),随后N行,每行给出一轮划拳的记录,格式为:
甲喊 甲划 乙喊 乙划
其中“喊”是喊出的数字,“划”是划出的数字,均为不超过100的正整数(两只手一起划)。
输出格式:
在第一行中输出先倒下的那个人:A代表甲,B代表乙。第二行中输出没倒的那个人喝了多少杯。题目保证有一个人倒下。注意程序处理到有人倒下就终止,后面的数据不必处理。
输入样例:1 1
6
8 10 9 12
5 10 5 10
3 8 5 12
12 18 1 13
4 16 12 15
15 1 1 16
输出样例:
A
1
谁喊的谁划的要分清。需要注意的是:注意程序处理到有人倒下就终止。还是一道模拟。
#include<bits/stdc++.h>
#define ms(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
int gcd(int a,int b){
if(b==0)return a;
return gcd(b,a%b);}
int lcm(int a,int b){
return a/gcd(a,b)*b;}
int main(){
int a,b;
int a1,b1;
int n;
int t,ta[110],tb[110],qa[110],qb[110];
int flag=1;
cin>>a>>b;
a1=a;b1=b;
cin>>n;
for(int i=0;i<n;i++){
cin>>ta[i]>>qa[i]>>tb[i]>>qb[i];
}
int i;
for(i=0;i<n;i++){
t=ta[i]+tb[i];
if(t==qa[i]&&t!=qb[i]){
a--;
}
else if(t==qb[i]&&t!=qa[i]){
b--;
}
if(a==-1){
cout<<'A'<<endl;
cout<< b1-b<<endl;
break;
}
if(b==-1){
cout<<'B'<<endl;
cout<< a1-a<<endl;
break;
}
}
return 0;
}
前半部分结束,在考虑要不要一道题一个题解的文章,还是像这样6篇做一个总结。
一道题一篇确实超级酷啊,以后再看也会超级有成就感吧。。。等会试试?。