iwtgm-7

题目链接

N.

因为输入只有两个字母,结果最多只有两位数,可以直接写答案

void solve(){
    char x,y;cin>>x>>y;
    int xx=x-'A',yy=y-'A';
    int ans=xx+yy;
    if(ans<26)cout<<(char)('A'+ans);
    else {
        ans-=26;
        cout<<'B'<<(char)('A'+ans);
    }
}

再写了一个可以处理更多字母的:
相当于10进制和26进制的转换,把输出转成字母就好了

int to10(string s){
    int ans=0;
    for(int i=s.size()-1;i>=0;i--){
        ans*=26;
        ans+=(s[i]-'A');
    }
    return ans;
}
string toc(int x){
    stack<char>st;
    if(x==0){
        return "A";
    }
    while(x) {
        st.push((char) ('A' + (x % 26)));
        x/=26;
    }
    string ans="";
    while(st.size()){
        ans.push_back(st.top());st.pop();
    }
    return ans;
}
void solve()
{
    string a,b;cin>>a>>b;
    int aa=to10(a),bb=to10(b);
    int c=aa+bb;
    cout<<toc(c);
}

C.

因为结果要求排列升序或降序,操作是反转
但是如果不是连续的序列(1,2,3是连续的,1,3,4不是因为1和3相差2)即使反转也没有用
所以遍历,如果不是连续的(后一个数比前一个数大1或小1),就一定要花费1次操作

int a[N];
void solve(){
    int n;cin>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    int ans=0;
    for(int i=2;i<=n;i++){
        if(a[i]==a[i-1]-1||a[i]==a[i-1]+1)continue;
        else ans++;
    }
    cout<<ans;
}

K.

自己写的是组合数

ll sq[25];
ll n;
ll C(ll x){
    if(x==n)return 1;
    ll tmp=n-x;
    x=min(tmp,x);
    return (sq[n]/sq[n-x]/sq[x]);
}
void solve(){
    sq[0]=1;
    for(ll i=1;i<=20;i++)sq[i]=sq[i-1]*i;
    cin>>n;
    ll ans=0;
    for(ll i=1;i<=n;i++){
        ans+=C(i);
    }
    cout<<ans;
}

谁成想,pow(2,a)-1一个式子就够了,有被气炸
每道题都有选或不选两种情况就是2^a,减去全都不选这一不合法的情况即为答案

void solve(){
    int a;cin>>a;
    ll ans=pow(2,a)-1;
    cout<<ans<<endl;
}
posted @ 2023-11-02 13:23  WW爆米花  阅读(3)  评论(0编辑  收藏  举报