团队设计天梯赛L1坑点题目总结

前言

刷不动题了,就把这两天刷的有坑点的题目总结下吧

L1-006 连续因子

坑点:要考虑有素数存在的情况

view code
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;cin>>n;

    int mlen=0;
    int start=0;
    for(int i=2;i<=sqrt(n);i++){
        if(n%i!=0) continue;
        int temp=n;
        int x=i;
        int len=0;
        while(temp%x==0){
            temp/=x;
            x++;
            len++;
        }
        if(mlen<len){
            mlen=len;
            start=i;
        }

    }
    if(!mlen){
        printf("%d\n%d",1,n); return 0;
    }

    cout<<mlen<<endl;

    for(int i=0;i<mlen;i++){
        if(i!=0)cout<<"*";
        cout<<start++;
    }
  return 0;
}

L1-019 谁先倒

甲乙同时赢或者同时输不喝酒

view code
#include <bits/stdc++.h>

using namespace std;

string s;

int main()
{
    int maxa,maxb;
    cin>>maxa>>maxb;
    int n; cin>>n;
    int numa=0,numb=0;
    for(int i=0;i<n;i++){
    int a1,a2,b1,b2;
    cin>>a1>>a2>>b1>>b2;
    if(a1+b1==a2&&a2!=b2)
        numa++;
    if(a1+b1==b2&&a2!=b2)
        numb++;
    if(numa>maxa){
        cout<<"A\n";
        cout<<numb; break;
    }
    if(numb>maxb){
        cout<<"B\n";
        cout<<numa;
        break;
    }
   }
  return 0;
}

L1-033 出生年

坑点:年龄不能太大,否则就会有个测试点不过

view code
#include <bits/stdc++.h>

using namespace std;

int main()
{
    int y,n; cin>>y>>n;
    set<int> s;
    for(int i=y;i<=y+150;i++){  //就是这里,不能i<3000,小于个一百多就行了   

        if(i<1000)s.insert(0);
        int x=i;
        while(x>0){
             s.insert(x%10);
             x/=10;
        }
        if(s.size()==n){
            printf("%d %04d",i-y,i);break;
        }
        s.clear();
    }
  return 0;
}

L1-039 古风排版

这题没什么坑点,不过挺有意思的,记录一下

view code
#include <bits/stdc++.h>

using namespace std;

char a[105][105];
int main()
{
    int n; cin>>n; getchar();
    string s;
    getline(cin,s);
    int len=s.size();
    int m=len/n;
    if(len%n!=0) m++;
    int tot=0;
    for(int i=m-1;i>=0;i--){
        for(int j=0;j<n;j++){
                if(tot<len){
                a[j][i]=s[tot++];
                }
                else a[j][i]=' ';

        }

    }

    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++){
            cout<<a[i][j];
        }
        cout<<endl;
    }
  return 0;
}

L1-043 阅览室

坑点:第一天借的书如果当天没有还,在第二天或者以后再还是按一天的时间来算。真坑,题目设计有问题。

view code
#include <bits/stdc++.h>

using namespace std;


 int s[1005],vis[1005];

int ans1[1005],ans2[1005];

int main()
{
    int n;
    cin>>n;
    int cnt=0;
    double sum=0;
    int person=0;
    while(cnt<n){

    char c; int x,hh,mm;

    scanf("%d %c %d:%d",&x,&c,&hh,&mm);

    if(x==0){

        ans1[cnt]=person;
        if(person!=0)
        ans2[cnt]=sum/person+0.5;
        person=0; sum=0;

         cout<<ans1[cnt]<<" "<<ans2[cnt]<<endl;
         cnt++;
          continue;
    }
    if(c=='S'){  s[x]=hh*60+mm;vis[x]=1;}
    else if(c=='E'){
        if(vis[x]){
            sum+=hh*60+mm-s[x];
            person++;
            vis[x]=0; //这里得手动置零,因为有可能出现第一天借的书没有还,到了第二天,第三天才还,
                      //很坑的是,即使是到了第二天第三天去还,阅读时间还是按一天的来算。
        }
    }

  }
  return 0;
}

L1-046 整除光棍

记录一下,这种模拟除法的方法还是第一次见

view code
#include <bits/stdc++.h>

using namespace std;

int main()
{

    int x;cin>>x;
    int s=1;
    int n=0;
    while(x>s){
     s=s*10+1;
     n++;
    }

    while(1){
        cout<<s/x;
      if(s%x==0){ n++; break;}

       s%=x;
      s=s*10+1;
        n++;
    }

    cout<<" "<<n;
    return 0;
}

L1-048 矩阵A乘以B

线线代?

view code
#include <bits/stdc++.h>

using namespace std;

int n,m,n1,n2,m1,m2;

int a[105][105],b[105][105];

int main()
{

    cin>>n1>>m1;
    for(int i=0;i<n1;i++)
        for(int j=0;j<m1;j++)
        cin>>a[i][j];

    cin>>n2>>m2;
   for(int i=0;i<n2;i++)
        for(int j=0;j<m2;j++)
        cin>>b[i][j];

    if(m1!=n2){ printf("Error: %d != %d",m1,n2); return 0;}
    cout<<n1<<" "<<m2<<endl;
    for(int n=0;n<n1;n++){

        for(int m=0;m<m2;m++){
        int x=0;
        for(int i=0;i<m1;i++){
        x+=a[n][i]*b[i][m];
        }
        if(m==m2-1)cout<<x;
        else
          cout<<x<<" ";

        }
        if(n!=n1-1)
        cout<<endl;

    }
    return 0;
}

L1-049 天梯赛座位分配

开一个vector二维数组,模拟向里面填数

view code
#include <bits/stdc++.h>

using namespace std;

vector <int> a[105];
int b[105];
int vis[105];
int n;
int main()
{
    cin>>n;
    int tot=1;
    for(int i=1;i<=n;i++) cin>>b[i];
    int m=n;
    while(m>0){
    for(int i=1;i<=n;i++){
    if(vis[i]) continue;

    if(m==1){a[i].push_back(tot);tot+=2;}
    else{
    a[i].push_back(tot++);
    }
    if(a[i].size()==b[i]*10) {vis[i]=1; m--;}

    }
    }

    for(int j=1;j<=n;j++){
    int cnt=0;
    cout<<"#"<<j<<endl;
    for(int i:a[j]){
    cnt++;
    if(cnt==10)
    cout<<i<<"\n",cnt=0;
    else
    cout<<i<<" ";
    }
    }
    return 0;
}

L1-050 倒数第N个字符串

我怎么就想不到呢,长度为n的串,每一位是先b%n,b/=n;

view code
#include <bits/stdc++.h>

using namespace std;

void dfs(int a,int b){

    if(a>1) dfs(a-1,b/26);
    cout<<char('z'-(b%26));

}
int main()
{
    int n,l;
    cin>>n>>l;
    dfs(n,l-1);
    return 0;
}

L1-054 福到了

练习了下reverse(s.begin(),s.end())的使用,还有 replace(s.begin(),s.end(),"要替换的字符","替换成啥字符")

view code #include

using namespace std;

string s[105];

int main()
{
char o=getchar();
int n;cin>>n;

int mid=n/2+1;
if(n%2==0)mid=n/2;

int flag=0;
getchar();

for(int i=1;i<=n;i++){
 getline(cin,s[i]);
  if(i>mid){
    string res(s[i]);
    reverse(res.begin(),res.end());
    if(s[2*mid-i].compare(res)!=0){
          flag=1;
    }
  }

}
if(!flag)
cout<<"bu yong dao le\n";
for(int i=n;i>=0;i--){
reverse(s[i].begin(),s[i].end());
replace(s[i].begin(),s[i].end(),'@',o);
cout<<s[i];
if(i>0)
cout<<endl;
}
return 0;
}

posted @ 2020-11-22 12:03  大塞翁  阅读(300)  评论(0)    收藏  举报