题目1:MC0227堆煤球
码题集OJ-堆煤球 (matiji.net)
思路:
1.i从l枚举到r,i是8的倍数就跳过,i不是8的倍数就用等差数列求和公式i(1+i)/2,最后累加到答案中即可
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int l,r; cin>>l>>r;
int ans=0;
for(int i=l;i<=r;i++){
if(i%8==0) continue; //注意这里是模8
ans+=i*(1+i)/2; //等差数列求和公式
}
cout<<ans;
return 0;
}
题目2:MC0228军团大战
码题集OJ-军团大战 (matiji.net)
思路:
1.找出字符数量最多,有多个输出字典序最小的那一个
2.开一个数组,统计每一个字母出现的次数
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int main( )
{
string s; cin>>s;
vector<int>cnt(26); //统计每一个字符出现的次数
int mx=0;
for(char c:s){
cnt[c-'A']++;
mx=max(mx,cnt[c-'A']);
}
for(int i=0;i<26;i++) //找到字典序最小的一个
if(cnt[i]==mx){
cout<<(char)(i+'A');
return 0;
}
return 0;
}
题目3:MC0229武力对决
码题集OJ-武力对决 (matiji.net)
思路:
1.获得的最大经验值,用最大值减最小值得到
2.求最大值最小值,可以一趟遍历求得,也可以直接排序
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int const N=1e5+7;
int a[N];
int n;
int main( )
{
scanf("%d",&n);
for(int i=0;i<n;i++) scanf("%d",a+i);
sort(a,a+n);
cout<<a[n-1]-a[0]<<endl;
return 0;
}
题目4:MC0230小码哥教数学
码题集OJ-小码哥教数学 (matiji.net)
思路:
1.互质就是最大公约数为1,让两组学生左移,就是取出最高一位,把它放到个位
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
return b==0?a:gcd(b,a%b);
}
int main( )
{
int a,b; cin>>a>>b;
int temp=a,n=0;
while(temp) temp/=10,n++;
int base=pow(10,n-1); //10^(n-1)
int ans=-1;
for(int i=0;i<n;i++){
if(gcd(a,b)==1){
ans=i; break; //满足互质
}
a=a%base*10+a/base;
b=b%base*10+b/base;
}
cout<<ans;
return 0;
}
题目5:MC0231圣诞树上的星星
码题集OJ-圣诞树上的星星 (matiji.net)
思路:
1.3的倍数输出|,不是3的倍数第几行输出几个星星
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n; cin>>n;
for(int i=1;i<=n;i++){
if(i%3==0) puts("|"); //3的倍数
else{
for(int j=0;j<i;j++) printf("*");
puts("");
}
}
return 0;
}
题目6:MC0232魔塔密码
码题集OJ-魔塔密码 (matiji.net)
思路:
1.密码是由每隔k-1个字符组成的,相当于由下标索引模k等于0的所有字符组成
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int k;
string s; cin>>k>>s;
for(int i=0;i<s.size();i++){
if(i%k==0) cout<<s[i];
}
return 0;
}
题目7:MC0233地狱尖兵
码题集OJ-地狱尖兵 (matiji.net)
input:
3
5 5
....P
##..E
K#...
##...
.....
5 5
P....
.....
..E..
.....
....K
5 5
P#..E
.#.#.
.#.#.
.#.#.
...#K
output:
No solution
12
No solution
思路:bfs
1.小马妹先和其他小队回合,在一起前往制高点,先求P,K最短距离,再求K,E最短距离
2.求最短距离,可以跑一遍bfs,注意求P,K最短距离时要将制高点看成墙,表示不能通行
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int const N=507;
char s[N][N];
bool vis[N][N];
int n,m;
int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
struct Node{
int x,y,step;
};
int bfs(int x1,int y1,int x2,int y2){
queue<Node>q; q.push({x1,y1,0});
memset(vis,0,sizeof vis);
vis[x1][y1]=1;
while(q.size()){
Node temp=q.front(); q.pop();
if(temp.x==x2&&temp.y==y2) return temp.step; //找到了终点
for(int i=0;i<4;i++){
int x=dx[i]+temp.x,y=dy[i]+temp.y;
if(x<0||y<0||x>=n||y>=m) continue; //越界
if(s[x][y]=='#'||vis[x][y]) continue; //是墙,或者被遍历过
q.push({x,y,temp.step+1});
vis[x][y]=1;
}
}
return -1; //没有到终点
}
void solve(){
scanf("%d%d",&n,&m);
int px,py,kx,ky,ex,ey;
for(int i=0;i<n;i++) scanf("%s",s[i]);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++){
if(s[i][j]=='P') px=i,py=j;
else if(s[i][j]=='K') kx=i,ky=j;
else if(s[i][j]=='E') ex=i,ey=j;
}
//小马妹要和其他小队先会和,此时制高点也看成墙
s[ex][ey]='#';
int t1=bfs(px,py,kx,ky);
s[ex][ey]='E'; //复原
int t2=bfs(kx,ky,ex,ey);
if(t1==-1||t2==-1) puts("No solution");
else cout<<t1+t2<<endl;
}
int main( )
{
int T; cin>>T;
while(T--){
solve();
}
return 0;
}
题目8:MC0234激光扫描游戏
码题集OJ-激光扫描游戏 (matiji.net)
思路:
1.按要求模拟,遇到炸炸弹,变化扫描范围
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int const N=1e3+7;
int n;
vector<int>g[N]; //g[i]:存的是第i的的炸弹
int main( )
{
cin>>n;
for(int i=0;i<n;i++){
int x,y; cin>>x>>y;
g[x].push_back(y);
}
int ans=0,r=499;
for(int i=0;i<1000;i++){
int cur_r=r;
ans+=cur_r+1;
//遇到炸弹,变化为:行-列
for(int j:g[i]){
if(cur_r>=j) r=r+(i-j);
}
//扫描位置最大为999,最小为0
if(r<0) r=0;
if(r>999) r=999;
}
cout<<ans;
return 0;
}
题目9:MC0235数数游戏
码题集OJ-数数游戏 (matiji.net)
思路:
1.从1枚举到n,分别统计满足要求的情况
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
//能被3整除或包含数字3
bool check3(int n){
if(n%3==0) return true;
while(n){
if(n%10==3) return true;
n/=10;
}
return false;
}
//能被5整除或包含数字5
bool check5(int n){
if(n%5==0) return true;
while(n){
if(n%10==5) return true;
n/=10;
}
return false;
}
int main( )
{
int n; cin>>n;
int a=0,b=0,c=0;
for(int i=1;i<=n;i++){
if(check3(i)&&check5(i)) c++; //规则一二都满足
else{
if(check3(i)) a++; //满足规则一
if(check5(i)) b++; //满足规则二
}
}
printf("%d\n%d\n%d\n",a,b,c);
return 0;
}
题目10:MC0236跳跳棋
码题集OJ-跳跳棋 (matiji.net)
input:
4
4
2 3 5 8
2 3 5 8
2 3 5 8
2 3 5 8
output:
8
思路:模拟
1.模拟跳到的格子,是质数答案++
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int const N=107;
int a[N][N];
int n,m;
//检查是否为质数
bool check(int n){
for(int i=2;i<=n/i;i++)
if(n%i==0) return false;
return true;
}
int main( )
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);
int ans=0;
int i=1,j=1;
while(i<=n){
if(check(a[i][j])) ans++,j+=a[i][j]%10; //是质数答案++
else j++; //不是质数向右跳一格
if(j>m) i++,j=1;
}
cout<<ans;
return 0;
}
题目11:MC0237小狗巴克
码题集OJ-小狗巴克 (matiji.net)
思路:
1.对原字符串去除'!',得到一个新的字符串,然后用新的字符串调用find函数,查找目标字符串
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int main( )
{
string s,t; cin>>s>>t;
string new_s;
for(int i=0;i<s.size();i++) {
if(s[i]=='!') continue; //去除'!'
new_s+=s[i];
}
int idx=new_s.find(t); //用新的字符串直接调用find函数
if(idx!=-1) puts("True");
else puts("False");
return 0;
}
题目12:
占时更新
题目13:MC0239小码哥玩字母独
码题集OJ-小码哥玩字母独 (matiji.net)
思路:
1.开一个hash数组,将主对角线的字符,加入数组中,如果一个字符出现了两次,则输出refuse,并结束程序,如果到最后都没有出现相同的字符输出accept
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int const N=107;
int n;
char str[N][N];
bool vis[26]; //hash数组
int main( )
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%s",str[i]+1);
for(int i=1;i<=n;i++){
char c=str[i][i];
if(vis[c-'a']){
puts("refuse"); //当前字符出现了2次了
return 0;
}
vis[c-'a']=true;
}
puts("accept");
return 0;
}