- 王晨逸 的博客
Day03
- @ 2024-7-17 16:00:41
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(要取绝对值的整数)。