T1ISBN号码

代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
	freopen("isbn.in","r",stdin);
	freopen("isbn.out","w",stdout);
	int sum=1,ans=0,max=0;
	char ma;
	string s;
	getline(cin,s);
	int len=s.size();
	for(int i=0;i<len-1;i++){
		if(isdigit(s[i])){
			max=s[i]-'0';
			ans=ans+max*sum;
			sum++;
		}
	}
	ma=s[len-1];
	ans=ans%11;
	if(ans==10&&ma=='X'){
		cout<<"Right";
	}else if(ans!=10){
		ans=ans+'0';
		if(ans==ma){
			cout<<"Right";
		}else{
			for(int i=0;i<len-1;i++){
				cout<<s[i];
			}
			ans=ans-'0';
			cout<<ans;
		}
	}else if(ans==10&&ma!='X'){
		for(int i=0;i<len-1;i++){
			cout<<s[i];
		}
		cout<<"X";
	}
	return 0;
}

思路:定义一个string类型的字符串,用isdigit判断数字,是数字后减字符型的0,变成整数,在判断,如果不是整数,判断是不是“X”。

注意:字符型数字要-‘0’才能变成整数,整数要+‘0’才能变成字符型。

T2花生采摘

代码:

#include<bits/stdc++.h>
using namespace std;
struct pea{
	int h,zw,tim,lon;
};
bool cmp(pea a,pea b){
	return a.lon>b.lon;
}
pea p[450];
int a[25][25];
int n,m,z,max=0,min=0,sum=0,ans=0;
int main(){
	freopen("hs.in","r",stdin);
	freopen("hs.out","w",stdout);
	cin>>n>>m>>z; //n表示行,m表示列
	for(int i=0;i<n;i++){
		for(int j=0;j<m;j++){
			cin>>a[i][j];
			if(a[i][j]>0){
				p[sum].zw=j;
				p[sum].h=i;
				p[sum].tim=i+1;
				p[sum].lon=a[i][j];
				sum++;
			}
	    }
	}
	sort(p,p+sum,cmp);
	if(p[0].tim*2+2<=z){
		ans=ans+p[0].lon;
		z=z-p[0].tim-1;
		for(int i=1;i<sum;i++){
			int d=abs(p[i-1].h-p[i].h)+abs(p[i-1].zw-p[i].zw);
			if(d+p[i].tim+1<=z){
				ans=ans+p[i].lon;
				z=z-abs(p[i-1].h-p[i].h)-abs(p[i-1].zw-p[i].zw)-1;
			}else{
				break;
				}
		}
		cout<<ans;
	}else{
		cout<<0;
	}

	return 0;
}

思路:用struct函数整理数据,再用sort排序,cmp定义排序规则,ans可以取绝对值,用两地的长度加两地的宽度找出需要用的时间,把返回时间和摘取时间加上,在判断。

注意:比较时要取绝对值,要加上返回的时间和摘取时间,出马路和返回需要2个时间段。

T3纪念品分组

#include<bits/stdc++.h>
using namespace std;
int n,w,a[30001],sum;
bool cmp(int a,int b){
	return a>b;
}
int main(){
	freopen("group.in","r",stdin);
	freopen("group.out","w",stdout);
	cin>>w>>n;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	sort(a,a+n,cmp);
	int i=0,j=n-1;
	while(i<j){
		if(a[i]+a[j]<=w){
			sum++;
			i++;
			j--;
		}else{
			sum++;
			i++;
		}
	}
	if(i==j){
		sum++;
	}
	cout<<sum;
	return 0;
}

思路:用一维数组存储数据,sort排序,主函数外cmp定义从大到小,使用双指针在while循环里使用,最后判断剩余的数是不是单数,在输出结果。

注意:sort排序要使用自定义排序,从小到大排,判断时使用双指针来判断,最后还要判断是否为单数,如果是单数,方法加一。

每一道题都要写freopen。

freopen("文件名.in","r",stdin);
	freopen("文件名.out","w",stdout);

新学:变量开到1e6,数组开到main函数外int类型最多开到10的7次方。 双指针:定义一个i,j,i从起点往后,j从终点往前。 整数变字符要+‘0’, 字符变整数要-‘0’。 ans取绝对值: ans(要取绝对值的整数)。