栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

pta520钻石争霸赛题解

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

pta520钻石争霸赛题解


水题直接贴代码

#include 
using namespace std;

int main() {
      int n;
      cin>>n;
      printf("%d! 520!",n);
    return 0;
}


简单if分支语句

#include 
using namespace std;
int main() {
      int n,m,k;
      scanf("%d%d%d",&n,&m,&k);
      if(n*k==m)
          printf("zheng hao mei ren %d!",k);
      else if(n*k 


直接贴代码

#include 
using namespace std;

int main() {
      int a,b,c,d,e;
       scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
      int n;
      cin>>n;
      while(n--){
          int x,y,z;
          scanf("%d%d%d",&x,&y,&z);
              if(a!=x)
              if(y>=b&&y<=c)
              if(z>=d&&z<=e)
                  printf("%d %d %dn",x,y,z); 
          }

    return 0;
}


这里需要注意的是一个精度问题避免除法产生误差
原式子通分得 3xyz=n(xy+zx+y*z) 即可后暴力三层循环

#include 
using namespace std;
int flag=0;
int main() {
    int a, b, c, d, e;
    scanf("%d%d", &a, &b);
    for (int i = 1; i <= b - 2; i += 2) {
        for (int j = i + 2; j <= b - 1; j += 2) {
            for (int k = j + 2; k <= b; k += 2) {
                if (3 * (i * j * k) == a * (i * j + i * k + k * j)) {
                    printf("%d %d %dn", i, j, k);
                    return 0;
                }
            }
        }
    }
         printf("No solution in (3, %d].n",b);
     
     

    return 0;
}


用俩个数组分别统计给出字符串中0~9数字的个数
注意考虑去除前导0

#include 
using namespace std;
typedef long long ll;
int n[15],m[15];
void check(string h)
{
    int f=0;
    for(int i=0;i
        int a=h[i]-'0';
        if(a>0)f=1;
        if(f>0)n[a]++;

    }
}
void slove(string h)
{
    int f=0;
    for(int i=0;i
        int a=h[i]-'0';
        if(a>0)f=1;
        if(f>0)m[a]++;

    }
}
int main() {
    string a,b;
    cin>>a>>b;
    check(a);
    check(b);
    string x,y;
    while(cin>>x>>y){
        if(x[0]=='0'&&y[0]=='0'&&x.size()+y.size()==2)
            break;
        slove(x);
        slove(y);
        int f=0;
        for(int i=0;i<10;i++){
            if(n[i]!=m[i])
                f=1;
            m[i]=0;
        }
        if(f)
            cout<<"No"< 


这题其实没什么好讲的,跟随题意模拟就好

#include 
using namespace std;
typedef long long ll;

int main() {
    int n;
    cin>>n;
    int c=n*1.0/2.718;
    int f=0;
    int maxn=0,manx=0,x=0,y=0;
    for(int i=1;i<=n;i++){
        int a;
        cin>>a;
        if(a>maxn){
            maxn=a;
            x=i;
        }
        if(i<=c)
            manx=max(manx,a);
        else if(f==0&&manx<=a){
                    y=i;
                    manx=a;
                    f=1;
                }
    }
    cout< 


题意明朗,注意输出不能重复即可也是一个模拟题思路较为直接

#include 
using namespace std;
typedef long long ll;
ll a[1005][1005];
int vis[1005][1005];
int main() {
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            cin>>a[i][j];
    int x,y,t;
    cin>>x>>y>>t;
    vectorvec;
    int maxn=abs(a[x][1]-t);
    vec.push_back(1);
    for(int i=2;i<=m;i++){
        if(abs(a[x][i]-t)
            vec.clear();
            vec.push_back(i);
            maxn=abs(a[x][i]-t);
        }else if(abs(a[x][i]-t)==maxn){
            vec.push_back(i);
        }
    }
    for(int i=0;i
        printf("(%d,%d)n",x,vec[i]);
    }
    vec.clear();
     maxn=abs(a[1][y]-t);
    vec.push_back(1);
    for(int i=2;i<=n&&i!=x;i++){
        if(abs(a[i][y]-t)
            vec.clear();
            vec.push_back(i);
            maxn=abs(a[i][y]-t);
        }else if(abs(a[i][y]-t)==maxn){
            vec.push_back(i);
        }
    }
    for(int i=0;i
        printf("(%d,%d)n",vec[i],y);
    }


    return 0;
}


压轴题有点考思维但是我们可以从正负分开处理
排序后处理
(1)正的最大值一定是原始序列其中一个的5倍,之后将其2倍数和自身标记起来避免重复,从大到小遍历。
(2)负数的最小值一定是原始序列其中一个的5倍,之后将其2倍数和自身标记起来避免重复,从小到大遍历。
我采用的是双端队列时间复杂度o(N)

#include 
using namespace std;
typedef long long ll;
int h[100005];
int vis[1000005];
dequequ;
vectorvec;
int main() {
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>h[i];
    }
    sort(h+1,h+n+1);

    for(int i=1;i<=n;i++){
        qu.push_back(h[i]);
        //cout<
        int f=qu.front();
        if(f<0) {
            qu.pop_front();
            if (vis[f + 500000] == 0) {
               // vis[f + 500000]++;
                vis[f / 5 + 500000]++;
                vis[f / 5 * 2 + 500000]++;
                vec.push_back(f / 5);
                sum++;
                //cout << f << " f" << endl;
            } else {
                vis[f + 500000]--;
            }
        }
        int t=qu.back();
        if(t>=0){
            qu.pop_back();
            if(vis[t+500000]==0){
                //vis[t+500000]++;
                vis[t/5+500000]++;
                vis[t/5*2+500000]++;
                //cout<
                vis[t+500000]--;
            }
        }

    }
    sort(vec.begin(),vec.end());
    for(int i=vec.size()-1;i>=0;i--){
        if(i!=vec.size()-1)
            cout<<" ";
        cout< 

达成120分

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/925434.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号