个人赛3补题

2023-11-01 19:30
文章标签 补题 个人赛

本文主要是介绍个人赛3补题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

个人赛3补题

题A Caisa and Sugar

所以one type指的是只能买一种糖果,且只能买一个orz

#include <iostream>
#include <stdio.h>
//#include <windows.h>
using std::max;
const int MAXN = 105;
int d[MAXN], c[MAXN], cost[MAXN];
int main () {int n, s, ans = -1;scanf("%d%d",&n,&s);s *= 100;for (int i = 0; i < n; i ++) {scanf("%d%d",&d[i],&c[i]);cost[i] = d[i] * 100 + c[i];if (cost[i] <= s) ans = max(ans,(100 - c[i]) % 100); }printf("%d\n",ans);//system("pause");return 0;
}
题B Caisa and Pylons
#include <iostream>
#include <stdio.h>
#include <algorithm>
using std::sort;
const int MAXN = 1e5 + 5;
int h[MAXN];
int main () {int n, ener = 0, mon = 0;scanf("%d",&n);for (int i = 1; i <= n; i ++) scanf("%d",&h[i]);for (int i = 0; i < n; i ++) {ener += h[i] - h[i + 1];if (ener < 0) {mon -= ener;ener = 0;}}printf("%d\n",mon);
}
题C Gargari and Bishops
  • 比赛过程写的错误题解
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
//#include <windows.h>
using std::sort;
using std::max;
using std::swap;
const int MAXN = 2000 + 5;
int map[MAXN][MAXN], use[MAXN][MAXN];
long long dia[2 * MAXN][2];
int n;
struct node {long long sum;int inx, iny;
}ans, ans1, ans2;
//不能放在同一对角线上
bool check(int x, int y) {if ((!use[x][y]) && (dia[x + y][0] > 0) && (dia[x - y + n][1] > 0)) return true;return false;
}
struct node work() {for (int i = 1; i <= n; i ++) {for (int j = 1; j <= n; j ++) {if (check(i,j)) {if (dia[i + j][0] + dia[i - j + n][1] - map[i][j] > ans.sum) {ans.sum = dia[i + j][0] + dia[i - j + n][1] - map[i][j];ans.inx = i;ans.iny = j;}}}}return ans;
}
int main () {int answer = 0, x1, y1, x2, y2;scanf("%d",&n);for (int i = 1; i <= n; i ++) {for (int j = 1; j <= n; j ++) {scanf("%d",&map[i][j]);dia[i + j][0] += map[i][j];dia[i - j + n][1] += map[i][j];}}ans.sum = -1;ans1 = work();x1 = ans1.inx;y1 = ans1.iny;use[x1][y1] = 1;dia[x1 + y1][0] = -1;dia[x1- y1 + n][1] = -1;ans.sum = -1;ans2 = work();answer = ans1.sum + ans2.sum;x2 = ans2.inx;y2 = ans2.iny;if (x1 > x2) {swap(x1,x2);swap(y1,y2);}printf("%lld\n",answer);printf("%d %d %d %d\n",x1, y1, x2, y2);//system("pause");
}

错误在于没有正确设定避免一个cell同时被两个bishop攻击的条件,并非排除已选择的cell的对角线上的所有元素即可。

  • 正确题解
    正确的条件应为两个不同的cell的行列之和奇偶不同
    关于这个的推导见下图
    在这里插入图片描述
    这题还有另一种方法就是如图,选取对角线和最大的两条,求其交点坐标
    (最后改的时候还因为answer定义成了intWA了好多次orz)
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <cmath>
//#include <windows.h>
using std::sort;
using std::max;
using std::swap;
const int MAXN = 2000 + 5;
int map[MAXN][MAXN];
long long dia[2 * MAXN][2];
int n;
struct node {long long sum;int inx, iny;
}ans[2];
void work() {for (int i = 1; i <= n; i ++) {for (int j = 1; j <= n; j ++) {if (dia[i + j][0] + dia[i - j + n][1] - map[i][j] > ans[(i + j) % 2].sum) {ans[(i + j) % 2].sum = dia[i + j][0] + dia[i - j + n][1] - map[i][j];ans[(i + j) % 2].inx = i;ans[(i + j) % 2].iny = j;}}}
}
int main () {int x1, y1, x2, y2;long long answer = 0;scanf("%d",&n);for (int i = 1; i <= n; i ++) {for (int j = 1; j <= n; j ++) {scanf("%d",&map[i][j]);dia[i + j][0] += map[i][j];dia[i - j + n][1] += map[i][j];}}ans[0].sum = -1;ans[1].sum = -1;work();answer = ans[0].sum + ans[1].sum;x1 = ans[0].inx;y1 = ans[0].iny;x2 = ans[1].inx;y2 = ans[1].iny;if ((x1 > x2) || (x1 == x2 && y1 > y2)) {swap(x1,x2);swap(y1,y2);}printf("%lld\n",answer);printf("%d %d %d %d\n",x1, y1, x2, y2);//system("pause");
}

题D Gargari and Permutations
由于第1~k个数组均为1 ~ n的排列,故最大公共子序列一定包含在第一个数组内。
对于每一个数组,对于每一个序列<i,j>(j < i),判断对应的数字num[1][i]是否也在num[1][j]之后,如果有任一个数组不满足,那么该数字不在最大公共子序列里,否则最大公共子序列长度+1.

#include <iostream>
#include <string.h>
#include <algorithm>
//#include <windows.h>
using std::max;
const int MAXN = 1005;
int pos[6][MAXN];
int num[6][MAXN];
int dp[MAXN];
int main()
{int n,k;scanf("%d%d",&n,&k);for (int i = 1; i <= k; i ++) {for(int j = 1; j <= n; j ++) {scanf("%d",&num[i][j]);pos[i][num[i][j]]=j; //pos[i][num[i][j]]含义为值num[i][j]在第i个数组的位置}}for (int i = 0; i <= 1005; i ++) dp[i] = 1;for (int i = 1; i <= n; i ++) {for (int j = 1; j <= i - 1; j ++){bool flag = 1;for (int s = 1; s <= k; s++){if (pos[s][num[1][i]] < pos[s][num[1][j]]) { //第一个数组一定包含最长公共子序列flag = 0;}}if(flag && dp[i] < dp[j] + 1){dp[i] = dp[j] + 1;}}}int ans = 0;for(int i = 1; i <= n; i ++)ans = max(ans,dp[i]);printf("%d\n",ans);//system("pause");return 0;
}

这篇关于个人赛3补题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/325224

相关文章

2020年ICPC南京站 补题记录

文章目录 A - Ah, It's Yesterday Once More(构造)E - Evil Coordinate(构造)F - Fireworks(概率+三分)H - Harmonious Rectangle(打表)K - K Co-prime Permutation(签到)L - Let's Play Curling(贪心+签到)M - Monster Hunter(树形dp)

杭电多校个人补题

全部感悟。 1.要学会就是分类讨论,比如大于n小于n等于n,什么的。各种特殊情况,要考虑到。 2.要学会根据题意进行讨论 一、第八场: 第一题:cats的k-xor k进制表示。肯定就是a%k a/k%k a/(k*k)%k .... 我们会发现,如果说,在十进制下面 a+b=c的话那么肯定就是在很多进制下面都可以满足题意。 那么我们接着去讨论 a+b<c 和 a+b>c

第六届蓝桥杯大赛个人赛省赛(软件类)C++A组 解题报告

【第一题】 方程整数解   方程: a^2 + b^2 + c^2 = 1000 (或参见【图1.jpg】) 这个方程有整数解吗?有:a,b,c=6,8,30 就是一组解。 你能算出另一组合适的解吗?   请填写该解中最小的数字。   注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字。 【答案】:暴力算出另一种解为 10 18 24 ,所

8.21 补题

六题 C 16进制世界 链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网   题目描述 这是一个16进制的世界,比如522的16进制是20A。 在5月22日那天,有人送给Bob一些月饼,每个月饼有饱食度和幸福度两个属性。 现在Bob有n个月饼,对于每个月饼iii,饱食度为vi,幸福度为wi​。 Bob现在有m饱食度,意味着他吃的月饼的饱食度之和不大于m。 但是由于Bob身处16进

2020ICPC南京站补题题解

菜鸡只写银牌以下的题 这场铜牌4题,银牌5~6题 K Co-prime Permutation 题意: 构造一个n长的1到n不重复序列p,其中 p i p_i pi​和 i i i互质的个数有k个 思路: 已知: n n n和 n − 1 n-1 n−1互质,1和任何数互质,任何数和它本身不互质 k要是奇数,1不变,后面的 k − 1 2 \frac{k-1}{2} 2k−1​对数,两两换

2016ACM ECfinal补题题解

Problem E. Bet 题意:赌钱,每个队都有对应的赔率,求最多能对多少个队下注,使得只要有一个队赢了就可以保证总是赚钱的。 思路:这个题目中钱是未知的,所以设变量不能用钱,因为最后消不掉,设我对第 i i i队下注了一份钱,占下注总额的比例为 p i p_i pi​,只有该队胜利,有 1 + B i A i ∗ 1 > 1 p i 1+\frac{B_i}{A_i}*1 > \frac

2017ACM EC Final 补题题解

M World Cup 傻逼签到不多说 代码 #include<bits/stdc++.h>#include<iostream>#include <stdio.h>using namespace std;const int maxn=100005;const int base=131;typedef long long ll;#define pi acos(-1)#define

牛客寒假算法集训营第六场补题题解

网址:https://ac.nowcoder.com/acm/contest/9986 G机器人 知识点:状压dp+__int128 __int128精度比unsigned longlong 大,但是对于cin,cout,printf,scanf都不支持,输入输出模板如下: inline __int128 read(){//输入模板 __int128 x=0,f=1;char ch=getc

期末测试补题报告

目录 1. 游戏机2. 序列操作3. 划分区间4. 数字匹配5. 地图移动 1. 游戏机 赛时 Accepted 100 \color{green}\texttt{Accepted 100} Accepted 100 题目描述 在一个长条形的区域里有 n n n 个格子,人物角色可以从任意一个格子出生,如果格子上是 L,则往左走一格;如果是 R,往右走一格。当角色走出区域

[补题记录]Leetcode 3.无重复字符的最长子串

传送门:无重复字符的最长子串 Problem/题意 给一个由英文、数字、符号、空格组成的字符串,找出其中不含有重复字符的最长子串的长度。 比如:abb 包含了重复字符 b;abc 没有包含重复字符。 注意是子串,不是子序列。 Thought/思路 要知道一个区间内是否包含了重复字符,我们可以用 哈希 来保存现有字符的存在情况。 不断扩大数组长度,当遇到重复字符的时候就停止扩大,