题目1:MC0214捡麦子
码题集OJ-捡麦子 (matiji.net)
思路:
1.第n米在前n-1米的基础上多加一个n个麦子,那么直接从1开始枚举,累加答案即可
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int n; cin>>n;
int ans=0,sum=0;
for(int i=1;i<=n;i++){
sum+=i;
ans+=sum;
}
cout<<ans;
return 0;
}
题目2:MC0215小码哥玩游戏
码题集OJ-小码哥玩游戏 (matiji.net)
思路:
简述题意:统计给定字符的相邻字符的数量,注意结果要去重
1.可以将给定字符的四个相邻字符,放到set中,最后直接输出set大小
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int const N=107;
int n,m;
char ch;
char str[N][N];
int dx[]={-1,1,0,0},dy[]={0,0,-1,1};
int main( )
{
cin>>n>>m>>ch;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) cin>>str[i][j];
}
set<char>s;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(str[i][j]!=ch) continue; //不是指定字符
for(int k=0;k<4;k++){
int x=dx[k]+i,y=dy[k]+j;
if(x<1||y<1||x>n||y>m) continue;
if(str[x][y]=='0'||str[x][y]==ch) continue; //0是无字符,且不能与指定字符一致
s.insert(str[x][y]);
}
}
}
cout<<s.size(); //直接输出set大小
return 0;
}
题目3:MC0216淘金者
码题集OJ-淘金者 (matiji.net)
思路:
1.查找第一个给定字符,找到直接输出其下标+1,遍历完都没有找到输出-1
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
string s;
char target;
int main( )
{
cin>>s>>target;
for(int i=0;i<s.size();i++){
if(s[i]==target){
cout<<i+1;
return 0;
}
}
cout<<-1;
return 0;
}
题目4:MC0217自动浇花机
码题集OJ-自动浇花机 (matiji.net)
思路:
1.左边的喷头的浇花的速度是右侧的两倍,那么相当于右侧的喷头浇花花费时间是左边的两倍
2.那么可以枚举分割点,左侧左喷头浇,右侧右喷头浇,满足左侧花费的时间<=右侧花费时间的两倍,分割点++
3.计算左右两侧的花费时间可以用前缀和优化
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int const N=1e3+7;
int a[N],pre[N];
int n;
int main( )
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",a+i);
pre[i]=pre[i-1]+a[i];
}
//枚举分割点
int idx=1;
while(pre[idx]<=(pre[n]-pre[idx+1])*2) idx++;
cout<<idx<<endl;
return 0;
}
题目5:MC0218小码哥的开心数字
码题集OJ-小码哥的开心数字 (matiji.net)
思路:
1.反转之后比较大小即可,
2.怎么反转呢?假设a=123,b=0,b为反转后的数字,每次令b=b*10+a%10,最后就可以得到a反转后的数b
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int a; cin>>a;
int temp=a,b=0; //b为反转后的数
while(temp){
b=b*10+temp%10;
temp/=10;
}
cout<<b<<endl;
if(b<a) puts("False"); //反转过后的数小于反转前的数
else puts("True");
return 0;
}
题目6:MC0219自驾游
码题集OJ-自驾游 (matiji.net)
思路:bfs
1.以路程0为起点,加油站的距离与money为限制,跑一个最短路,这里可以直接跑bfs
2.跑bfs时,要记录上一个加油站的下标索引,加快bfs的效率
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>PII;
#define x first
#define y second
int const N=2007;
PII a[N];
int n,l,mx,s;
struct Node{
int dist,money,idx;
};
bool bfs(){
queue<Node>q; q.push({0,s,-1});
while(q.size()){
Node t=q.front(); q.pop();
if(t.dist+mx>=l) return true; //总行程已达L
//这里记录了上一次加油的下标
for(int i=t.idx+1;i<n;i++){
if(a[i].x>t.dist+mx) break; //距离太远,无法到达
if(a[i].y>t.money) continue; //钱不够加油
q.push({a[i].x,t.money-a[i].y,i});
}
}
return false; //总行程无法达到达L
}
int main( )
{
while(cin>>n>>l>>mx>>s){
for(int i=0;i<n;i++) cin>>a[i].x>>a[i].y;
sort(a,a+n); //对距离升序排列
if(bfs()) puts("Yes");
else puts("No");
}
return 0;
}
题目7:MC0220买月饼
码题集OJ-买月饼 (matiji.net)
思路:
1.枚举买月饼的个数,对总费用分情况讨论,总费用小于10元,只有代金券面额刚好等于总费用符合条件
2.总费用大于10元时,总费用刚好为10的倍数,或者个位数刚好等于代金券的面额,就满足条件
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int main( )
{
int m,n; cin>>m>>n;
for(int i=1;;i++){
int money=i*m;
if(money<10){ //总费用小于10元
if(n==money){
cout<<i;
return 0;
}
}
else{ //总费用大于等于10元
if(money%10==0||money%10==n){
cout<<i;
return 0;
}
}
}
return 0;
}
题目8:MC0221未来战争
码题集OJ-未来战争 (matiji.net)
思路:
1.用差分对充能段标记为1,同时记录充能起点和终点
2.最后统计充能段的最大值,与非充能段的最大值,
3.最后充能段要记得减一,非充能段要加一,因为算的是区间
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int const N=1e6+7;
int n;
int diff[N];
int main( )
{
scanf("%d",&n);
int start=1e6+7,target=-1; //记录起点与终点
for(int i=0;i<n;i++){
int l,r; scanf("%d%d",&l,&r);
start=min(start,l);
target=max(target,r);
diff[l]++, diff[r+1]--; //差分
}
for(int i=1;i<N;i++) diff[i]+=diff[i-1]; //前缀和
int ans1=0,ans2=0;
int a=0,b=0;
for(int i=start;i<=target;i++){
if(diff[i]) a++,b=0;
else b++,a=0;
ans1=max(ans1,a);
ans2=max(ans2,b);
}
//算的区间长度,所以要减一,加一操作
cout<<ans1-1<<" "<<(ans2==0?0:ans2+1)<<endl;
return 0;
}
题目9:MC0222文章压缩
码题集OJ-文章压缩 (matiji.net)
思路:
1.对每个单词,记录它在第几次出现过
2.最后按要求输出即可
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int const N=1e3+7;
string str[N];
int n;
unordered_map<string,vector<int>>idx; //记录单词出现的位置
int main( )
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>str[i];
idx[str[i]].push_back(i);
}
unordered_set<string>vis; //标记是否输出过单词
for(int i=1;i<=n;i++){
if(vis.count(str[i])) continue; //输出过了
vis.insert(str[i]);
vector<int>y=idx[str[i]];
cout<<str[i]<<"("<<y[0];
for(int j=1;j<y.size();j++) cout<<","<<y[j];
cout<<")";
}
return 0;
}
题目10:MC0223魔法水晶球
码题集OJ-魔法水晶球 (matiji.net)
思路:
1.先检查是否为质数,在判断奇偶数
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
bool check(int n){
for(int i=2;i<=n/i;i++)
if(n%i==0) return false;
return true;
}
int main( )
{
int n; cin>>n;
if(check(n)) puts("P");
else if(n%2) puts("O");
else puts("E");
return 0;
}
题目11:MC0224手机测试
码题集OJ-手机测试 (matiji.net)
思路:
1.按要求模拟,但是要注意t1时间段也算是性能模式,还有就是注意计算的是时间段
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int a,m,n,k,t1,t2;
int main( )
{
cin>>a>>m>>n>>k>>t1>>t2;
int ans=0;
int pre_r=-1; //记录前一段的结束时间
for(int i=0;i<a;i++){
int l,r; cin>>l>>r;
ans+=(r-l)*m; //性能模式
if(pre_r!=-1){
int len=l-pre_r;
//性能模式
if(len>=t1){
len-=t1;
ans+=t1*m;
}
else{
ans+=len*m; pre_r=r; continue;
}
//正常模式
if(len>=t2){
len-=t2;
ans+=t2*n;
}
else{
ans+=len*n; pre_r=r; continue;
}
//省电模式
ans+=k*len;
}
pre_r=r;
}
cout<<ans;
return 0;
}
题目12:MC0225银河贸易市场
题解:MC0225银河贸易市场(码蹄杯)-CSDN博客
题目13:MC0226双人成行
思路:
1.把小马哥,小马弟做的题目放到一个集合中,看是否等于n
AC_Code:C++
#include<bits/stdc++.h>
using namespace std;
int n,m;
set<int>s;
void get(){
cin>>m;
for(int i=0;i<m;i++){
int t; scanf("%d",&t);
s.insert(t);
}
}
int main( )
{
cin>>n;
get(); //小马哥的题
get(); //小马弟的题
if(s.size()==n) puts("It Takes Two.");
else puts("Maybe Next Time.");
return 0;
}