『CCF题解』2013年12月【A】【B】【C】【D】

  1. 出现次数最多的数【基础】

    思路:sort一遍,从小到大记录出现次数最多的数。

    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1e3+10;
    int a[maxn];
    int main(void){
        int n;
        cin >> n;
        for(int i = 0; i < n; i++){
            cin >> a[i];
        }
        sort(a,a+n);
        int cnt = 1;
        int maxx = 0;
        int val = 0;
        for(int i = 0; i < n; i++){
            if(a[i]==a[i+1]) cnt++;
            else{
                if(cnt>maxx){
                    maxx = cnt;
                    val = a[i];
                }
                cnt = 1;
            }
        }
        cout<<val<<endl;
        return 0;
    } 
    
  2. ISBN号码【基础】

    思路:两种情况分类讨论即可。
    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    int main(void){
       string s;
       cin >> s;
       int len = s.size();
       int cnt = 1;
       int sum = 0;
       for(int i = 0; i < len-1; i++){
           if(isdigit(s[i])) sum += (s[i]-'0')*(cnt++);
       }
       if(sum%11==10){
           if(s[len-1]=='X') cout<<"Right"<<endl;
           else{
               s[len-1] = 'X';
               cout<<s<<endl;
           }
       }else{
           int last = s[len-1]-'0';
           if(sum%11==last) cout<<"Right"<<endl;
           else{
               s[len-1] = sum%11+'0';
               cout<<s<<endl;
           }
       }
       return 0;
    }
    
  3. 最大的矩形【暴力】

    思路:这是一道弱化版的题目,正解是单调栈,鉴于此数据较弱,暴力n^2即可。对于每个矩形,高是确定的,底的话可以延伸到高度小于它的地方为止。

    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn = 1e5 + 5;
    int a[maxn];
    int main(void) {
       int n;
       cin >> n;
       for(int i = 0; i < n; i++) cin >> a[i];
       int ans = 0;
       for(int i = 0; i < n; i++){
           int sum = 0;
           for(int j = i-1; j >= 0; j--){
               if(a[j]>=a[i]) sum += a[i];
               else break;
           }
           for(int j = i+1; j < n; j++){
               if(a[j]>=a[i]) sum += a[i];
               else break;
           }
           sum += a[i];
           ans = max(ans,sum);
       }
       cout<<ans<<endl;
       return 0;
    }
    
  4. 有趣的数

    思路:先只考虑0和1怎么放,当有a个0和b个1的时候,所有0在所有1的前面,又由于最高位不能是0,那么最高位只能是2。这样,就有a+b-1种情况(从1取到a+b-1)。假设有c个2和d 个3。一个2已经确定放在最高位了,那么现在就是c-1个2和d个3。那么把这些2和3插入已经摆好的a+b+1个数里面有多少可能呢?其实这就相当于c+d-1个相同的球(思考为什么是相同的而不是不同的)放到a+b+1个(最高位之前的位置不用放了)相同的盒子里,且允许空盒的情况,即C(a+b+1+c+d-1-1,c+d-1),然后2和3一共有c+d个,又有c+d-1种可能。

    所以最后总的可能数就是C(n-1,c+d-1)(c+d-1)(a+b-1),只需要从2到n-2遍历c+d再累加就行了

    AC代码:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn = 1020;
    const int mod = 1e9+7;
    int c[maxn][maxn];
    void Init(){
        for(int i = 0; i < maxn; i++){
            c[i][0] = 1;
            c[i][i] = 1;
        }
        for(int i = 1; i < maxn; i++){
            for(int j = 1; j < i; j++){
                c[i][j] = c[i-1][j-1]+c[i-1][j];
                c[i][j] %= mod;
            }
           
        }
    }
    int main(void) {
        Init();
        int n;
        cin >> n;
        ll ans = 0;
        for(int i = 2; i <= n-2; i++){
            ans = ans+c[n-1][i-1]*(i-1)*(n-i-1);
            ans %= mod;
        }
        cout<<ans<<endl;
        return 0;
    }
    
发布了9 篇原创文章 · 获赞 4 · 访问量 1574

猜你喜欢

转载自blog.csdn.net/wxd1233/article/details/105633120