1. 程式人生 > 實用技巧 >團隊設計天梯賽L1坑點題目總結

團隊設計天梯賽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;
}