T1 (史上最shui的第一题)
数据:五个字符(大小写字母,数字,空格以及换行符)
本蒟蒻考试时,用的是getchar(),一个一个读;判断如果是大小写字母,数字就ans++,否则如果不是空格就跳出
附上代码:
#include<cstdio>
#include<cstring>
using namespace std;
int ans;
int main()
{
for(int i=0;i<5;i++)
{
char p=getchar();
if((p<='z' && p>='a')||(p<='9'&&p>='0')||(p<='Z'&&p>='A'))
ans++;
else
{
if(p!=' ')
break;
}
}
printf("%d",ans);
return 0;
}
或用getline(cin, );
介绍一下<cctype>
这个头文件下有许多函数,可以直接调用
isalnum:判断字符是否为字母数字
isalpha:判断字符是否为字母
isdigit:判断字符是否为十进制数
islower:判断字符是否为小写字母
isupper:判断字符是否为大写字母
ispunct:判断字符是否为标点
tolower:将大写字母转成小写
toupper:将小写字母转成大写
……
#include<cstring>
#include<cctype>
#include<iostream>
using namespace std;
int ans;
int main()
{
string a;
getline(cin,a);
for(int i=0;i<a.length();i++)
if(isalnum(a[i]))
ans++;
printf("%d",ans);
return 0;
}
T2
数据:要开long long;
直接算出左右两边的气势差,枚举气势小的一边,维护左右两边气势差最小就行了。
一开始要让p2=m,因为可能会有加上s2*abs(i-m),左右两边的气势差更大的情况(考试时忘记了,于是就呵呵了)。
代码:
#include<cstdio>
#include<cmath>
using namespace std;
long long n,m,s1,p1,s2,a[100001];
int main()
{
scanf("%lld",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
scanf("%lld%lld%lld%lld",&m,&p1,&s1,&s2);
a[p1]+=s1;
long long lj=0,rj=0;
for(int i=1;i<m;i++)
lj+=a[i]*(m-i);
for(int i=m+1;i<=n;i++)
rj+=a[i]*(i-m);
long long o=abs(lj-rj);
long long p2=m;
if(lj<rj)
for(int i=1;i<m;i++)
{
long long temp=s2*(m-i)+lj;
if(abs(temp-rj)<o)
{
p2=i;
o=abs(temp-rj);
}
}
else
if(lj>rj)
for(int i=m+1;i<=n;i++)
{
long long temp=s2*(i-m)+rj;
if(abs(temp-lj)<o)
{
p2=i;
o=abs(temp-lj);
}
}
printf("%lld\n",p2);
return 0;
}