第三届太原理工大学程序设计竞赛新生赛(未完结)

C.小迢的盒子

题目链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解法1:稍微快一点

#include <bits/stdc++.h>
using namespace std;
string out, s = "TYUTICPC";
int n, mid, len, cnt;
string f(int y, char c) {
    string full(mid, '*'), blank(mid, ' '), blank1(len - 2, ' '), ans;
    if (y == 0 && (c == 'T' || c == 'I' || c == 'C' || c == 'P') ||
        y == mid && c == 'P' ||
        y == len - 1 && (c == 'U' || c == 'I' || c == 'C'))
        return full + "*" + full;  //写一横

    if (y && (c == 'T' || c == 'I') || y >= mid && c == 'Y')
        return blank + "*" + blank;

    if (y && c == 'C' || c == 'P' && y > mid)
        return "*" + blank + blank;

    if (c == 'U' || c == 'P' && y < mid)
        return "*" + blank1 + "*";

    for (int i = 0; i < len; i++)
        ans += " *"[i == y || y == len - 1 - i];
    return ans;  //写Y的上半部分
}
int main() {
    while (cin >> n) {
        if (cnt++)
            cout << "\n";
        mid = n + 1, len = 3 + 2 * n;
        for (int i = 0; i < len; i++) {
            out = "";
            for (int j = 0; j < 8; j++)
                out += " |"[!j] + f(i, s[j]);
            cout << out << "\n";
        }
    }
}

解法二:稍微慢一点

#include <iostream>
using namespace std;
int n;
void print1() {
    cout << "|";
    for (int i = 1; i <= 2 * n + 3; i++)
        cout << '*';  //第一行的T的上面
    cout << " *";
    for (int i = 1; i <= 2 * n + 1; i++)
        cout << ' ';  //第一行的Y的上面
    cout << "* *";
    for (int i = 1; i <= 2 * n + 1; i++)
        cout << ' ';  //第一行的U的上面
    cout << "* ";
    for (int i = 1; i <= 2 * n + 3; i++)
        cout << '*';  //第一行的T的上面
    cout << ' ';
    for (int i = 1; i <= 2 * n + 3; i++)
        cout << '*';
    cout << ' ';
    for (int i = 1; i <= 2 * n + 3; i++)
        cout << '*';
    cout << ' ';
    for (int i = 1; i <= 2 * n + 3; i++)
        cout << '*';
    cout << ' ';
    for (int i = 1; i <= 2 * n + 3; i++)
        cout << '*';
    cout << "\n";
}
void print2() {
    for (int l = 1; l <= n; l++) {
        cout << '|';
        for (int i = 1; i <= n + 1; i++)
            cout << ' ';
        cout << '*';
        for (int i = 1; i <= n + 2 + l; i++)
            cout << ' ';
        cout << '*';
        for (int i = 1; i <= 1 + 2 * n - 2 * l; i++)
            cout << ' ';
        cout << '*';
        for (int i = 1; i <= l + 1; i++)
            cout << ' ';
        cout << '*';
        for (int i = 1; i <= 2 * n + 1; i++)
            cout << ' ';  // U的上面
        cout << "* ";
        for (int i = 1; i <= n + 1; i++)
            cout << ' ';
        cout << '*';
        for (int i = 1; i <= n + 2; i++)
            cout << ' ';
        for (int i = 1; i <= n + 1; i++)
            cout << ' ';
        cout << '*';
        for (int i = 1; i <= n + 2; i++)
            cout << ' ';
        cout << '*';
        for (int i = 1; i <= 2 * n + 3; i++)
            cout << ' ';
        cout << '*';
        for (int i = 1; i <= 2 * n + 1; i++)
            cout << ' ';
        cout << "* *";
        for (int i = 1; i <= 2 * n + 2; i++)
            cout << ' ';
        cout << '\n';
    }
}
void print3() {
    cout << '|';
    for (int i = 1; i <= n + 1; i++)
        cout << ' ';
    cout << '*';
    for (int i = 1; i <= 3 + n * 2; i++)
        cout << ' ';
    cout << '*';
    for (int i = 1; i <= n + 2; i++)
        cout << ' ';
    cout << '*';
    for (int i = 1; i <= 1 + n * 2; i++)
        cout << ' ';
    cout << '*';
    for (int i = 1; i <= 2 + n; i++)
        cout << ' ';
    cout << '*';
    for (int i = 1; i <= 3 + n * 2; i++)
        cout << ' ';
    cout << '*';
    for (int i = 1; i <= n + 2; i++)
        cout << ' ';
    cout << '*';
    for (int i = 1; i <= 3 + n * 2; i++)
        cout << ' ';
    for (int i = 1; i <= 3 + n * 2; i++)
        cout << '*';
    cout << " *";
    for (int i = 1; i <= 2 + n * 2; i++)
        cout << ' ';
    cout << '\n';
}
void print4() {
    for (int l = 1; l <= n; l++) {
        putchar('|');
        for (int i = 1; i <= n + 1; i++)
            putchar(' ');
        putchar('*');
        for (int i = 1; i <= 3 + n * 2; i++)
            putchar(' ');
        putchar('*');
        for (int i = 1; i <= n + 2; i++)
            putchar(' ');
        putchar('*');
        for (int i = 1; i <= 1 + n * 2; i++)
            putchar(' ');
        putchar('*');
        for (int i = 1; i <= 2 + n; i++)
            putchar(' ');
        putchar('*');
        for (int i = 1; i <= 3 + n * 2; i++)
            putchar(' ');
        putchar('*');
        for (int i = 1; i <= n + 2; i++)
            putchar(' ');
        putchar('*');
        for (int i = 1; i <= 3 + n * 2; i++)
            putchar(' ');
        putchar('*');
        for (int i = 1; i <= 3 + n * 2; i++)
            putchar(' ');
        putchar('*');
        for (int i = 1; i <= 2 + n * 2; i++)
            putchar(' ');
        putchar('\n');
    }
}
void print5() {
    putchar('|');
    for (int i = 1; i <= n + 1; i++)
        putchar(' ');
    putchar('*');
    for (int i = 1; i <= 3 + n * 2; i++)
        putchar(' ');
    putchar('*');
    for (int i = 1; i <= n + 2; i++)
        putchar(' ');
    for (int i = 1; i <= 3 + n * 2; i++)
        putchar('*');
    for (int i = 1; i <= n + 2; i++)
        putchar(' ');
    putchar('*');
    for (int i = 1; i <= n + 2; i++)
        putchar(' ');
    for (int i = 1; i <= 3 + n * 2; i++)
        putchar('*');
    putchar(' ');
    for (int i = 1; i <= 3 + n * 2; i++)
        putchar('*');
    printf(" *");
    for (int i = 1; i <= 3 + n * 2; i++)
        putchar(' ');
    for (int i = 1; i <= 3 + n * 2; i++)
        putchar('*');
    printf("\n\n");
}
int main() {
    while (cin >> n) {
        print1(), print2(), print3(), print4(), print5();
    }
    return 0;
}

题解:找到规律暴力输出就行……

K.库特莉亚夫卡的排序

题目链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <bits/stdc++.h>
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <bitset>
#include <stack>
#include <set>
#include <map>
#include <random>
using namespace std;
typedef long long ll;
//typedef pair<ll,int> P;
const int INF=0x3f3f3f3f;
const ll mod=1e9+7;
template<class A>void read(A&a){
    a=0;int c=getchar(),f=0;
    for(;!isdigit(c);c=getchar()) f|=c=='-';
    for(;isdigit(c);c=getchar()) a=a*10+(c^48);
    if(f) a=-a;
}
template<class A,class ...B>
void read(A&a,B&...b){read(a);read(b...);}
//read(x,y,z);
template<class T>
inline void print(T x)
{
    if(x<0) x=~x+1,putchar('-');
    if(x>9) print(x/10);
    putchar(x%10+'0');
}

const int N=100000+10;
int n,m;
int a[N],f[N];
vector<int> vec[N];
int id[N];
int getf(int x)
{
    if(f[x]==x) return x;
    else return f[x]=getf(f[x]);
}

void unio(int x,int y)
{
    int fx=getf(x),fy=getf(y);
    if(fx==fy) return ;
    f[fx]=fy;
}

int main()
{
    read(n,m);
    for(int i=1;i<=n;i++) read(a[i]),f[i]=i;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        read(x,y);
        unio(x,y);
    }

    for(int i=1;i<=n;i++)
    {
        id[i]=getf(i);
        vec[id[i]].push_back(a[i]);
    }
    for(int i=1;i<=n;i++)
    {
        if(vec[i].size()) sort(vec[i].begin(),vec[i].end());
    }

    for(int i=n;i>=1;i--)
    {
        a[i]=*vec[id[i]].rbegin();
        vec[id[i]].pop_back();
    }
    int f=0;
    for(int i=2;i<=n;i++)
    {
        if(a[i]>=a[i-1]) ;
        else {f=1;break;}
    }
    if(f) printf("No\n");
    else printf("Yes\n");
}

题解:好像是用了并查集吧,没仔细看过

L.密码

题目链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

const int mod=1e9+7;
int get(int n)
{
	int i,s=0;
	for(i=n/4*4;i<=n;i++)s^=i;
	return s;
}
int main()
{
    int n,l,r,ans=0;
    scanf("%d",&n);
    while(n--)
    {
    	scanf("%d%d",&l,&r);
    	ans=(ans+(get(l-1)^get(r)))%mod;
	}
	printf("%d\n",ans);
	return 0;
}

题解:区间异或和的规律就是每4个数(从0开始的连续4个数)异或和为0,于是我们只要求最后面几个数的异或和就行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值