PTA及杭电OJ2000-2099题笔记

注意点总结

一、分母是一个式子时很容易写成n/a-b,应该是n/(a-b)
二、初始化问题,while循环内部要记得初始化:vector数组 .clear();
在这里插入图片描述
三、注意忽略换行符
cin.ignore(); // 忽略换行符 典型题OJ2017
在这里插入图片描述
四、数组作为参数放入函数中
void count(string s,vector nums) 这种参数不加&不会对main主函数中的nums进行修改
在这里插入图片描述

知识点总结

OJ网站不支持万能头文件

字符串常用方法

涉及题目OJ2054
s.find()//找到返回第一次出现位置,找不到返回-1
s.substr(起始下标,(子串长度)) 返回子串

字符串读取方法

在这里插入图片描述

头文件万能

#include <bits/stdc++.h>
数学类的# include <math.h>

输出格式问题

头一个不加空格后面都加空格

bool first=true;
for(int i=n-m;i<n;i++){
if(first){
first=false;
cout<<nums[i];
}else {
cout<<" "<<nums[i];
}

x和y都为0时结束输出

while(cin>>x>>y,x||y) //x和y都等于0时结束即为false

PAT

1005题将vector数组从大到小排序和从小到大排序

sort(name.rbegin(),name.rend());
sort(name.begin(),name.end());

1008题 数组右移动

注意 n,m其中m可能大于n,所以m=m%n;

1012题精确到小数点后多少位如何实现?

对于C语言来说,精确到小数点后几位可以用以下代码实现:
printf(“%.nf”,number);

OJ2000题

一、对于处理输入数据有多组,每组占一行,有三个字符组成,之间无空格。这类问题通常采用
while(scanf()!=EOF)
while (cin>>nums)//注意这里nums可以为数组
二、sort函数只能对vector数组进行排序
且如果需要对char数组排序,需要重新定义compare函数
bool compare(char a, char b) {
return a < b; }// 按字符的大小排序
三、如果初始化vector 数组为vector v(3)那么数组中前三个位置为0
v.push_back是在这后面添

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

// 比较函数
bool compare(char a, char b) {
return a < b; // 按字符的大小排序
}

int main(int argc, char** argv) {
	vector <char> v(3);//定义数组是为了sort函数,它只能给数组排序 
	char nums[3];
	while(cin>>nums){
		for(int i=0;i<3;i++){
		v[i]=nums[i];
	}
	sort(v.begin(),v.end(),compare);
	cout<<v[0]<<" "<<v[1]<<" "<<v[2]; 
	}
	return 0;
}

OJ2001题

sqrt开平方

#include <iostream>
#include <algorithm>
#include<cmath>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
	double x1,y1,x2,y2;
	double res;
	while (cin>>x1>>y1>>x2>>y2) {
		res=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
		printf("%.2f",res);
		cout<<endl;
	}
	return 0;
}

OJ 2002 球体积

注意点:4/3相除会得到整数结果,如果要得到浮点数结果需要写成4.0/3.0

OJ2005 这是第几天

设计到闰年平年所以不深入了解
在这里插入图片描述

OJ2007 平方和和立方和

陷阱题你不知道n,m哪个大

#include <iostream>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main(int argc, char** argv) {
	int n,m;
	int res1,res2;
	int temp;
	while(cin>>n>>m){
		if(n>m){//陷阱 
			temp=n;
			n=m;
			m=temp;
		}
		res1=0,res2=0;
		for(int i=n;i<=m;i++){
			if(i%2==0) {
				res1+=i*i;
			}
			else res2+=i*i*i;
		}
		cout<<res1<<" "<<res2<<endl;
	}
	
	return 0;
}

OJ2017 判断读取字符串中字符是否为数字

判断是否为数字方法:
bool isdigital(char c){
//判断是否为数字
return (c>=‘0’&&c<=‘9’) ;
}
字符串的读取方法:getline(cin,s),用cin>>s不行因为可能会有空格
遍历字符串中字符方法:
for(int i=0;i<s.length();i++)

#include <iostream>
#include <string>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */

bool isdigital(char c){
	//判断是否为数字
	return (c>='0'&&c<='9') ;
}
int main(int argc, char** argv) {
	int n;
	cin>>n;
	cin.ignore();
	int nums;
	for(int i=0;i<n;i++){
		nums=0;
		string s;
		getline(cin,s);//输入n串字符串
		 for(int i=0;i<s.length();i++){
		 	char c=s[i];
		 	if(isdigital(c)){
		 		//是数字
				 nums++; 
			 }
		 }
		 cout<<nums<<endl;
	}

	return 0;
}

OJ 2023 二维vector 数组

vector 二维数组创建 vector<vector> v(n,vector(m));
二维数组作为函数参数 double count1(vector< vector > &v,int n)
二维数组的行数和列数
int r=v.size();//行数
int l=v[0].size();//列数

#include <iostream>
#include <vector>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//对于每个测试实例,输出3行数据,第一行包含n个数据,表示n个学生的平均成绩,结果保留两位小数;第二行包含m个数据,表示m门课的平均成绩,结果保留两位小数;

//计算学生平均成绩
double count1(vector< vector<double> > &v,int n){//n表示计算第几行学生成绩 注意从0开始 
	int r=v.size();//行数
	int l=v[0].size();//列数
	double sum=0;
	for (int i=0;i<l;i++){
		sum+=v[n][i];
	}
	return sum/l;
} 
//计算m门课的平均成绩 
double count2(vector< vector<double> > &v,int x){//x代表计算第几门课 ,注意从0开始 
	int r=v.size();//行数
	int l=v[0].size();//列数
	double sum=0;
	for (int i=0;i<r;i++){
		sum+=v[i][x];
	}
	return sum/r;
}
//判断是否各科成绩均大于等于平均成绩
 
int main(int argc, char** argv) {
	int n,m;//n代表学生数,m表示科目数
	int nums;//高于平均分的人数 
	while(cin>>n>>m){
	nums=0;
	vector< vector<double> > v(n,vector<double>(m));
	vector <double> r; 
	vector <double> k;
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			double a;cin>>a;
			v[i][j]=a;
		}
		cin.ignore();
	}
	//输出n个学生成绩平均
	for(int i=0;i<n;i++){
		r.push_back(count1(v,i));
		printf("%.2f",count1(v,i));
		cout<<" ";
	} 
	cout<<endl;
	//输出m门科目成绩平均
	for(int j=0;j<m;j++){
		k.push_back(count2(v,j));
		printf("%.2f",count2(v,j));
		cout<<" ";
	}
	cout<<endl;
	//表示该班级中各科成绩均大于等于平均成绩的学生数量。
	for(int i=0;i<n;i++){
		bool bigger=true;
		for(int j=0;j<m;j++){
			if(v[i][j]<k[j]){
				bigger=false;
				break;
			}
		}
		if(bigger) nums++;
	}
	cout<<nums; cout<<endl;
	v.clear();r.clear();k.clear(); 
	} 
	return 0;
}

OJ 2024 C语言的合法标识符

先判断是不是以下划线或字母开头,然后依次判断后面的字符是不是都为数字或字母。

OJ2027 数组参数

在这里插入图片描述

OJ2031 进制准换

vector v={‘0’,‘1’,‘2’,‘3’,‘4’,‘5’,‘6’,‘7’,‘8’,‘9’,‘A’,‘B’,‘C’,‘D’,‘E’,‘F’};
在这里插入图片描述

OJ2032 杨辉三角

在这里插入图片描述

OJ2036 多边形面积

在这里插入图片描述

OJ2053 开关灯小游戏

在这里插入图片描述

OJ2054 A==B?

在这里插入图片描述
问题核心:清除前导0和小数点后多余的0
以及若出现1.0000的情况把小数点也删除

string clear(string s){
	//清除前导0 
	int start=0; int l;
	int end=s.length()-1;
	int dot=s.find('.');//找到字符串中小数点位置 
	while(s[start]=='0') start++;//找到起始坐标
	if(dot==-1){
		//说明没有小数点
		l=end-start+1;
		return s.substr(start,l); 
	}
	while(s[end]=='0') end--;//找到终止坐标 
	if(dot==end){
		//说明小数点后都是0
		l=dot-start;
		return  s.substr(start,l);
	}else {
		l=end-start+1;
		return s.substr(start,l);
	}
}

OJ 2055 略

OJ 2056 感觉和数学几何涉及的多,不做了

OJ2057 还是进制转换问题略

OJ2058 暴力做做出来但是超时了

#include <iostream>
#include <vector>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
vector < pair<int,int> > count(int N,int M){
	pair<int,int> p;
	vector< pair<int,int> > v;
	for(int i=1;i<=N;i++){
		if(i==M) {
			p.first=p.second=M;
			v.push_back(p);
		}
		else{
			for(int j=i+1;j<=N;j++){
				if((j-i+1)*(i+j)/2==M){
					p.first=i; p.second=j;
					v.push_back(p);
				}
			}
		}
	}
	return v;
}
int main(int argc, char** argv) {
	int N,M;
	vector< pair<int,int> > v;
	while(cin>>N>>M &&(N||M)){
		v=count(N,M);
		for(int i=0;i<v.size();i++){
			cout<<"["<<v[i].first<<","<<v[i].second<<"]"<<endl;
		}
		v.clear();
	}
	return 0;
}

OJ2061 算GPA略

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
杭州电子科技大学在线评测系统(杭电OJ)中的目1000-1100是一系列编程,我将分别进行回答。 1000是一个简单的入门,要求计算两个整数的和。我们可以使用一个简单的算法,读取输入的两个整数,然后将它们相加,最后输出结果即可。 1001是一个稍微复杂一些的目,要求实现字符串的逆序输出。我们可以使用一个循环来逐个读取输入的字符,然后将这些字符存储在一个数组中。最后,我们可以倒序遍历数组并将字符依次输出,实现字符串的逆序输出。 1002是一个求最大公约数的问。我们可以使用辗转相除法来解决,即先求出两个数的余数,然后将被除数更新为除数,将除数更新为余数,直至两个数的余数为0。最后的被除数就是最大公约数。 1003是一个比较简单的排序问。我们可以使用冒泡排序算法来解决,即每次比较相邻的两个元素,如果它们的顺序错误就交换它们的位置。重复这个过程直至整个数组有序。 1100是一个动态规划问,要求计算给定序列中的最长上升子序列的长度。我们可以使用一个数组dp来保存到达每个位置的最长上升子序列的长度。每当遍历到一个位置时,我们可以将其和之前的位置比较,如果比之前位置的值大,则将其更新为之前位置的值加1,最后返回dp数组的最大值即可。 以上是对杭电OJ1000-1100目的简要回答,涉及了一些基本的编程知识和算法思想。希望对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值