Codeforces Round #775 (Div. 2, based on Moscow Open Olympiad in Informatics) 题解

news/2024/11/24 3:37:23/

A. Game

  • 思路
    • 只能跳一次!!!!
    • 从左和从右开始找到第一个0,然后相减+2(从0回到上一格的1陆地)即可
  • 经验教训
  • AC代码

#define int long long
const int maxn = 2e5 + 10;
int a[maxn];void solve(){int n;cin>>n;int ans = 0;int flagz = 0;for (int i = 1; i <= n; ++i) {int x;cin>>x;a[i] = x;if (x==0) flagz = 1;}int right = 0,left = 0;if (flagz==0) cout<<0<<'\n';else{for (int i = n; i > 1 ; --i) {if (a[i]==0) { right = i+1;break;}}for (int i = 1; i <= n; ++i) {if (a[i]==0){left = i-1;break;}}cout<<right-left<<'\n';}
}signed main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int t;cin>>t;for (int i = 0; i < t; ++i) {solve();}}

B. Game of Ball Passing

  • 思路
    • 直接贪心,如果传球次数最多的那个人传球的数量比其他所有人的数量之和都多,他就一定得传空球(他传给别人别人不传给他),其他情况都可以一个球互相传解决
  • 经验教训
  • AC代码

#define int long long
const int maxn = 2e5 + 10;
int a[maxn];bool cmp(int aa,int bb){return aa>bb;
}
int dp[maxn];
void solve(){int n;cin>>n;int flagz = 0;int sum = 0;int maxx = 0;for (int i = 0; i < n; ++i) {int x;cin>>x;a[i] = x;sum+=x;maxx = max(maxx,x);if (x!=0) flagz = 1;}if (!flagz) { cout << 0 << '\n';return; }if (maxx > sum-maxx){cout<<maxx-(sum-maxx)<<'\n';}else cout<<1<<'\n';
}signed main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int t;cin>>t;for (int i = 0; i < t; ++i) {solve();}}

C. Weird Sum

  • 思路
    • 分行和分列考虑,假设颜色ci只出现在第1行,第5行,第6行,第9行,那么只考虑x的曼哈顿距离就是(5-1+6-1+9-1)+(6-5+9-5)+(9-6),这一段逻辑对应代码的第11-20行
    • 接下来考虑如何得到每一种颜色出现在的行和列,我们预先定义vector row[maxn],row【k】这个vector里面存放的是每个k出现的行数(如果第x行出现了2的k,那就会有两个x,不矛盾)我们在读入数据的时候,读到一个ck,就将它对应的行row【ck】中,列同理。
    • 接下来只需对1-100000的i对应的row【i】和col【i】进行代码11-20行对应操作即可
  • 经验教训
  • AC代码
#define int long long
const int maxn = 1e5 + 10;vector<int> row[maxn];
vector<int> col[maxn];int count(vector<int> &color){sort(color.begin(),color.end());int sum = 0;int sz = color.size();for (int i = 1; i < sz; ++i) {sum+=color[i];}int n = sz-1;int ans = 0;for (int i = 0; i < sz-1; ++i) {ans += (sum-(n*color[i]));sum -= color[i+1];n--;}return ans;
}signed main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int n,m;cin>>n>>m;for (int i = 1; i <=n ; ++i) {for (int j = 1; j <=m ; ++j) {int x;cin>>x;row[x].push_back(i);col[x].push_back(j);}}int ans = 0;for (int i = 1; i <= 100000 ; ++i) {ans+=(count(row[i])+ count(col[i]));}cout<<ans;

D. Integral Array

  • 思路
    • 对于数组中出现的某个i,如果【ij,ij+i-1】中的数出现在了数组中,且j并没有出现在数组中,那么数组非法
    • 只需要第一层for遍历i,第二层遍历合法j(i*j≤c的j即为合法j),查看是否出现不合法情况即可
  • 经验教训
  • AC代码
#define int long long
const int maxn = 1e6 + 10;inline void solve() {int n, c;cin >> n >> c;vector<int> sum(c+1);vector<int> cnt(c+1);int flago = 0;for (int i = 1; i <= n; ++i) {int x;cin >> x;if (x == 1) flago = 1;cnt[x]++;}if (!flago) {cout << "NO" << '\n';return;}for (int i = 1; i <= c; ++i) {sum[i] = sum[i - 1] + cnt[i];}for (int i = 1; i <= c; ++i) { // a[i]是选定的某个数if (!cnt[i]) continue;int num = c / i; // num是所有合法的倍数for (int j = 2; j <= num; ++j) { // j是倍数int right = min(c, i * j + i - 1);int left = i * j;if (sum[right] - sum[left - 1] > 0 && cnt[j] == 0) {cout << "NO" << '\n';return;}}}cout << "YES" << '\n';
}signed main() {std::ios::sync_with_stdio(false);std::cin.tie(0);std::cout.tie(0);int t;cin >> t;for (int i = 0; i < t; ++i) {solve();}
}

http://www.ppmy.cn/news/361598.html

相关文章

LeetCode-775. 全局倒置与局部倒置【最小后缀,归纳】

LeetCode-775. 全局倒置与局部倒置【最小后缀&#xff0c;归纳】 题目描述&#xff1a;解题思路一&#xff1a;常规暴力方法剪枝。解题思路二&#xff1a;维护后缀最小值.解题思路三&#xff1a;三行代码&#xff01;&#xff01;&#xff01;进一步&#xff0c;我们可以发现对…

Codeforces Round #775 (Div. 2, based on Moscow Open Olympiad in Informatics)A~C 题解(原来如此简单,超级详细入门必备)

A. Game 题目传送门 题目理解&#xff1a;一个人要过河&#xff0c;这个人不会游泳&#xff0c;只能走陆地&#xff0c;一旦碰水就死翘翘&#xff0c;但是现在给你一个bug&#xff0c;只要你给x个硬币&#xff0c;你就可以传送到ix块陆地上面&#xff0c;比如你在第5块土地上…

linux 775和777权限有什么区别

读取权限 r 4 写入权限 w 2 执行权限 x 1 775 这三个数字代表拥有者&#xff0c;组用户&#xff0c;其他用户的权限。 例如&#xff1a; 7 拥有者有 读取&#xff0c;写入&#xff0c;执行权限 7 组用户有 读取&#xff0c;写入&#xff0c;执行权限 5 其他用户有 读…

LeetCode 775. 全局倒置与局部倒置

775. 全局倒置与局部倒置 【归并排序】显然全局倒置就是求整体的逆序对&#xff0c;用归并排序的思想可以在O(nlogn)的复杂度下求出逆序对的个数。 class Solution {// 9:56 15int[] nums, tmp;int n;int global(int l, int r) {if (l r) return 0;int m (l r) >> 1;…

Codeforces Round #775 (Div. 2) ABCDE题解

A-Game 题目大意&#xff1a; 一条直线上有若干个点&#xff0c;每个点有两种情况&#xff1a; land 可以经过water 不能经过 每次只能移动一个距离&#xff0c;如果下一个是land&#xff0c;就可以到下一个land上&#xff0c;花费为0。 最多可以使用一次跳跃&#xff0c;从…

Codeforces Round #775 (Div. 1, based on Moscow Open Olympiad in Informatics) B. Integral Array

Problem - B - Codeforces 翻译&#xff1a; 给定一个由&#x1d45b;个正整数组成的数组&#x1d44e;&#xff0c;这些正整数从1到&#x1d45b;编号。我们称数组为整数&#xff0c;如果这个数组中的任意两个不一定不同的数字&#x1d465;和&#x1d466;&#xff0c;&…

linux命令chmod命令设置权限的777,775,774

chmod是Linux下设置文件权限的命令&#xff0c;后面的数字表示不同用户或用户组的权限。 一般是三个数字&#xff1a; 第一个数字表示文件所有者的zhidao权限 第二个数字表示与文件所有者同属一个用户组的其他用户的权限 第三个版数字表示其它用户组的权限。 权限分为三种&…

Linux权限字符串755,775,777,ugoa 等分别代表什么含义?这些数字是如何得到的?

1.常用的linux文件权限&#xff1a; 444 -r--r--r-- 600 -rw------- 644 -rw-r--r-- 666 -rw-rw-rw- 700 -rwx------ 744 -rwxr--r-- 755 -rwxr-xr-x 777 -rwxrwxrwx注:使用ll命令查看文件/文件夹属性时候,一共有10列,第一个小格表示是文件夹或者连接等等 d表示文件夹,l表示连…