B - Express Mail Taking
题意:
接收邮件,有n个邮箱,编号为1~n,相邻的两个邮箱之间的距离为1,其中编号为k的比较特殊,用于输入密码,打开邮箱门,初始位置在邮箱1,一共有m封邮件需要收取,取完后回到邮箱1,求该过程的最短路径。
注意: 并不是到达k柜输入口令后就可以依次取出所有快递,而是每取走一个快递就需要返回k柜解锁下一个柜子。
思路:
贪心。将m封邮件距离初始位置的距离从小到大编号为1~m,先处理距离最远的邮件m,再去取邮件m-1,要使路径最短此时的方案为:
从邮件m的位置出发,先去k柜输密码,然后再返回邮件m-1的位置取件。
代码描述为:abs(a[i+1]-k)+abs(a[i]-k);
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
///B
int t;
ll n,m,k;
ll a[1000005];
int main(){
scanf("%d",&t);
while(t--){
scanf("%d %d %d",&n,&m,&k);
ll ans=0;
for(int i=1;i<=m;i++){
scanf("%d",&a[i]);
}
sort(a+1,a+m+1);
if (a[m]<k) ans=abs(a[m]-k)*2+a[m]-1;
else ans=a[m]-1;
for(int i=m-1;i>=1;i--){
ans+=abs(a[i+1]-k)+abs(a[i]-k);
}
printf("%lld\n",ans+a[1]-1);
}
return 0;
}
E - CCPC Training Class
题意
找字符串中出现次数最多的字符。
思路
利用count函数得到26个的字母在字符串出现的次数。
核心代码:
int t=count(s.begin(),s.end(),c);
ans=max(ans,t);
PS:count函数的用法:count(初始位置下标,结束下标,查找元素);
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
///E
int t;
string s;
int main(){
ios::sync_with_stdio(0);
cin>>t;
for(int i=1;i<=t;i++){
cin>>s;
int ans=0;
for(int j=0;j<=25;j++){
char c='a'+j;
int t=count(s.begin(),s.end(),c);
ans=max(ans,t);
}
cout<<"Case #"<<i<<": "<<ans<<endl;
}
return 0;
}
F - Reports
题意
给定一个01序列,判断相邻两个数是否相同。
思路
因为序列由0,1组成,所以若相邻两个数和为1,则两个数值不同。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
///H
int t;
int a[50],n;
int main(){
ios::sync_with_stdio(0);
cin>>t;
while (t--){
cin>>n;
int flag=1;
for(int i=0;i<n;i++){
cin>>a[i];
}
for (int i=0;i<n-1;i++){
if (a[i]+a[i+1]!=1){
flag=0;
break;
}
}
if (flag) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
G - 3x3 Convolution
Cn,n=An,n*K1,1
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
///G
int t,n;
int a[55][55],k[3][3];
int main(){
ios::sync_with_stdio(0);
cin>>t;
while(t--){
cin>>n;
int flag=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=3;i++){
for(int j=1;j<=3;j++){
cin>>k[i][j];
if(k[i][j]!=0) flag++;
}
}
if(k[1][1]!=0&&flag==1){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<a[i][j];
if(j!=n) cout<<" ";
else cout<<"\n";
}
}
}else{
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<"0";
if(j!=n) cout<<" ";
else cout<<"\n";
}
}
}
}
return 0;
}