首页 > 其他分享 >AtCoder Beginner Contest 331

AtCoder Beginner Contest 331

时间:2023-12-03 23:14:24浏览次数:43  
标签:AtCoder Beginner int 331 cin long ans tie define




B - Buy One Carton of Milk

难度: ⭐

题目大意

选择有三种套餐, 6个鸡蛋S元, 8个鸡蛋M元, 12个鸡蛋L元; 问如果要买至少N个鸡蛋, 最少花费多少钱;

解题思路

一道入门级dp;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e6 + 10, mod = 998244353;
typedef pair<int, int> PII;
int n, m, res;
int dp[N];
int p[] = {6, 8, 12};
signed main() {
    int a, b, c;
    memset(dp, 0x3f, sizeof dp);
    cin >> n >> a >> b >> c;
    int f[] = {a, b, c};
    dp[0] = 0;
    for(int i = 1; i <= n + 12; i++){
        for(int j = 0; j < 3; j++){
            dp[i] = min(dp[i], dp[i - p[j]] + f[j]);
        }
    }
    res = dp[n];
    for(int i = n + 1; i < n + 12; i++){
        res = min(res, dp[i]);
    }
    cout << res;
    return 0;
}




C - Sum of Numbers Greater Than Me

难度: ⭐

题目大意

给定一个长度为n的序列A; 对于每一个i, 输出这个序列中所以大于Ai的数的和;

解题思路

先将序列从小到大排序, 对于每个i, 利用二分加前缀和来求解;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e6 + 10, mod = 998244353;
typedef pair<int, int> PII;
int n, m, res;
int p[N], f[N], sum[N];
signed main() {
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> p[i];
        f[i] = p[i];
    }
    sort(f + 1, f + 1 + n);
    for(int i = 1; i <= n; i++){
        sum[i] = sum[i - 1] + f[i];
    }
    for(int i = 1; i <= n; i++){
        int pos = upper_bound(f + 1, f + 1 + n, p[i]) - f;
        cout << sum[n] - sum[pos - 1] << ' ';
    }
    return 0;
}




D - Tile Pattern

难度: ⭐⭐⭐

题目大意

给定一个n * n的字符串矩阵G, G由'W''B'组成, 'W'说明该坐标为白色, 'B'为黑色; 现在有q个询问, 每个询问给出一个矩形的左上角坐标和右下角坐标; 注意坐标(i, j)表示矩阵中的第i + 1行和第j + 1列; 对于这个矩形中的格子(i, j), 它的颜色对应G[i % n][j % n]; 请问这个矩形中黑色块的数量是多少;

解题思路

注意题面坐标的定义方式, 因为这里是把一个格子看作一个坐标, 而不是把点看作坐标; 我们先用二维前缀和预处理一下黑色块的数量; 由题意得, 该二维平面其实就是由无数个矩阵G拼接而来; 对于给定的矩形A, 我们可以先把它扩充为由若干个完整的G组成的矩形; 求出这个大矩形的黑色块的数量后再减去四周扩充的部分的黑色块即可;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e3 + 10, mod = 998244353;
typedef pair<int, int> PII;
int n, m, res;
char g[N][N];
int p[N][N];
signed main() {
    int n, q;
	cin >> n >> q;
	for(int i = 1; i <= n; i++) {
		for(int j = 1; j <= n; j++) {
            cin >> g[i][j];
			if(g[i][j] == 'B') {
				p[i][j] = 1;
			}
            p[i][j] += p[i - 1][j] + p[i][j - 1] - p[i - 1][j - 1];
		}
	}
	while(q--) {
		int a, b, c, d;
		cin >> a >> b >> c >> d;
		int w = d - b + 1, h = c - a + 1;

		a %= n, b %= n, c %= n, d %= n;
		a++, b++, c++, d++;

		int ans = 0; // ans指扩充出来的黑色块的数量
        //扩充矩形
		if(a > 1) h += a - 1;
		if(c < n) h += n - c;
		if(b > 1) w += b - 1;
		if(d < n) w += n - d;
        //四周扩充的不完整的矩形G的黑色块
		ans += p[a - 1][n] * (w / n);
		ans += (p[n][n] - p[c][n]) * (w / n);
		ans += p[n][b - 1] * (h / n);
		ans += (p[n][n] - p[n][d]) * (h / n);
		//扩充出来的行和列会有重合部分需要减去
		ans -= p[a - 1][b - 1];							
		ans -= p[n][b - 1] - p[c][b - 1];				
		ans -= p[a - 1][n] - p[a - 1][d];				
		ans -= p[n][n] + p[c][d] - p[c][n] - p[n][d];	
        //用总的减去扩充的
		ans = p[n][n] * (h / n) * (w / n) - ans;		
		cout << ans << '\n';
    }
    return 0;
}




E - Set Meal

难度: ⭐⭐⭐

题目大意

现在有n种主食和m种副食; 现在需要把一种主食和一种副食组合为套餐, 该套餐的价格就是两种食品价格的和; 但是有L种组合方式是不合适的; 请问剩下的n * m - L种套餐中价格最高的是多少;

解题思路

本题可以很暴力的用二重循环加剪枝来做; 我们把两种食物都按价格从大到小排序, 对于每一种主食i, 只要遇到第一个合法的j就可以退出这层循环了; 看似最坏是O(n * m)的复杂度, 但真正的复杂度其实是是O(n + L), 因为第二层循环进行的条件就是一直都是L中的组合; 但是由于二重循环得到的所以组合都不相同, 所以所以的第二层循环次数累加起来最多就是L种;

神秘代码

#include<bits/stdc++.h>
#define int long long
#define IOS ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
using namespace std;
const int N = 1e5 + 10, mod = 998244353;
typedef pair<int, int> PII;
int n, m, k;
PII ma[N], sd[N];
map<PII, int> mp;
bool cmp(PII a, PII b){
	return a.first > b.first;
}
signed main() {
	IOS;
    cin >> n >> m >> k;
	for(int i = 1; i <= n; i++) {
		cin >> ma[i].first;
		ma[i].second = i;
	}
	for(int i = 1; i <= m; i++) {
		cin >> sd[i].first;
		sd[i].second = i;
	}
	sort(ma + 1, ma + 1 + n, cmp);
	sort(sd + 1, sd + 1 + n, cmp);
	for(int i = 1; i <= k; i++){
		int a, b;
		cin >> a >> b;
		mp[{a, b}] = 1;
	}
	int res = 0;
	for(int i = 1; i <= n; i++){
		for(int j = 1; j <= m; j++){
			if(mp[{ma[i].second, sd[j].second}]) continue;
			else{
				res = max(res, ma[i].first + sd[j].first);
				break;
			}
		}
	}
	cout << res;
    return 0;
}




F - Palindrome Query

难度: ⭐⭐⭐⭐⭐

标签:AtCoder,Beginner,int,331,cin,long,ans,tie,define
From: https://www.cnblogs.com/mostimali/p/17874000.html

相关文章

  • AtCoder Beginner Contest 295
    B-Bombs题意:就是说有一种炸弹,能炸曼哈顿距离的障碍物,要你打印出炸完后的图模拟#include<bits/stdc++.h>usingnamespacestd;charmp[50][50];voidsolve(){ intn,m; cin>>n>>m; for(inti=1;i<=n;i++){ for(intj=1;j<=m;j++){ cin>>mp[i][j]; } } for......
  • ABC331G题解
    ABC331G日常被bot吊打罢了。首先注意到一件事是你需要求一堆max的期望对吧。所以其实上来就应该试试上min-max容斥的。但是鉴于我没有脑子,所以其实没想到也可以理解。先来复习一下式子:\[Emax(S)=\sum_{T\subsetS}Emin(T)(-1)^{\midT\mid-1}\]所以带入要求的东西......
  • AtCoder Beginner Contest 326
    B-326-likeNumbers题意:找到一个不小于n的数是326数,定义是思路:简单的模拟循环即可#include<bits/stdc++.h>usingnamespacestd;boolcheck(intx){ vector<int>a; while(x){ a.push_back(x%10); x/=10; } if(a[1]*a[2]==a[0])returntrue; elsereturnfalse;}......
  • ABC 331 F - Palindrome Query(字符串哈希,树状数组)
    字符串哈希[OI-Wiki](字符串哈希-OIWiki(oi-wiki.org))分为两种哈希方式:以左为高位和以右为高位如果只是快速查询每个字串的哈希值,用以左为高位比较简单,即\[Hash[l...r]=Hash[1...r]-Hash[1...(l-1)]\timesbase^{r-l+1}\]但是如果有修改操作,需要将每一位的Hash值存......
  • AtCoder_abc326
    T12UP3DOWN简单的if判断,做题一分钟,翻译十分钟。。。代码:#include<bits/stdc++.h>usingnamespacestd;intmain(){ intx,y;cin>>x>>y; if((x<=y&&y-x<=2)||(x>y&&x-y<=3)) cout<<"Yes"; elsecout<<"No&......
  • AtCoder_abc327
    T1ab循环从s[0]到s[n-2]判断有无ab相邻T2A^A两层循环枚举就可以了由于aa会增长的很快,所以当a=16时aa就已经大于$10^{18}$了,一定不会T就这么点数打表也能过T3NumberPlace就是数独的判断规则,h,l,g三个数组存储已有的数就好宫的判断我用了一个三维数组前两个维度表示宫的......
  • AtCoder_abc329
    AtCoder_abc329比赛链接A-SpreadA题链接题目大意输入一个字符串由大写字母组成的$S$,输出$S$并在每一个字符之间加上空格解题思路随便打打就能过.jpg代码//Problem:A-Spread//Contest:AtCoder-SkyInc,ProgrammingContest2023(AtCoderBeginnerContest329)//......
  • AtCoder_abc330
    AtCoder_abc330比赛链接A-CountingPassesA题链接题目大意给出$N$个数$a_1,a_2,a_3\cdots,a_N$,和一个正整数$L$。输出有几个$a_i\leL$.解题思路O(n)遍历一遍就好了代码//Problem:A-CountingPasses//Contest:AtCoder-TOYOTASYSTEMSProgrammingContest20......
  • AtCoder_abc331
    AtCoder_abc331(这次题真的真的真的好难)比赛链接A-Tomorrow题目链接题目大意有一个$M$个月,$D$天的日历,请输出$y年m月z日$的下一天。解题思路先让天数加一,如果超过了$D$就让月份加一,天数减$D$,然后月份同理代码//Problem:A-Tomorrow//Contest:AtCoder-DaiwaSec......
  • ALGO ARTIS Programming Contest 2023 Autumn(AtCoder Regular Contest 168)
    Preface先补一下这场ARC的博客,因为在来回合肥的路上一直在想这场的CD,所以有空后就先把这场补了A-<Inversion>不难发现对于一段连续的<,设其长度为\(x\),则它最少要贡献\(\frac{x(x+1)}{2}\)的答案而我们很容易构造一种方案刚好满足这个下界,只要让每段的结束比下一段的开头大......