目录
1031 查验身份证
读懂题意,存储容器那块写好就不难。
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
cin>>n;
vector<string> v;
int weight[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'};
while(n--)
{
string s;
cin>>s;
int Z=0;
for(int i=0;i<17;i++)
Z+=(s[i]-'0')*weight[i];
Z=Z%11;
if(M[Z]!=s[17])
v.push_back(s);
}
if(v.size()==0)
cout<<"All passed";
else
for(auto x:v)
cout<<x<<endl;
return 0;
}
1032 挖掘机技术哪家强
水题。
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int max_score=-1,max_numb=0;
int a[100005]={0};
while(n--)
{
int numb=0,score=0;
cin>>numb>>score;
a[numb]+=score;
if(a[numb]>max_score)
{
max_numb=numb;
max_score=a[numb];
}
}
cout<<max_numb<<" "<<max_score;
return 0;
}
1033 旧键盘打字
(1)类似1029的操作,输出两个串,定义一个空串用于输出,代码体现在对空串的编辑;
(2)find() isupper() toupper();
(3)不能对s1使用cin,若第一行空串(无坏键),那么cin不会接收,测试点2也会出错。
#include<iostream>
using namespace std;
int main()
{
string s1,s2,s3="";
//cin>>s1>>s2;
getline(cin,s1);
cin>>s2;
for(auto x:s2)
{
if(s1.find('+')!=string::npos&&isupper(x))//shift坏了
continue;
if(s1.find(toupper(x))==string::npos)
s3+=x;
}
cout<<s3;
}
1034 有理数四则运算
(1)基本思路为:写一个函数用于化简并输出有理数,然后然后把该函数参数设为操作数以及四则运算公式中的数按规范输出即可;
(2)注意18行判定是否是负数的时候不能用分子分母相乘的符号,因为两个longlong乘之后可能会超出范围。
#include<iostream>
#include<cmath>
using namespace std;
long long gcd(long long a,long long b)
{
return b==0 ? a : gcd(b,a%b);//辗转相除法求最大公约数
}
void Simplification(long long m,long long n)//化简分数并输出
{
if(n==0)//测试点1:分母为0输出Inf
{
cout<<"Inf";
return;
}
bool nagative=(m>0&&n<0)||(m<0&&n>0);//判定是否为负
if(nagative)
{
m=abs(m);
n=abs(n);
cout<<"(-";
}
//分子分母同除最大公约数化简
long long t=gcd(m,n);
m/=t;
n/=t;
//是整数
if(m%n==0)
cout<<m/n;
else
{
if(m>n)//整数加小数
cout<<m/n<<" ";
//小数部分
cout<<m%n<<"/"<<n;
}
if(nagative)
cout<<")";
}
int main()
{
long long a,b,c,d;
scanf("%lld/%lld %lld/%lld",&a,&b,&c,&d);
//加法
Simplification(a,b);
cout<<" + ";
Simplification(c,d);
cout<<" = ";
Simplification(a*d+c*b,b*d);
cout<<endl;
//减法
Simplification(a,b);
cout<<" - ";
Simplification(c,d);
cout<<" = ";
Simplification(a*d-c*b,b*d);
cout<<endl;
//乘法
Simplification(a,b);
cout<<" * ";
Simplification(c,d);
cout<<" = ";
Simplification(a*c,b*d);
cout<<endl;
//除法
Simplification(a,b);
cout<<" / ";
Simplification(c,d);
cout<<" = ";
Simplification(a*d,b*c);
cout<<endl;
}
1035 插入与归并
思路:对数组逐项排序,与目标对比,若相同则输出类型并对下一位排序再输出。
(这里的merge不是我们习以为常的归并排序算法)
#include<iostream>
#include<algorithm>
using namespace std;
void print(int *a,int n)
{
cout<<a[0];
for(int i=1;i<n;i++)
cout<<" "<<a[i];
}
int main()
{
int a1[101],a2[101],b[101];
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a1[i];
a2[i]=a1[i];
}
for(int i=0;i<n;i++)
cin>>b[i];
bool flag=false;
//insert
for(int i=2;i<=n;i++)//测试点2,i从2开始。
{
sort(a1,a1+i);
if(equal(a1,a1+n,b))
{
flag=true;
cout<<"Insertion Sort\n";
sort(a1,a1+i+1);
print(a1,n);
return 0;
}
}
//merge
for(int len=2;len<=n;len*=2)//len表示子序列的长度 ,每次迭代length翻倍
{
for(int pos=0;pos<n;pos+=len)//pos表示位置 ,相当于母序列分成长度为len的一共n/len份子序列,再一一排序
{
if(pos+len<=n) sort(a2+pos,a2+len+pos);
else sort(a2+pos,a2+n);
}
if(equal(a2,a2+n,b))
{
len*=2;//下一次归并排序,子序列长度翻倍
for(int pos=0;pos<n;pos+=len)
{
if(pos+len<=n) sort(a2+pos,a2+len+pos);
else sort(a2+pos,a2+n);
}
cout<<"Merge Sort\n";
print(a2,n);
return 0;
}
}
}
1036 跟奥巴马一起编程
水题。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
double n;
char c;
cin>>n>>c;
string s1="",s2="";
for(int i=0;i<n;i++)
s1+=c;
for(int i=0;i<n-2;i++)
s2+=" ";
s2=c+s2+c;
cout<<s1<<endl;
for(int i=0;i<round(n/2)-2;i++)
cout<<s2<<endl;
cout<<s1<<endl;
}
1037 在霍格沃茨找零钱
思路主要是把收支都兑换成最小单位,再转化为有进制单位输出。
#include<iostream>
using namespace std;
int main()
{
int a1,b1,c1,a2,b2,c2;
int Galleon,Sickle,Knut;
scanf("%d.%d.%d %d.%d.%d",&a1,&b1,&c1,&a2,&b2,&c2);
int sum=(a2*17*29+b2*29+c2)-(a1*17*29+b1*29+c1);
Galleon=sum/(17*29);
Sickle=(sum%(17*29))/29;
Knut=(sum%(17*29))%29;
if(sum>0)
cout<<Galleon<<"."<<Sickle<<"."<<Knut;
else
cout<<Galleon<<"."<<-Sickle<<"."<<-Knut;
}
1038 统计同成绩学生
不难的散列表。
#include<iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int a[100005];
for(int i=0;i<n;i++)
{
int temp;
cin>>temp;
a[temp]++;
}
int m;
cin>>m;
int b[m];
for(int i=0;i<m;i++)
{
int temp;
cin>>temp;
b[i]=a[temp];
}
cout<<b[0];
for(int i=1;i<m;i++)
cout<<" "<<b[i];
}
1039 到底买不买
(1)用map不是很难,map的相关用法可以参考:http://t.csdn.cn/DNQip;
(2)也有答主的题解没有使用map容器,用字符的ascii码作数组下标就可以解决。
#include<iostream>
#include<map>
using namespace std;
int main()
{
string s1,s2;
cin>>s1>>s2;
map<char,int> m;
for(auto x:s1)
m[x]++;
for(auto x:s2)
m[x]--;
int lack=0;
for(auto it=m.begin();it!=m.end();it++)
if(it->second<0)//供小于求
lack+=it->second;
if(lack==0)
cout<<"Yes "<<s1.size()-s2.size();
else
cout<<"No "<<-lack;
}
1040 有几个PAT
如果用三个for循环嵌套会导致超时(O());
最后的AC代码参考了这篇。
#include<iostream>
#define Mod 1000000007
using namespace std;
int main()
{
string s;
cin>>s;
int countP=0,countT=0;
int result=0;
for(auto x:s)
if(x=='T')
countT++;
for(auto x:s)
{
if(x=='P')
countP++;
if(x=='T')
countT--;
if(x=='A')
result=(result+countP*countT)%Mod;
}
cout<<result;
}