Csp - J/S(X) 复习

Csp - J/S(X) 复习, 来了!!

如果你喜欢这篇文章,或有帮助倒您的话, 请帮助博主点个关注加个赞把(^_^) 

初赛 

进制:

十进制转n进制

整数部分

方法:短除法,除n去整,倒序存储,到0为止。

例如:

11转2进制:

11 / 2 = 5 ……1

5  / 2 = 2……1

2 / 2 = 1……0

1 / 2 = 0……1

倒序:1011

小数部分

方法:乘法, 乘n取整, 正序存储, 到1为止。

例如:

0.25转2进制

 0.25

*     2

————

 0.50  --->取0

*    2

————

 1.00 --->取1

n进制转10进制

方法:位权展开。

例子:

101.11转10进制

权:2 1 0  -1 -2

       1 0 1 . 1 1

1*2^{_{-2}}+1*2^{_{-1}}+1*2^0+0*2^1+1*2^2

位运算

全部在二进制下进行

1.&(与)

规则:全1则1,有0则0

例如:2 & 3 =  \left ( 10 \right )_{2} \doteq \left ( 2 \right )_{10}

               10

            & 11

            ——

               10

2.|(或)

规则:有1则1, 全0则0。

例:

2 | 3 = \left ( 11 \right )^{_{2}} = \left ( 3 \right )_{10}

  10

| 11

——

  11

3.^(异或)

规则:相同则0,不同则1(不会进位的加法)

例:

2^3 = \left ( 01 \right )_{2} = \left ( 1 \right )_{10}

  10

^11

——

 01

4.~(取反)

规则:取反,1变0,0变1。

例:

~2 = \left ( 01 \right )_{2} = \left ( 1 \right )_{10}

 10

~

——

  01

5. <<(左移) >> (右移)

<<

n<<1= n*2

a << b = a * 2^{b}

>>

n >> 1 = n / 2

低位舍去b位,高位补b位符号位(正数补0,负数补1)

6.优先级

1~~
2*,/,%
3+,-
4<<,>>
5&
6^
7|
8&=,^=.|=,<<=,>>=

原码,反码,补码

原码

即二进制。

反码

正数

即反码。

负数

符号位不变,其余位按位取反(1变0,0变1).

补码

正数

即原码。

负数

即反码加1。

存储空间

1TB = 1024GB

1GB = 1024MB

1MB=10245KB

1KB=1024B

1B = 8bit

排列组合difficult

排列                   

A_{n}^{m}=\frac{n!}{\left ( n-m \right )!}

组合

C_{n}^{m}=\frac{A_{n}^{m}}{m!}=\frac{n!}{m!\left ( n-m \right )!}                                                                                                     

树     

树的遍历

                                         

如图,这是一棵二叉树

先根遍历:根左右

ABDECF

中根遍历:左根右

DBEACF

后根遍历:左右根

DEBFCA

表达式:


例:

A*(B+C)/D转后缀。

1.添括号

((A*(B+C))/D)

2.把符号移到后面,去括号。

ABC+*D/

复赛

[CSP-J 2021] 分糖果 - 洛谷

#include <iostream>
#include <cstdio>

using namespace std;

int n, l, r;

int main()
{
	cin >> n >> l >> r;
	if(l / n == r / n) cout << r % n;
	else cout << n - 1;
	return 0;
}

[CSP-J2020] 优秀的拆分 - 洛谷

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	cin>>n;
	if(n%2)//无法整除。
	{
		cout<<"-1"<<endl;
		return 0;
	}
	else
	{
		int cnt;
		for(int i=1;;i++)
		{
			if((int)pow(2,i)>=n)//枚举最大次方。
			{
				cnt=i;
				break;
			}
		}
		for(int i=cnt;i>=1;i--)
		{
			if(n>=(int)pow(2,i))
			{
				cout<<(int)pow(2,i)<<" ";//能减就减。
				n-=(int)pow(2,i);
			}
		}
		return 0;
	}
}

[CSP-J2019] 数字游戏 - 洛谷

#include<bits/stdc++.h>
#define orz 0
#define inf 0x3f3f3f3f
using namespace std;

int n, ans;
char c;

int main()
{
    for(int i = 1; i <= 8; i ++)
    {
        scanf("%c", &c);
        n = (n << 1) + (c - '0');
    }
    while(n)
    {
        n &= n - 1;
        ans ++;
    }
    printf("%d", ans);
    return orz;
}

[CSP-J2019] 公交换乘 - 洛谷

#include <iostream>

using namespace std;
const int MAXN = 100005;
struct Ticket {
    //赠票的价格,最晚使用时间和是否需用过
    int price, time, used;
} q[MAXN];//赠票盒子
int head, tail, n, cost;

int main() {
    cin >> n;
    for (int i = 0; i < n; ++i) {
        int op, price, time;
        //输入每次坐车的种类,价格和发车时间
        cin >> op >> price >> time;
        if (op == 0) {
            //如果是坐地铁,直接把价格加到cost里面
            cost += price;
            //新一张赠票插入数组末尾,这张票的最晚使用时间是当前时间+45
            q[tail].time = time + 45;
            //赠票面额就是地铁票价
            q[tail++].price = price;
        } else {
            //先用一个循环把过期票扔掉
            while (head < tail && q[head].time < time) {
                head++;
            }
            bool found = false;//表示是否有合适的赠票,先假设没有
            for (int j = head; j < tail; ++j) {
                //循环所有剩余的票,这些一定都没过期,因为题目中时间是按顺序给我们的
                if (q[j].price >= price && q[j].used == 0) {
                    //如果价格合适,并且没用过,标记找到了,这张票标记用过
                    found = true;
                    q[j].used = 1;
                    break;
                }
            }
            //如果没找到合适的赠票,老老实实花钱买吧
            if (!found) cost += price;
        }
    }
    cout << cost << endl;
    return 0;
}

交换两数 - 题目详情 - whoj

#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;



int main()
{
	int a, b;
	cin >> a >> b;
	cout << b << ' '<< a;
	return 0;
}

最大值和最小值的差 - 题目详情 - whoj

#include <iostream>
#include <cstdio>

using namespace std;

int n;
int a[10010];

int main()
{
    cin >> n;
    int minn = 114514, maxn = -114514;
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i <= n; i++)
    {
        minn = min(minn, a[i]);
        maxn = max(maxn, a[i]);
    }
    cout << maxn - minn;
    return 0;
}

图像模糊处理 - 题目详情 - whoj

#include <iostream>
#include <cmath>

using namespace std;

double a[101][101],b[101][101];
int main(){
	int n, m;
	cin >> n >> m;
	for(int i = 1; i <= n; i++){
		for(int j = 1;j <= m; j++){
			cin >> a[i][j];
		}
	}
	for(int i = 1;i <= n; i++){
		for(int j = 1;j <= m; j++){
			if(i == 1 || j == 1 || i == n || j == m){  
				b[i][j] = a[i][j];  
			}
			else{
				b[i][j] = round((a[i - 1][j] + a[i + 1][j] + a[i][j - 1] + a[i][j + 1] + a[i][j]) / 5.0);
			}
		}
	}
	for(int i = 1; i <= n; i++){
		for(int j = 1;j <= m; j++){
			cout << b[i][j] << ' ';
		}
		cout << endl;
	}
	return 0;
}

最大公约数 - 题目详情 - whoj

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,b;
    int zui=0;
    cin>>a>>b;
    for(int i=1; i<=max(a,b); i++){
        if(a%i==0 && b%i==0){
            if(i>zui) zui=i;
        }
    }
    cout<<zui<<endl;
    return 0;
}

素数个数 - 题目详情 - whoj

#include <bits/stdc++.h>

using namespace std;
int n;

bool isprime(int n)
{
    for(int i = 2; i <= n - 1; i++)
    {
        if(n % i == 0) return false;
    }
    return true;
}
int main()
{
    int sum = 0;
    cin >> n;
    for(int i = 2; i <= n; i++)
    {
        if(isprime(i) == true) sum++;
    }
    cout << sum;
	return 0;
}

神奇的幻方 - 题目详情 - whoj

#include <iostream>
#include <cstdio>

using namespace std;

int a[40][40];
int n;

int main() {
	cin >> n;
	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			a[i][j] = 0;
	int x = 0, y = n / 2;
	a[x][y] = 1; 
	for (int d = 2; d <= n * n; d++) {
		int nx = (x + n - 1) % n;
		int ny = (y + 1) % n; 
		if (a[nx][ny] != 0) {
			nx = (x + 1) % n; 
			ny = y;
		}
		a[nx][ny] = d; 
		x = nx;
		y = ny;
	}
	for (int i = 0; i < n; i++) { 
		cout << a[i][0];
		for (int j = 1; j < n; j++)
			cout << " " << a[i][j];
		cout << endl;
	}
	return 0;
}

级数求和 - 题目详情 - whoj

#include <iostream>
#include <cstdio>

using namespace std;

int k;
double s;
int sum = 0;

int main()
{
    cin >> k;
    for(int i = 1; ; i++)
    {
        s = s + 1.000 / i;
        sum++;
        if(s > k) break;
    }
    cout << sum;
	return 0;
}

回文日期(date) - 题目详情 - whoj

#include <iostream>
#include <cstdio>

using namespace std;

int date1, date2;
int d[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

bool check(int date)
{
    int year = date / 10000;
    int month = date % 10000 / 100;
    int day = date % 100;

    if(month == 0 || month > 12) return false;
    if(day == 0 || month != 2 && day > d[month]) return false;

    if(month == 2 && day > 28 + (year % 100 && year % 4 == 0 || year % 400 == 0))return false;
    return true;
}

int main()
{
    cin >> date1 >> date2;

    int res = 0;

    for(int i = 1000; i < 10000; i++)
    {
        int date = i, x = i;
        for(int j = 0; j < 4; j++)
        {
            date = date * 10 + x % 10, x /= 10;
            if(date1 <= date && date <= date2 && check(date)) res++;
        }
    }
    cout << res << endl;
    return 0;
}

植树节(planting) - 题目详情 - whoj

#include <iostream>
#include <cstdio>

using namespace std;

const int N = 1E6 + 5;
int a[N], n, ai, bi, ans;
int d[N];
int main()
{
	ios::sync_with_stdio(0);
	cin >> n;
	for(int i = 0; i < n; i++)
	{
		cin >> ai >> bi;
		ai++; bi++;
		d[ai] += 1; d[bi + 1] -= 1;
	}
	for(int i = 1; i < N; i++)
		a[i] = a[i - 1] + d[i];
	for(int i = 1; i < N; i++)
		ans = max(ans, a[i]);
	cout << ans << endl;
	return 0;
}

差分(模板) - 题目详情 - whoj

#include<iostream>
using namespace std;
const int N = 1E5 + 5;
int n, a[N], d[N];
int m,a1,b1,t;
void handle(int l, int r)
{
    // for(int i = l; i <= r; i++)
    //     a[i] += t;
    d[l] += t;
    d[r + 1] -= t;
}
void show()
{
    for(int i = 1; i <= n; i++)
    {
        a[i] = a[i - 1] + d[i];
    }
    for(int i = 1; i <= n; i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;
}
int main()
{
    ios::sync_with_stdio(0);
    cin >> n >> m >> a1 >> b1;
    for(int i = 1; i <= n; i++)
    {
        cin>>a[i];
    }
    for(int i = 1; i <= n; i++)
    {
        d[i] = a[i] - a[i - 1];
    }
    for(int i = 1; i <= m; i++)
    {
        int l, r, op;
        cin >> l >> r >> op;
        t = a1;
        if(op == 0)t = -b1;
        handle(l, r);
    }
    show();
    return 0;
}

前缀和 - 题目详情 - whoj

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N],s[N];
int n,m,L,R;
int handle(){
	int sum=0;
	sum = s[R]-s[L-1];
	return sum;
}
void f(){
	ios::sync_with_stdio(0);
	cin>>n>>m;
	for(int i=1; i<=n; i++){
		cin>>a[i];
		s[i]=s[i-1]+a[i];
	}
	for(int i=1; i<=m; i++){
		cin>>L>>R;
		cout<<handle()<<endl;
	}
}

int main(){
	f();
	return 0;
}

校门外的树 - 题目详情 - whoj

#include<iostream>
using namespace std;
const int N=1e4+5;
int a[N]={0};
int main(){
	int l,m,u,v,sum=0;
	scanf("%d%d",&l,&m);
	for(int i=1; i<=m; i++){
		scanf("%d%d",&u,&v);
		for(int j=u; j<=v; j++){
			a[j]=1;
		}
	}
	for(int i=0; i<=l; i++){
		if(a[i]==0) sum++;
	}
	printf("%d",sum);
	return 0;
}

语文成绩 - 题目详情 - whoj

#include <iostream>
#include <cstdio>

using namespace std;

const int N = 5 * 1E6 + 1;
int a[N];
int d[N];
int n, m;
int x, y, z;
int main()
{
    ios::sync_with_stdio(0);
	scanf("%d%d", &n, &m);
	for(int i = 1; i <= n; i++) 
	{
		scanf("%d", &a[i]);
		d[i] = a[i] - a[i - 1];
	}
	for(int i = 1; i <= m; i++)
	{
		scanf("%d%d%d", &x,&y,&z);
		d[x] += z;
		d[y+1] -= z;
	}
	for(int i = 1; i <= n; i++) a[i] = a[i - 1] + d[i];
	int minn = N;
	for(int i = 1; i <= n; i++)	if(a[i] < minn) minn = a[i];
	printf("%d", minn);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值