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.&(与)
规则:全1则1,有0则0
例如:2 & 3 =
10
& 11
——
10
2.|(或)
规则:有1则1, 全0则0。
例:
2 | 3 =
10
| 11
——
11
3.^(异或)
规则:相同则0,不同则1(不会进位的加法)
例:
2^3 =
10
^11
——
01
4.~(取反)
规则:取反,1变0,0变1。
例:
~2 =
10
~
——
01
5. <<(左移) >> (右移)
<<
>>
低位舍去位,高位补位符号位(正数补0,负数补1)
6.优先级
1 | ~ |
2 | *,/,% |
3 | +,- |
4 | <<,>> |
5 | & |
6 | ^ |
7 | | |
8 | &=,^=.|=,<<=,>>= |
原码,反码,补码
原码
即二进制。
反码
正数
即反码。
负数
符号位不变,其余位按位取反(1变0,0变1).
补码
正数
即原码。
负数
即反码加1。
存储空间
排列组合difficult
排列
组合
树
树的遍历
如图,这是一棵二叉树
先根遍历:根左右
中根遍历:左根右
后根遍历:左右根
表达式:
例:
转后缀。
1.添括号
2.把符号移到后面,去括号。
复赛
#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;
}
#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;
}
}
#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;
}
#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;
}
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
int a, b;
cin >> a >> b;
cout << b << ' '<< a;
return 0;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}
#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;
}