首页 > 其他分享 > 比赛总结:Japan Registry Services (JPRS) Programming Contest 2023 (AtCoder Beginner Contest 324)

比赛总结:Japan Registry Services (JPRS) Programming Contest 2023 (AtCoder Beginner Contest 324)

时间:2023-10-17 21:01:03浏览次数:38  
标签:AtCoder Beginner Contest int cin long ++ include size

比赛:Japan Registry Services (JPRS) Programming Contest 2023 (AtCoder Beginner Contest 324)

A-same

1.常规方法

int main()
{
	int n;
	cin >> n;
	vector<int> s(n);//利用vector容器可以不需要确定内存大小
	for (auto &n : s)
	{
		cin >> n;
	}
	for (int i = 0; i < n - 1; i++)
	{
		if (s[i] != s[i + 1])
		{
			cout << "No" << endl;
			return 0;//如果不相等就直接退出程序,否则输出"Yes"
		}
	}
	cout << "Yes" << endl;
	return 0;
}

总结:

1.对于这类数组大小动态变化的题目,利用vector容器,就可以动态的改变数组的大小,不需要去确定数组大小,比较方便

2.再main函数中去写,利用return 0;随时退出程序,结束循环。就不需要考虑利用其它变量,在循环结束后再去判断输出内容

3.利用auto &n : s;输入数据,简化代码量(auto缺点:必须遍历完整个容器,无法遍历到某一中间值然后就退出)

2.a faster way

int main()
{
	int n, s;
	cin >> n >> s;
	for (int i = 0; i < n - 1; i++)
	{
		int s2;
		cin >> s2;
		if (s2 != s)
		{
			cout << "No" << endl;
			return 0;
		}
	}
	cout << "Yes" << endl;
	return 0;
}

总结:

在输入时就做出判断。先输入第一个数,然后通过循环,在每次输入数据时就做出判断,就不需要遍历数组了

其余同常规方法

B - 3-smooth Numbers

1.数学基础

题目中对x,y的限制是整数,但由于给定的数字N>=1,所以并不需要考虑x,y<0,(即if (x<0||y<0);N<1;),proof is under:

1.if we assume that x<0 and y<0,then
0 < N = 2x*3y<1.
so x<0 and y<0 is not satisfied this condition.

2.if we assume that x>0 and y<0,then
N*2xϵ(2k,kϵZ);
3xϵ(2k+1,kϵZ)
it is obvious that equation is fause.in a similar way,if we assume y>0 and x<0,

the equation is fause still.

therefore we have shown if (x<0||y<0),N<1.

2.代码实现

void test01()
{
	long long N;//根据所给数据点,需要用long long 来储存
	cin >> N;
	while (N % 3 == 0)//如果是3的倍数,就除3
	{
		N /= 3;
	}
	while (N % 2 == 0)//同理
	{
		N /= 2;
	}
	if (N == 1)最后只有1和其他两种情况
	{
		cout << "Yes" << endl;
	}
	else
	{
		cout << "No" << endl;
	}
}

总结:利用while,避免了利用for循环的复杂

C - Error Correction

思路:根据题目的操作,可以用输入的string的长度将输入的字符串分为三类,根据三种情况分别进行讨论

void test01()
{
	long long n,time = 0,k[999999],q = 0;//注意数据范围
	cin >> n;
	string t,s;
	cin.get();//char ch = getchar();//前面接收了一个数字,缓冲区中还有一个空格,需要清除
	getline(cin, t);//利用getline(cin,变量名)去接收一个含有空格的字符串
	for (int i = 0; i < n; i++)
	{
		getline(cin, s);
		 //如果两string长度相等,那么有两种情况,相等和更改一个字符
		if (t.size() == s.size())
		{
			int a = 2;//利用a去判断有几个字符是不相等的
			for (int j = 0; j < t.size(); j++)
			{
		//根据题意,最多有一个字符不相等,所以当a==0时,即两个点不相等,就退出
				if (a == 0)
				{
					break;
				}
				if (t[j] != s[j])//不相等就a--
				{
					a--;
				}
				//当循环将要结束时,判断是否满足条件
				//为防止最后一位才不满足条件,所以要加上a>=1
				if (j == t.size() - 1&& a >= 1)
				{
					time++;//次数加1
					k[q] = i + 1;//将下标输入数组中
					q++;//数组位置后移
				}
			}
		}
		//如果t的长度大于s,那么只能是删除了一个字符
		else if(t.size()  == s.size()+1)
		{
			int l = 2;
			//用h,j分别控制t和s后移
			for (int j = 0,h = 0; j < t.size();h++, j++)
			{
				if (l == 0)
				{
					break;
				}
				if (t[j] != s[h])
				{
					l--;
       //如果到了不相同的那一位,就令s该位不动,j++,然后令s和t的下一位进行比较
					h--;
				}
				if (j == t.size() - 1 && l == 1)
				{
					time++;
					k[q] = i + 1;
					q++;
				}
			}
		}
        //这种情况同第二种
		else if (t.size() == s.size()-1)
		{
			int m = 2;
			for (int j = 0, h = 0; j < t.size(); h++, j++)
			{
				if (m == 0)
				{
					break;
				}
				if (t[j] != s[h])
				{
					m--;
					j--;
				}
				if (j == t.size() - 1 && m>= 1)
				{
					time++;
					k[q] = i + 1;
					q++;
				}
			}
		}
	}
    //正常输出
	cout << time << endl;
	for (int i = 0; i < q; i++)
	{
		cout << k[i] << ' ';
	}
}

D - Square Permutation

思路:题目中说明最终要得到的数是一个完全平方数,那就列举10000000以内的平方数,看他们是否可以由输入的四个数字经过全排列得到

#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstring>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <iomanip>
#include <ctype.h>
#include <ctime>
#include <stack>
#include <list>
#include <queue>
#include <algorithm>
using namespace std;

//n:输入的数字个数,bug:储存输入数字中含有数字1-9的个数,dig:储存完全平方数中含有数字1-9的个数,ans:结果
int n, dig[10], bug[10],ans;
string s;
int main()
{
	ios::sync_with_stdio(false);

	cin >> n >> s;//因为输入的各个数据是连续输入,所以用字符串进行储存
	for (int i = 0; i < n; i++)
	{
		bug[s[i]%48]++;//利用ASCII将每一个字符转化为数字
	}
    //因为数据上限是10的13次方,所以循环到10的7次就结束循环
	for (int i = 0; i < 10000000; i++)
	{
		memset(dig, 0, sizeof(dig));//初始化dig数组为0
//利用i*i构建完全平方数
//(1)因为数据上限超出int类型,所以用long long 去储存
//(2)为防止数据越界,所以先将i转化为long long 类型,然后再进行计算
//(3)注意要先将i转化为long long 类型,所以要用1ll*i*i,而不是i*i*1ll;
//第二种方式在计算i*i时就已经炸掉了,这时再去转化为long long 类型就已经没用了
		long long x = 1ll*i * i;
//下面去获取每一位数字
/*这里有一个细节,我默认的位数就是字符串的长度,所以当x的长度小于默认位数时,就会多记录0的个数,然而因为数字位数不相等时结论肯定不成立,所以该种情况并不需要特殊考虑*/
		for (int j = 0; j <n; j++)
		{
			dig[x % 10]++;
			x /= 10;
		}
		if (x)continue;//if(x!=0)也就是x不等于0,就不去进行下面的判断
		for (int k = 0; k < 10; k++)
		{
			if (dig[k] != bug[k])
			{
				ans--;//如果不满足,就ans--;使ans的值不被改变
				break;
			}
		}
		ans++;//如果上面的循环不退出循环,也就是相等,就对ans++
	}
	cout << ans << endl;
	return 0;
}

标签:AtCoder,Beginner,Contest,int,cin,long,++,include,size
From: https://www.cnblogs.com/csclixuan/p/17770648.html

相关文章

  • AtCoder Regular Contest 066 F Contest with Drinks Hard
    洛谷传送门AtCoder传送门下文令\(a\)为原题中的\(T\)。考虑若没有饮料,可以设\(f_i\)表示,考虑了前\(i\)道题,第\(i\)道题没做的最大得分。转移就枚举上一道没做的题\(j\),那么\([j+1,i-1]\)形成一个连续段。设\(b_i\)为\(a_i\)的前缀和,可得:\[f_i=\max\li......
  • [Leetcode Weekly Contest]367
    链接:LeetCode[Leetcode]2903.找出满足差值条件的下标I给你一个下标从0开始、长度为n的整数数组nums,以及整数indexDifference和整数valueDifference。你的任务是从范围[0,n-1]内找出2个满足下述所有条件的下标i和j:abs(i-j)>=indexDifference且a......
  • Atcoder Regular Contest 167
    卡B下大分了,怎么回事呢。A.ToastsforBreakfastParty发现题意是让方差尽可能小,就是让\(A\)里的值尽可能接近。所以从小到大排个序,把\(A_{N,\dots,N-M+1}\)依次放进\(1,2,\dots,M\),再把\(A_{N-M,\dots,1}\)依次放进\(M,M-1,\dots,2M-N+1\)就赢了。B.Productof......
  • AtCoder Beginner Contest 324
    在高铁上加训!A-Same(abc324A)题目大意给定\(n\)个数,问是否都相等。解题思路判断是不是全部数属于第一个数即可。或者直接拿set去重。神奇的代码#include<bits/stdc++.h>usingnamespacestd;usingLL=longlong;intmain(void){ios::sync_with_stdio(f......
  • 【题解】AtCoder-ARC167
    AtCoder-ARC167AToastsforBreakfastParty一定不会有空盘,问题转化成\(2m\)个数,其中\(2m-n\)个是\(0\),这样一定是最大值和最小值一起,次大值和次小值一起,以此类推。提交记录:Submission-AtCoderAtCoder-ARC167BProductofDivisors\(A^B=\prod_ip_i^{Bc_i}\),那么答案......
  • AtCoder Beginner Contest 180 F Unbranched
    洛谷传送门AtCoder传送门首先进行一个容斥,把连通块最大值\(=K\)变成\(\leK\)的方案数减去\(\leK-1\)的方案数。考虑dp,设\(f_{i,j}\)表示当前用了\(i\)个点,\(j\)条边。转移即枚举其中一个连通块的大小\(k\)。为了不算重,我们强制让这个连通块包含点\(1\),类......
  • AtCoder Beginner Contest 324
    D-SquarePermutation须知:最大的平方数的平方一定小于等于10n,平方数最多为10(n/2)(因为再大会越界)因为要求的数一定是原数的排列组合,所以它们的元素和对应的元素个数一定相同所以只要判断平方数的字符串是否与原字符串相等即可(这里可以利用排序判断)点击查看代码#include<bi......
  • AtCoder Beginner Contest 324 DF题题解
    比赛链接D-SquarePermutation其实比较简单,但是比赛时候脑子不转了,竟然在尝试枚举全排列,然后算了一下复杂度直接不会做了。正解应该是枚举完全平方数,底数枚举到\(sqrt(10^{14})\)即可,因为n最大为13。然后统计一下这个完全平方数各个数字出现了多少个,和读入的比较一下是......
  • Atcoder Beginner Contest 324 F Beautiful Path 题解-分数规划
    为了更好的阅读体验,请点击这里分数规划小技巧:尽可能将式子写成存在某种取值,使得不等式成立的形式。不然可能需要绕几个弯才能想出来。题目链接题目大意:给出一个DAG,每条边有一个\(b_i,c_i\),保证从编号小的边向编号大的边连边,且\(1\)到\(n\)必有路径,求\(1\)到\(n\)......
  • 2022 China Collegiate Programming Contest (CCPC) Guilin Site(持续更新)
    Preface由于还有两周就要滚去打区域赛了,这周开始周末每天都训一场吧这场总体来说打的还可以,虽然E题这个Easy从卡局卡到3h,但由于其它的题都是一遍过所以罚时还尚可跻进Au区后面一个小时看徐神和祁神苦战K大分类讨论,虽然场下感觉摸了一个B的做法出来,但感觉实现还是太麻烦了就没写......