首页 > 其他分享 >很有意思的一次周赛,虽然被打爆了,呜呜,动了四题,只ac一道板子

很有意思的一次周赛,虽然被打爆了,呜呜,动了四题,只ac一道板子

时间:2023-12-24 14:57:38浏览次数:36  
标签:周赛 cout int 四题 cin using tie include 打爆

第三次周赛题解

A.前缀和

观察题 cao

分奇偶

注意观察---奇数()

只有第一个和第二个会是奇数 后面全是前面累乘2

if(x%2!=0) x要么是第一个要么是第二个(无区别)因为1,2元素大小相等

剩下元素a[n]=pow(2,n-2)*x;

else 不是奇数化为奇数

ll q=x;//保存一下结果,后面要特判

while(x%2==0)x/=2;

ll w=w*pow(2,n-2); 如果w>q则输出w,否则输出q

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[21];
int t;
int main()
{
    ios::sync_with_stdio(false);cin.tie();cout.tie();
    cin>>t;
    while (t -- )
    {
        ll n,x;
    cin>>n>>x;
  if(x%2!=0)
  {
      ll q=pow(2,n-2);
      cout<<q*x<<endl;
  }
  else {
      ll w=x;
      while(x%2==0)x/=2;
      ll q=pow(2,n-2)*x;
      if(q<w)cout<<w<<endl;
      else cout<<q<<endl;
  }
    }
    return 0;
}

B.

还不会 ---数学差的人是这样的

C.田径

基本不等式--数学死亡加1

a+b>=2 * sqrt(a*b);

由题意---得到a*b==n

我们只要保证存在一个解使得m>=(a+b+2)*2即可


for(int i=1;i<=n/i;i++)
 {
             if((i+n/i+2)*<=m)
              return true;
 }
return false;




#include<bits/stdc++.h>
using namespace std;
int t;
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>t;
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        int df=true;
     for(int i=1;i<=n/i;i++)
     {
         if(n%i==0)
         {
             if((i+n/i+2)*2<=m)
             {df=false;cout<<"Good\n";break;}
         }
     }
     if(df)
     cout<<"Miss\n";
    }
    return 0;
}

D.国王的魔镜

判断回文的板子题

没看出来ccccc呜呜

先判断是否使回文数再判断后续

每次substr范围折半

#include<bits/stdc++.h>
using namespace std;
//const int N = 20;
bool hui(string d)
{
    string c=d;
    reverse(d.begin(),d.end());
    if(d==c)return true;
    return  false;
}
int main()
{
    string a,b,c,d;
    cin>>b;
    int l=b.size();
    if(l==2)
    {
        if(b[0]==b[1])cout<<1<<endl;
        else cout<<2<<endl;
        return 0;
    }
     while(hui(b)&&l%2==0)
     {
         
         l/=2;
   if(l==2)
    {
        if(b[0]==b[1])cout<<1<<endl;
        else cout<<2<<endl;
        return 0;
    }
         b=b.substr(0,l);
        // cout<<b<<endl;
     }
     cout<<l<<endl;
    return 0;
}

E.回家

与普通的bfs不同

因为有血量这种限制

bool vis的判定会出现问题

如果我此时去绕路捡血包可能会更加划算

因此我们不能直接判重-------剪枝掉血包(我们很容易想到血包只会捡一次)

#include<bits/stdc++.h>
using namespace std;
const int N = 20;
#define eps(a,b)  for(int i=a;i<=b;i++)
#define epq(a,b)  for(int j=a;j<=b;j++)
int n,m;
int a[N][N];
bool vis[N][N];
int x,y,ox,oy;
int d[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
struct node{
    int dx,dy,res,cnt;
};
int bfs()
{
    queue<node>q;
    q.push({x,y,6,0});
    vis[x][y]=0;
    while(q.size())
    {
        int mx=q.front().dx,my=q.front().dy,res=q.front().res,cnt=q.front().cnt;
        q.pop();
        if(res<=0)continue;
        if(mx==ox&&my==oy)return cnt;
       for(int i=0;i<4;i++)
       {
          int qo=res;
        int nx=mx+d[i][0],ny=my+d[i][1];
        if(nx<1||nx>n||ny<1||ny>m||!a[nx ny]||vis[nx[ny])continue;
        qo--;
        if(qo<=0){continue;}
        if(a[nx][ny]==4)qo=6;
        if(qo>=res)vis[nx][ny]=true;
      q.push({nx,ny,qo,cnt+1});
      
      }
    }
    return -1;
}
int main()
{
   ios::sync_with_stdio(false);cin.tie();cout.tie();
    cin>>n>>m;
    
    eps(1,n)
    epq(1,m)
    {
        cin>>a[i][j];
        if(a[i][j]==2)
        x=i,y=j;
        else if(a[i][j]==3)
        ox=i,oy=j;
    }
    cout<<bfs();
    return 0;
}

F.众数

死在一些思考问题上

每次查询直接for遍历x-y就行

每次用ans(元素是谁)和res(多少个)更新

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m;
int a[1010];
int main()
{
    ios::sync_with_stdio(false);cin.tie();cout.tie();
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    while(m--)
    {
        int f,x,y;
        cin>>f>>x>>y;
        if(f==0)
        {
            map<int,int>m;
           int res=0,ans=1e9+10;
            for(int i=x;i<=y;i++)
                m[a[i]]++;
        for(int i=x;i<=y;i++)
            {
                if(res<m[a[i]])
                {ans=a[i];res=m[a[i]];}
                else if(res==m[a[i]])
                {
                    ans=min(a[i],ans);
                }
            }
            cout<<ans<<'\n';
        }
        else{
            a[x]=y;
        }
    }
    return 0;
}

H.A % B Problem

线性筛+前缀和

 #include<iostream>
using namespace std;
const int N = 1e7+10;
#include<vector>
vector<int>p;
bool st[N];
int n, m;
int a[N];
int main()
{
	ios::sync_with_stdio(false); cin.tie(); cout.tie();
	cin >> n >> m;
	for (int i = 2; i <= m; i++)
	{
		if (!st[i])p.push_back(i);
		for (int j = 0; j <= m / i; j++)
		{
			st[p[j] * i] = true;
			if (i % p[j] == 0)break;
		}
	}
	for(int i=2;i<=m;i++)
	{
	    if(!st[i])a[i]++;
	    a[i]+=a[i-1];
	}
 while(n--)
 {
     int l,r;
     cin>>l>>r;
     if(l>m||r>m||l<=0||r<=0)
     {
         cout<<"Crossing the line\n";
         continue;
     }
     cout<<a[r]-a[l-1]<<endl;
 }
	return 0;
}

I.Remove Duplicates

map从后往前去重vis[i]记录后面下标

从前往后遍历看vis[i]是否存在

#include<bits/stdc++.h>
using namespace std;
int a[1000010];
int vis[1000001];
int res;
map<int,bool>p;
int main()
{
    int n;
    cin>>n;
     for(int i=1;i<=n;i++)
     {
         cin>>a[i];
     }
      for(int i=n;i>=1;i--)
      {
          if(!p[a[i]]){vis[i]=i;p[a[i]]=true;res++;}
      }
      cout<<res<<endl;
      for(int i=1;i<=n;i++)
      {
          if(vis[i])cout<<a[i]<<' ';
      }
}

J.File Name

简单模拟即可

主要是删除而不是替换

看一下1000好的,直接find+erase模拟上手

#include<bits/stdc++.h>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    int n;
    cin>>n;
    string a;
    cin>>a;
    int pose=a.find("xxx");
    if(pose<0||pose>=n)
    {
        cout<<"0\n";
        return 0;
    }
    long long res=0;
   // cout<<pose<<endl;
    while(pose>=0&&pose<a.size())
    {
        pose=a.find("xxx");
        if(pose<0||pose>=a.size())break;
        res++;
        a.erase(pose+2,1);
    }
    cout<<res<<endl;
    return 0;
}

总结:挺有意思的题目,虽然做的时候卡

挺有意思的题目,见到了一些新奇的东西,英文题面还是有点不适应

标签:周赛,cout,int,四题,cin,using,tie,include,打爆
From: https://www.cnblogs.com/yuexiabaobei/p/17924382.html

相关文章

  • Acwing.第135场周赛
    比赛地址A.买苹果题目思路:简单的模拟一下就好了代码:#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ intn,x; cin>>n>>x; cout<<n/x<<endl; return; }intmain(){ intt=1; while(t--){ solve(); } return0;}B.牛群题目思路:也......
  • 力扣第 376 场周赛(三分,中位数贪心,滑动窗口)
     用一个哈希表记录一下,然后遍历统计一下即可。classSolution{public:vector<int>findMissingAndRepeatedValues(vector<vector<int>>&grid){intn=grid.size();unordered_set<int>st;vector<int>res;......
  • 牛客周赛 Round 24
    牛客周赛Round24比赛地址最后一题没想到用二分做,可惜可惜,思考的方向错了A小红的矩阵构造题目链接思路:主要是区分一下n是奇数还是偶数,是奇数的话就正常输出就行,是偶数的话就可以把偶数行逆着输出代码:#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ intn......
  • Acwing.第134场周赛
    Acwing.第134场周赛比赛地址A排序题目思路:简单的模拟代码:#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ inta,b,c; cin>>a>>b>>c; intans=a+b+c; intmaxn=max(a,max(b,c)); intminn=min(a,min(b,c)); cout<<minn<<"......
  • 第 375 场周赛(滑动窗口,区间合并)
     使用差分的思想进行解决classSolution:defcountTestedDevices(self,batteryPercentages:List[int])->int:diff=0forxinbatteryPercentages:ifx>diff:diff+=1returndiff    clas......
  • Acwing第132场周赛
    AcWing5366.大小写转换#include<bits/stdc++.h>#definelsp<<1#definersp<<1|1#definePIIpair<int,int>#definelllonglong#definedbdouble#defineullunsignedlonglong#defineendl'\n'#defineioios::sync_with_......
  • 第 132 场周赛——质数小结论,并查集配Floyd
    https://www.acwing.com/activity/content/competition/problem_list/3648/B题收获:1.利用题目告诉的结论:1e9范围质数之差小于3002.一个数不被2-a的任何数整除等价于他的最小质因子需要大于ac题:初步宏观思路:不难想到用并查集维护类别,只需将每一个类缩成一个点,由于最多只有500......
  • 每日一题+周赛总结
    每日一题+周赛总结2023.12周一周二周三周四周五周六周日[[12.2]差分数组](#12.2)[[12.3]滑动窗口](#12.3)周赛12.2一维差分数组1094.拼车区域性数字的加减,判断总体是否合法回忆一下二维差分数组12.3前......
  • Acwing.第132场周赛
    Acwing.第132场周赛比赛地址A.大小写转换题目思路:简单的模拟,可以使用c++大小写转换库函数,但是由于我早上比赛时候没用好就不敢用了就用了ASCII码转换代码:#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ strings; cin>>s; for(inti=0;i<s.size();i++)......
  • Acwing第 131 场周赛 之找最值过程中维护某个性质的方案
    https://www.acwing.com/problem/content/5367/题目如果只需要输出最大值,我都没有问题。每次需要输出方案的时候,我似乎都需要先统计最大值,再重新扫描一遍找所有能够取得最大值的方案,然后在这些方案中找到最大值。最好的做法应该是在找最大值的过程中就维护题目要求方案的排序关......