第十一届蓝桥杯大赛软件类省赛第二场

A. 门牌制作

624

B. 既约分数

2481215

C. 蛇形填数

761

D.跑步锻炼

8879

E.七段码

80

F. 成绩统计

#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
    int n;
    cin>>n;
    int good = 0;
    int ave = 0;
    for(int i = 0 ; i < n ; i ++){
        int x;
        cin>>x;
        if(x >= 85){
            ave ++;
            good ++;
        }else if(x>=60){
            ave ++;
        }
    }
    printf("%.0f%%\n%.0f%%\n",(ave*100.0)/n,(good*100.0)/n);
    return 0;
}
G. 回文日期

#include <bits/stdc++.h>
#define int long long
using namespace std;
int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31};

int check(int y,int m){ // leap year
    return m == 2 && (y%400 == 0|| (y%4 == 0 && y%100 != 0));
}

signed main()
{

    int n;
    cin>>n;
    int y = n/10000;
    int m = (n/10000)/100;
    int d = n%100;
    string res1 = "";
    string res2 = "";
    int flag1 = 0;
    int flag2 = 0;
    /**
    y0 y1 y2 y3 m0 m1 d0 d1
    **/
    for( ; y <= 9999 ; y ++){
        for( ; m <= 12; m ++){
            for( ; d <= days[m]+check(y,m); d ++){
                int y0 = y/1000;
                int y1 = (y%1000)/100;
                int y2 = (y%100)/10;
                int y3 = y%10;
                int m0 = m/10;
                int m1 = m%10;
                int d0 = d/10;
                int d1 = d%10;
                if(y0 == d1
                && y1 == d0
                && y2 == m1
                && y3 == m0){
                    flag1 = 1;
                    res1 += (y0+'0');
                    res1 += (y1+'0');
                    res1 += (y2+'0');
                    res1 += (y3+'0');
                    res1 += (m0+'0');
                    res1 += (m1+'0');
                    res1 += (d0+'0');
                    res1 += (d1+'0');
                }
            }
            if(flag1) break;
            d = 1;
        }
        if(flag1) break;
        m = 1;
    }
    y = n/10000;
    m = (n/10000)/100;
    d = n%100;
    for( ; y <= 9999 ; y ++){
        for( ; m <= 12; m ++){
            for( ; d <= days[m]+check(y,m); d ++){
                int y0 = y/1000;
                int y1 = (y%1000)/100;
                int y2 = (y%100)/10;
                int y3 = y%10;
                int m0 = m/10;
                int m1 = m%10;
                int d0 = d/10;
                int d1 = d%10;
                if(y0 == d1
                && y1 == d0
                && y2 == m1
                && y3 == m0
                && y0 == y2
                && y2 == m1
                && m1 == d1
                && y1 == y3
                && y3 == m0
                && m0 == d0
                && y0 != y1){
                    flag2 = 1;
                    res2 += (y0+'0');
                    res2 += (y1+'0');
                    res2 += (y2+'0');
                    res2 += (y3+'0');
                    res2 += (m0+'0');
                    res2 += (m1+'0');
                    res2 += (d0+'0');
                    res2 += (d1+'0');
                }
            }
            if(flag2) break;
            d = 1;
        }
        if(flag2) break;
        m = 1;
    }
    cout<<res1<<endl;
    cout<<res2<<endl;
    return 0;
}

H.子串分值和

#include <bits/stdc++.h>
#define int long long
const int N = 1e6+7;
using namespace std;
string s;
int dp[N];
int pos[30];

signed main()
{
    cin>>s;
    for(int i = 0 ; i < 30 ; i ++){
        pos[i] = -1;
    }
    dp[0] = 1;
    pos[s[0]-'a'] = 0;
    for(int i = 1 ; i < s.size() ; i ++){
        dp[i] = dp[i-1]+i-pos[s[i]-'a'];
        pos[s[i]-'a'] = i;
        //cout<<dp[i]<<endl;
    }
    int res =0;
    for(int i = 0 ; i < s.size() ; i ++)
        res += dp[i];
    cout<<res<<endl;

    return 0;
}
I.平面切分

#include<bits/stdc++.h>
using namespace std;
const int N = 1005;

int main()
{
    int n;
    scanf("%d", &n);
    int a, b;
    long double A[N], B[N];
    pair<long double, long double> p; 
    set<pair<long double, long double> > s; 
    for(int i = 0; i < n; i++)
    {
        scanf("%d %d", &a, &b);
        p.first = a;
        p.second = b;
        s.insert(p);
    }
    int i = 0;   
    for(set<pair<long double, long double> >::iterator it = s.begin(); it != s.end(); it++, i++)
    {
        A[i] = it -> first;
        B[i] = it -> second;
    }
    long long ans = 2;   
    for(int i = 1; i < s.size(); i++)  
    {
        set<pair<long double, long double> > pos;   
        for(int j = i-1; j >= 0; j--)
        {
            int a1 = A[i], b1 = B[i];
            int a2 = A[j], b2 = B[j];
            if(a1 == a2)  
                continue; 
            p.first = 1.0*(b2-b1)/(a1-a2);
            p.second = 1.0*a1*((b2-b1)/(a1-a2)) + b1;
            pos.insert(p); 
        }
        ans += pos.size() + 1;  
    } 
    printf("%d\n", ans);
    return 0;
}

J.字串排序


#include <bits/stdc++.h>
#include <queue>
using namespace std;
const int N = 120;
char ans[1000];
int bit[N];
int n;
int flag;
int len;

int lowbit(int x){
    return x&(-x);
}
int add(int x,int val){
    while(x<N){
        bit[x] += val;
        x += lowbit(x);
    }
}
int sum(int x){
    int res = 0;
    while(x){
        res += bit[x];
        x -= lowbit(x);
    }
    return res;
}

void dfs(int pos,char par){
    if(flag) return;
    if(pos == len){
        int tmp = 0;
        ans[len] = 0;
        //cout<<ans<<endl;
        for(int i = 0 ; i < len ; i ++){
            tmp += i-sum(ans[i]-'a'+1);
            add(ans[i]-'a'+1,1);
        }
        for(int i = 0 ; i < len ; i ++){
            add(ans[i]-'a'+1,-1);
        }
        if(tmp == n){
            flag = 1;
        }
        return;
    }
    for(char now = par; now >= 'a' ; now --){
        ans[pos] = now;
        dfs(pos+1,now);
        if(flag) return;
    }
}

int main(){
    n = 1;
    while(n <= 1000){
        flag = 0;
        for(len = 2; ; len ++){ // 枚举字符串长度
            for(char i = 'b';i <= 'a'+len-1;i ++){
                dfs(0,i);
                if(flag){
                    cout<<n<<": "<<ans<<endl;
                    break;
                }
            }
            if(flag) break;
        }
        n++;
    }
}


 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值