IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> AtCoder Beginner Contest 254 A~E 题解 -> 正文阅读

[C++知识库]AtCoder Beginner Contest 254 A~E 题解

待更……

A - Last Two Digits

题目大意

给定正整数 N N N,求 N N N的后两位。
100 ≤ N ≤ 999 100\le N\le 999 100N999

输入格式

N N N

输出格式

输出 N N N的后两位,注意输出可能有前导0

样例

N N N输出
254 254 25454
101 101 10101

分析

题目已经规定 N N N是三位数,因此无需使用整数输入,直接将输入看成字符串,输出后两位即可。

代码

#include <cstdio>
using namespace std;

int main()
{
	getchar();
	putchar(getchar());
	putchar(getchar());
	return 0;
}

B - Practical Computing

题目大意

输出 N N N个整数序列 A 0 , … , A N ? 1 A_0,\dots,A_{N-1} A0?,,AN?1?。它们按如下定义:

  • A i A_i Ai?的长为 i + 1 i+1 i+1
  • A i A_i Ai?的第 j + 1 j+1 j+1个元素记为 a i , j a_{i,j} ai,j? 0 ≤ j ≤ i < N 0\le j\le i<N 0ji<N),即:
    • j = 0 j=0 j=0 j = i j=i j=i时, a i , j = 1 a_{i,j}=1 ai,j?=1
    • 否则, a i , j = a i ? 1 , j ? 1 + a i ? 1 , j a_{i,j}=a_{i-1,j-1}+a_{i-1,j} ai,j?=ai?1,j?1?+ai?1,j?

1 ≤ N ≤ 30 1\le N\le 30 1N30

输入格式

N N N

输出格式

输出 N N N行。第 i i i行上有 A i ? 1 A_{i-1} Ai?1?中的 i i i个数,用空格分隔。

样例

样例输入1

3

样例输出1

1
1 1
1 2 1

样例输入2

10

样例输出2

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1

分析

其实不用读题,看一眼样例,是不是很眼熟?没错,就是著名的杨辉三角
不知道也没关系(不过应该也没人不知道),直接按题目要求( i , j i,j i,j正序)依次计算即可。时间复杂度 O ( n 2 ) \mathcal O(n^2) O(n2),空间复杂度 O ( n ) \mathcal O(n) O(n) O ( n 2 ) \mathcal O(n^2) O(n2)。详见代码 1 , 2 1,2 1,2

继续考虑,杨辉三角中 a i , j = C j i a_{i,j}=C_j^i ai,j?=Cji?,所以可以用 O ( 1 ) \mathcal O(1) O(1)的空间计算,时间不变,代码待会补。

代码

  • 代码 1 1 1(普通方法+无优化+cin/cout 6 ms? 1656 KB 6\text{ms}~1656\text{KB} 6ms?1656KB
    时间: O ( n 2 ) \mathcal O(n^2) O(n2)
    空间: O ( n 2 ) \mathcal O(n^2) O(n2)
    难度:
    #include <iostream>
    using namespace std;
    
    int arr[35][35];
    
    int main()
    {
       int n;
       cin >> n;
       for (int i = 0; i < n; i++)
       {
           arr[i][0] = 1;
           arr[i][i] = 1;
       }
       for (int i = 2; i < n; i++)
       {
           for (int j = 1; j < i; j++)
           {
               arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
           }
       }
       for (int i = 0; i < n; i++)
       {
           for (int j = 0; j <= i; j++)
           {
               cout << arr[i][j] << " ";
           }
           cout << endl;
       }
       return 0;
    }
    
  • 代码 2 2 2(普通方法+滚动表+scanf/printf 6 ms? 1656 KB 6\text{ms}~1656\text{KB} 6ms?1656KB
    时间: O ( n 2 ) \mathcal O(n^2) O(n2)
    空间: O ( n ) \mathcal O(n) O(n)
    难度:中低
    #include <cstdio>
    using namespace std;
    
    int a[35];
    
    int main()
    {
       int n;
       scanf("%d", &n);
       a[0] = 1, puts("1");
       for(int i=1; i<n; i++)
       {
       	putchar('1');
       	for(int j=i-1; j>0; j--)
       		a[j] += a[j - 1];
       	for(int j=1; j<i; j++)
               printf(" %d", a[j]);
           a[i] = 1, puts(" 1");
       }
       return 0;
    }
    

C - K Swap

题目大意

输入格式

输出格式

样例

分析

代码

#include <cstdio>
#include <set>
#include <algorithm>
#define maxn 200005
using namespace std;

int a[maxn], b[maxn];

int main()
{
	int n, k;
	scanf("%d%d", &n, &k);
	for(int i=0; i<n; i++)
	{
		scanf("%d", a + i);
		b[i] = a[i];
	}
	sort(b, b + n);
	for(int i=0; i<k; i++)
	{
		multiset<int> s1, s2;
		for(int j=i; j<n; j+=k)
		{
			s1.insert(a[j]);
			s2.insert(b[j]);
		}
		if(s1 != s2)
		{
			puts("No");
			return 0;
		}
	}
	puts("Yes");
	return 0;
}

D - Together Square

题目大意

输入格式

输出格式

样例

分析

代码

#include <cstdio>
using namespace std;

inline int gcd(int a, int b)
{
	while(b ^= a ^= b ^= a %= b);
	return a;
}

int main()
{
	int n = 0; char c;
	while((c = getchar()) != '\n')
		n = (n << 3) + (n << 1) + (c ^ 48);
	int t = __builtin_sqrt(n);
	long long ans = 0LL, x;
	for(int i=1; i<=t; i++)
		for(int j=i; j<=t; j++)
			if(gcd(i, j) == 1)
			{
				ans += (x = n / (i > j? i * i: j * j));
				if(i != j) ans += x;
			}
	printf("%lld\n", ans);
	return 0;
}

E - Small d and k

题目大意

输入格式

输出格式

样例

分析

注意这题数据范围,这是解体的关键,只有 0 ≤ k ≤ 3 0\le k\le 3 0k3,且顶点度数 ? ≤ 3 ~\le3 ?3,因此根据乘法原理,一次查询最大符合条件的顶点数为 3 3 + 1 = 28 3^3+1=28 33+1=28个。因此,使用简单的暴力 BFS \text{BFS} BFS即可通过。详见代码。

代码

注意dis数组的清零操作,无需全部清零,只需把刚刚改过的清零即可。

#include <cstdio>
#include <queue>
#define maxn 150005
using namespace std;

vector<int> G[maxn];
int dis[maxn];

int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	while(m--)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		G[a].push_back(b);
		G[b].push_back(a);
	}
	int Q; scanf("%d", &Q);
	for(int i=1; i<=n; i++) dis[i] = -1;
	while(Q--)
	{
		int x, k;
		scanf("%d%d", &x, &k);
		vector<int> ans;
		queue<int> q;
		q.push(x);
		dis[x] = 0;
		while(!q.empty())
		{
			int v = q.front(); q.pop();
			int d = dis[v];
			if(d <= k) ans.push_back(v);
			if(++d > k) continue;
			for(int u: G[v])
				if(dis[u] == -1)
				{
					dis[u] = d;
					q.push(u);
				}
		}
		int res = 0;
		for(int v: ans)
			res += v, dis[v] = -1;
		printf("%d\n", res);
	}
	return 0;
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-06-06 17:10:30  更:2022-06-06 17:11:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 16:59:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码