1036 跟奥巴马一起编程
解决代码
模拟题目即可。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
int n;
char c;
cin>>n>>c;
double col=(double)n/2;
int n0=n/2;
if(col>n0+0.4) n0+=1;
for(int i=0;i<n;i++){
cout<<c;
}
cout<<endl;
for(int i=0;i<n0-1;i++){
if(i==n0-2){
for(int j=0;j<n;j++){
cout<<c;
}
}
else{
for(int j=0;j<n;j++){
if(j==0||j==n-1){
cout<<c;
}else cout<<' ';
}
cout<<endl;
}
}
return 0;
}
1037 在霍格沃茨找零钱
解决代码
就是进制转换的升级版,处理好进制转换即可。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int do_(string &a){
string x;
int num;
for(int i=0;i<a.size();i++){
if(a[i]=='.'){
x=a.substr(0,i);
a=a.substr(i+1,a.size()-i);
num=stoi(x);
break;
}
}
return num;
}
int main(){
string a,b;
cin>>a>>b;
int g1,s1,k1;
int g2,s2,k2;
g1=do_(a); s1=do_(a); k1=stoi(a);
g2=do_(b); s2=do_(b); k2=stoi(b);
long long int sum=(long long int)(g2-g1)*17*29+(s2-s1)*29+(k2-k1);
if(sum<0) cout<<'-';
cout<<abs(sum/(17*29))<<'.'<<abs(sum/29%17)<<"."<<abs(sum%29);
return 0;
}
1038 统计同成绩学生
解决代码
利用哈希表,解决非常高效。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int hash_[100005];
vector<int> mark,find_;
int main(){
int n,m;
cin>>n;
mark.resize(n);
for(int i=0;i<n;i++){
cin>>mark[i];
hash_[mark[i]]++;
}
cin>>m;
find_.resize(m);
for(int i=0;i<m;i++) cin>>find_[i];
for(int i=0;i<find_.size();i++){
cout<<hash_[find_[i]];
if(i!=find_.size()-1) cout<<' ';
}
return 0;
}
1039 到底买不买
解决代码
利用两个哈希表,先统计摊主的珠子个数,再利用unordered_map统计小红的珠子种类以及个数。
接着对于小红的每种珠子,利用sum累计比摊主多了多少个(即为缺了珠子)。
如果结果为正,则输出代表真的缺少了这么多个;
如果结果为非正数,则说明不缺少,输出摊主珠子个数 — 小红珠子个数 即为多余的珠子个数。
#include<iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;
int hash_[150];
unordered_map<char,int> map_;
int main(){
string a,b;
cin>>a>>b;
for(int i=0;i<a.size();i++){
hash_[a[i]]++;
}
int sum=0;
for(int i=0;i<b.size();i++){
map_[b[i]]++;
}
for(auto i:map_){
if(i.second>hash_[i.first]) sum+=i.second-hash_[i.first];
}
if(sum>0){
cout<<"No "<<abs(sum)<<endl;
}else{
cout<<"Yes "<<a.size()-b.size();
}
return 0;
}
1040 有几个PAT
参考了柳神的代码,大佬太强了。
先统计整个串中T的个数numt,随后遍历整个串,遇到T就numt–,此时numt代表串后面的t的个数。
遇到P就nump++,直到遇到A,A字符前面P的个数和后面T的个数的乘积即为这个A所在的PAT串的个数,将其取模累加。
思路非常好!
解决代码
#include<iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>
using namespace std;
int main(){
string str;
cin>>str;
int numt=0,nump=0,numa=0;
long long int sum=0;
for(auto i:str) if(i=='T') numt++;
for(auto i:str){
if(i=='T') numt--;
if(i=='P') nump++;
if(i=='A') sum+=(nump*numt)%1000000007;
}
cout<<sum%1000000007<<endl;
return 0;
}