首页 > 其他分享 >《看了受制了》第四十五天,5道题合计279道题

《看了受制了》第四十五天,5道题合计279道题

时间:2023-10-20 13:58:38浏览次数:27  
标签:四十五天 道题 val 10 int res ++ vec 279

2023年10月19日

Acwing1978 奶牛过马路

题目理解

这个题目和友好城市太像了,那个是排序一下求最长上升子序列,这个排序一下要达到:

  1. \(P_i\)前面的每一个数都要小于它
  2. \(P_i\)后面的每一个数都要大于它
    所以我们要在\(O(n)\)的复杂度内处理完需要,搞个前缀最大值和前缀最小值

代码实现

typedef pair<int, int> PII;

const int Mod = 1e9 + 7;
const int INF = 0x3f3f3f3f;

void solve()
{

    int n;
    cin >> n;
    vector<PII> v(n);

    for(int i = 0; i < n; i++)
        cin >> v[i].x >> v[i].y;

    sort(v.begin(), v.end());
    vector<int> p(n), q(n);
    int val = -INF;
    int res = 0;
    for(int i = 0; i < n; i++)
    {
        val = max(val, v[i].y);
        p[i] = val;
    }
    val = INF;
    for(int i = n - 1; i >= 0; i--)
    {
        val = min(val, v[i].y);
        q[i] = val;
    }


    for(int i = 0; i < n; i++)
        if(v[i].y < p[i] || v[i].y > q[i])
            res++;

    cout << n - res;

    return;
}

Acwing1969 品种临近

题目理解

这个题开数组记录一下,品种的下标做差即可。

代码实现

const int N = 1e6 + 10;
int pos[N];
void solve()
{

    int n, k;
    cin >> n >> k;
    int res = -INF;
    for(int i = 1; i <= n; i++)
    {
        int a;
        cin >> a;

        if(i - pos[a] <= k && pos[a] != 0)
            res = max(res, a);
        pos[a] = i;
    }
    if(res >= 0) cout << res << endl;
    else cout << -1 << endl;
    return;
}

Acwing1987 粉刷栅栏

题目理解

是一个离散化后差分的题。我们本题练习的是用map来实现离散化。

代码实现

const int N = 1e5 + 10;
int n;
map<int, int> mp;   // map有序的

int main()
{   
    cin >> n;
    int x = 0;
    for(int i = 1; i <= n; i++)
    {
        int k;
        string s;
        cin >> k >> s;
        if(s == "R")
        {
            mp[x]++;
            mp[x + k]--;
            x += k;
        }else{
            mp[x - k]++;
            mp[x]--;
            x -= k;
        }
    }


    int res = 0, sum = 0, last;

    for(auto& [x, v] : mp)
    {
        if(sum >= 2) res += x - last;   // 
        sum += v;   // 前缀和
        last = x;
    }

    cout << res;
    return 0;
}

Atcoder ABC324 D

题目大意

问一些数字全排列后组成的数字,可以组成几个完全平方数。

题目理解

我们正向枚举的话是\(13!\)这肯定爆了,但是我们可以枚举完全平方数,因为要平方,所以只能到\(1e^7\),完全ok。然后我们统计数字出现的次数是否满足就行了。

代码实现

vector<ll> vec;
int cnt[10];
int a[10];
bool check(ll u)
{
	memset(a, 0, sizeof a);
	while(u)
	{
		a[u % 10]++;
		u /= 10;
	}
	for(int i = 1; i <= 9; i++)
		if(a[i] != cnt[i])
			return false;

	return true;
}

int len(ll u)
{
	int cnt = 0;
	while(u) u /= 10, cnt++;
	return cnt;
}

void solve()
{
	int n;
	string s;
	cin >> n >> s;
	for(int i = 0; i < n; i++)
		cnt[s[i] - '0']++;

	int res = 0;
	for(int i = 0; i < (int)vec.size(); i++)
	{
		if(len(vec[i]) > n) break;
		if(check(vec[i]))
			res++;
	}

	cout << res;

	return;
}

Atcoder ABC324 E

题目大意

给了\(N\)个字符串,两两任意组合,可以选择相同的串组合。问组合的\(N^2\)中可能中,有多少可能,里面的子序列是包含T的。

题目理解

直接枚举肯定爆了。本题学到的知识是字符串子序列的匹配:

  • 如果想判断两个串的和\(s_i + s_j\)是否为\(t\)的子序列(不连续的)
  1. 从左往右匹配看能匹配多少个字符记为\(i\)
  2. 从右往左匹配看能匹配到多少个字符记为\(j\)
  3. 只要满足\(i + j >= len(s)\)那么说明肯定\(t\)中包含。
    我们有了上述的思想后,我们便可对于\(n\)个串得到\(a和b\)两个数组,分别代表上述的从左往右的数量和从右往左的数量。
    那么问题就转化成了:
  • 在\(a\)、\(b\)两个序列中有多少组\(a_i + b_j >= len(t)\)
    那么二分即可!也可以用那个low_bound,我记得之前那个墙的题做过。

代码实现

vector<ll> vec;
int cnt[10];
int a[10];
bool check(ll u)
{
	memset(a, 0, sizeof a);
	while(u)
	{
		a[u % 10]++;
		u /= 10;
	}
	for(int i = 1; i <= 9; i++)
		if(a[i] != cnt[i])
			return false;

	return true;
}

int len(ll u)
{
	int cnt = 0;
	while(u) u /= 10, cnt++;
	return cnt;
}

void solve()
{
	int n;
	string s;
	cin >> n >> s;
	for(int i = 0; i < n; i++)
		cnt[s[i] - '0']++;

	int res = 0;
	for(int i = 0; i < (int)vec.size(); i++)
	{
		if(len(vec[i]) > n) break;
		if(check(vec[i]))
			res++;
	}

	cout << res;

	return;
}

标签:四十五天,道题,val,10,int,res,++,vec,279
From: https://www.cnblogs.com/wxzcch/p/17776878.html

相关文章

  • 《看了受制了》第四十四天,5道题,合计274道题
    2023年10月20日Acwing3652最大连续子序列题目理解代码实现constintN=1e5+10;intw[N],f[N];voidsolve(){ intn; while(cin>>n) { intg,t=0,l=0,r=0; memset(f,0,sizeoff); for(inti=1;i<=n;i++) cin>>w[i]; intres......
  • 《看了受制了》第四十二天,11道题,合计261道题
    2023年10月15日今天是补题大作战!AcwingRound125A数量题目理解语法题代码实现voidsolve(){intcnt=0;intn;cin>>n;for(inti=1;i<=n;i++)if(i%2==0&&i%3!=0)cnt++;cout<<cnt;return;......
  • 《看了受制了》第四十二天,3道题,合计250道题
    2023年10月13日Acwing1049大盗阿福题目理解代码实现#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;intn;intf[N][2],w[N];voidsolve(){memset(f,0,sizeoff);cin>>n;for(inti=1;i<=n;i++)cin>&......
  • 《看了受制了》第四十天,16道题,合计240道题
    2023年10月11日大部分的DP背包模型在上一篇。回来后做了两个小小小小小的不能再小的题。Div.3Round867BKarinaandArray题目大意删去任意的值,最后让相邻的乘积最大。题目理解最小的相乘或最大的相乘代码实现voidsolve(){ intn; cin>>n; vector<ll>a(n); f......
  • 《看了受制了》第三十九天,14题,合计224道题
    2023年10月10日1.Acwing1015摘花生题目理解状态表示:f[i][j]表示,走到f[i][j]的方法的所有的集合。集合属性:最大值状态转移:f[i][j]+=max(f[i-1][j],f[i][j-1])(因为只能从上面和左面过来)代码实现//两种可能,从上面来和从左面来//集合表示是:走到i,j这个格子的集合......
  • 操作系统之存储容量问题的解决(其实这道题并不难哈)
    例题展示例题解决在正式进行该题目的解决之前,我们需要先了解到16进制的运算法则:16进制在运算过程中,从右到左依次进行运算,不够则借位,大于16则进位;而这道题的解决方法:......
  • Java流程控制10道题_上机
    Java流程控制10道题计算出1-100之间所有不能被3整除的整数的和大于(或等于)2000的数字。packageday01;publicclassLab01{publicstaticvoidmain(String[]args){//计算出1-100之间所有不能被3整除的整数的和大于(或等于)2000的数字。intsum......
  • poj2279
    Mr.Young'sPicturePermutationsTimeLimit:1000MS MemoryLimit:65536KTotalSubmissions:5841 Accepted:1860DescriptionMr.Youngwishestotakeapictureofhisclass.Thestudentswillstandinrowswitheachrownolongerthanth......
  • 《看了受制了》第三十四天,5道题,合计187道题
    2023年10月4日牛客国庆消消乐Day6CCombinationofPhysicsandMaths题目大意得到所有子矩阵的最大的可能。计算的方法是所有的和,再比上所选的值的最后一行的和。题目理解我们可以强行找到规律,比值大的加比值小的只会让比值减小,比值相同的加和比值不变。那么就可知道是单......
  • 《看了受制了》第三十三天,8道题,合计182道题
    2023年10月13日昨天出去玩了,没做题,真罪恶。哎Div.3Round883ARudolphandCuttheRope题目大意每个绳子有个钉子的高度和绳子的长度,糖果和每一个绳子的末尾相连,问我需要剪掉多少根绳子才能让糖果落地。题目理解其实就是统计a>b的个数即可代码实现voidsolve(){ ......