zoukankan      html  css  js  c++  java
  • Codeforces 353E 贪心

    题意:给你一张有向图,第i条边连接i号点和(i + 1) % n号点,问最多可以选择多少个点,使得这些点互相不可达。

    思路:容易发现,如果某个边的集合点的数目大于等于2,那么就可以选出一个点,当然也可以出现多个1条边的集合相邻的情况(假设有m个),那么可以选择m / 2条边。

    代码:

    #include <bits/stdc++.h>
    #define LL long long
    #define INF 0x3f3f3f3f
    #define db double
    #define pii pair<int, int>
    using namespace std;
    const int mod = 1e9 + 7;
    const int maxn = 1000010;
    char s[maxn];
    int main() {
    	int ans = 0;
    	scanf("%s", s);
    	int n = strlen(s);
    	for (int i = 0; i < n; i++) {
    		if(s[i] != s[(i + 1) % n]) {
    			if(s[i] != s[(i + 2) % n]) ans++;//下一个集合边数大于等于2,直接选择 
    			else if(s[i] != s[(i + 3) % n]) {//出现了两个连续大小为1的集合,直接选择 
    				i++, ans++;
    			}
    		}
    	}
    	printf("%d
    ", ans);
    }
    

      

  • 相关阅读:
    iOS 图片加载
    viewController 生命周期 转
    @import和@class的区别
    git 使用总结
    iOS开发 关于property的简单总结
    Swift-6-函数
    Swift-5-流程控制
    Swift-4-数组和字典
    Swift-3-字符串和字符
    Swift-2-基本操作符
  • 原文地址:https://www.cnblogs.com/pkgunboat/p/11107460.html
Copyright © 2011-2022 走看看