codeforces - 1245 (div2)

A - Good ol‘ Numbers Coloring

直接判断两个数是否互质

#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#pragma GCC optimize(2)

#define mm(i,v) memset(i,v,sizeof i);
#define mp(a, b) make_pair(a, b)
#define one first
#define two second

using namespace std;
typedef long long ll;
typedef pair<int, int > PII;

const int N = 1e6 + 5, mod = 1e9 + 9, INF = 0x3f3f3f3f;
int t, a, b;

int gcd(int a,int b){ return b==0?a:gcd(b,a%b); }

int main()
{
//    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    cin >> t;
    while (t--) {
        cin >> a >> b;
        if (gcd(a, b) == 1)    puts("Finite");
        else    puts("Infinite");
    }
}

B - Restricted RPS

贪心

#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#pragma GCC optimize(2)

#define mm(i,v) memset(i,v,sizeof i);
#define mp(a, b) make_pair(a, b)
#define one first
#define two second

using namespace std;
typedef long long ll;
typedef pair<int, int > PII;

const int N = 200, mod = 1e9 + 9, INF = 0x3f3f3f3f;
int t, a, b, c, flag, tmp, m, n;
char s1[N], s2[N];

int gcd(int a,int b){ return b==0?a:gcd(b,a%b); }

int main()
{
//    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
//    cin.tie(0);
//    cout.tie(0);
//    ios::sync_with_stdio(0);
    cin >> t;
    while (t--) {
        tmp = 0;
        mm(s2, 0);
        cin >> n >> a >> b >> c;
        scanf("%s", s1);
        for (int i = 0; i < n; ++i) {
            if (s1[i] == ‘R‘) {
                if (b > 0) {
                    tmp++;
                    b--;
                    s2[i] = ‘P‘;
                } else {
                    s2[i] = ‘X‘;
                }
            } else if (s1[i] == ‘P‘) {
                if (c > 0) {
                    c--;
                    tmp++;
                    s2[i] = ‘S‘;
                } else {
                    s2[i] = ‘X‘;
                }
            } else if (s1[i] == ‘S‘) {
                if (a > 0) {
                    tmp++;
                    a--;
                    s2[i] = ‘R‘;
                } else {
                    s2[i] = ‘X‘;
                }
            }
        }
        if (n & 1)    m = n / 2 + 1;
        else    m = n / 2;

//        cout << tmp << "  " << m << endl;

        if (tmp < m) {
            puts("NO");
            continue;
        } else {
            for (int i = 0; i < n; ++i) {
                if (s2[i] == ‘X‘) {
                    if (a > 0) {
                        s2[i] = ‘R‘;
                        a--;
                    } else if (b > 0) {
                        s2[i] = ‘P‘;
                        b--;
                    } else if (c > 0) {
                        c--;
                        s2[i] = ‘S‘;
                    }
                }
            }
            printf("YES\n");
            printf("%s\n", s2);
        }

    }
}
/*
7
2
1 1 0
RR
2
2 0 0
SS
2
2 0 0
RR
3
1 2 0
RRR
3
2 1 0
RRR
1
1 0 0
P
1
1 0 0
S
*/

C. Constanze‘s Machine

如果字符中出现m或w就代表是由好的打印机发过来的,直接输出0。否则就dp推一下状态转移方程,后来发现如果当前字符为n或u并且前一个字符也为n或u就是dp[n] = dp[n - 1] + dp[n - 2],否则dp[n] = dp[n - 1]

#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#pragma GCC optimize(2)

#define mm(i,v) memset(i,v,sizeof i);
#define mp(a, b) make_pair(a, b)
#define one first
#define two second

using namespace std;
typedef long long ll;
typedef pair<int, int > PII;

const int N = 1e5 + 5, mod = 1e9 + 7, INF = 0x3f3f3f3f;
char s[N];
int dp[N];
int ans, flag;

int pow_2(int x) {
    int ans = 2;
    for (int i = 1; i <= x; ++i)
        ans *= 2;
    return ans;
}

int main()
{
//    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
//    cin.tie(0);
//    cout.tie(0);
//    ios::sync_with_stdio(0);
    scanf("%s", s);
    flag = 0;
    int len = strlen(s);
    dp[0] = 1;
    for (int i = 0; i < len; ++i) {
        if (s[i] == ‘m‘ || s[i] == ‘w‘) {
            flag = 1;
            break;
        }
        if (i == 0)    continue;
        if (i == 1) {
            if (s[i] == s[i - 1])    dp[i] = dp[i - 1] + 1;
            else dp[i] = dp[i - 1];
            continue;
        }

        if (s[i] == ‘u‘ && s[i - 1] == ‘u‘)        dp[i] = (dp[i - 1] + dp[i - 2]) % mod;
        else if (s[i] == ‘n‘ && s[i - 1] == ‘n‘)    dp[i] = (dp[i - 1] + dp[i - 2]) % mod;
        else dp[i] = dp[i - 1];

//        if (s[i] == ‘n‘) {
//            if (i == 1) {
//                if (s[i - 1] == ‘n‘) dp[i] = dp[i - 1] * 2;
//                else dp[i] = dp[i - 1];
//                continue;
//            }
//            if (s[i - 1] == ‘n‘ && s[i - 2] == ‘n‘)    dp[i] = dp[i - 1] + dp[i - 2];
//            else if (s[i - 1] == ‘n‘)    dp[i] = (dp[i - 1] + 1) * dp[i - 1];
//            else    dp[i] = dp[i - 1];
//        } else if (s[i] == ‘u‘) {
//            if (i == 1) {
//                if (s[i - 1] == ‘u‘) dp[i] = dp[i - 1] + 1;
//                else dp[i] = dp[i - 1];
//                continue;
//            }
//            if (s[i - 1] == ‘n‘ && s[i - 2] == ‘u‘)    dp[i] = dp[i - 1] + dp[i - 2];
//            else if (s[i - 1] == ‘u‘)    dp[i] = dp[i - 1] + 1;
//            else    dp[i] = dp[i - 1];
//        } else {
//            dp[i] = dp[i - 1];
//        }
//
//        cout << i << " " << dp[i] << endl;
    }
    if (flag == 1) {
        puts("0");
    } else {
        cout << dp[len - 1] << endl;
    }
}

D - Shichikuji and Power Grid

题意:要使每个村庄都通上电,通电的方法是在这个村庄建发电站(花费ci)或者把这个村庄和一个有发电站的村庄连接起来(花费ki + kj的和乘上两个村庄的曼哈顿距离)

这题显然是最小生成树(感觉迪杰斯特拉也行),但是n比较小,可以直接暴力贪心

解法:首先假设每个点都自建,那么每个点的代价就是自建代价。然后按照代价排序,用代价最小的点去更新后面那些点,如果能更新用电代价,就把那些点连接到当前点。然后进入下一轮循环,排除上一次代价最小的点,把剩下的点再次按照代价排序,然后用这些点中代价最小的去更新其他的,以此类推。

By MengWH, contest: Codeforces Round #597 (Div. 2), problem: (D) Shichikuji and Power Grid, Accepted, #
#include<bits/stdc++.h>
using namespace std ;
int n;
struct City {
    int id;
    long long x,y;  //坐标
    long long cc,kk;  //自建的花费,连线的花费
    bool self;//是否建站
    int fa;//连线的站
    bool operator < (const City & a)const {
        return cc<a.cc;
    }
} c[2005];
int main() {
    scanf("%d",&n);
    for(int i=1; i<=n; i++) {
        c[i].id=i;//发电站编号
        c[i].self=1;  //首先都默认是自建的
        scanf("%lld%lld",&c[i].x,&c[i].y);  //输入坐标
    }
    for(int i=1; i<=n; i++) scanf("%lld",&c[i].cc);  //初始都为自建
    for(int i=1; i<=n; i++) scanf("%lld",&c[i].kk);//连线
    long long ans=0,selfnum=0;
    for(int i=1; i<=n; i++) {
        sort(c+i,c+1+n);//大概就是要随时排序,每次找到最小的,每次排序要排除前一次的,防止多加费用
        ans+=c[i].cc;  //费用
        if(c[i].self) selfnum++;  //判断是否自建
        for(int j=i+1; j<=n; j++) {
            long long cost=(c[i].kk+c[j].kk)*(abs(c[i].x-c[j].x)+abs(c[i].y-c[j].y));
            if(cost<c[j].cc) {
                c[j].cc=cost;
                c[j].self=0;//放弃自建,说要已经和别的站建立了联系
                c[j].fa=c[i].id;
            }
        }
    }
    printf("%lld\n%lld\n",ans,selfnum);
    for(int i=1; i<=n; i++)
        if(c[i].self) printf("%d ",c[i].id);
    printf("\n%lld\n",n-selfnum);
    for(int i=1; i<=n; i++)
        if(!c[i].self) printf("%d %d\n",c[i].id,c[i].fa);
    return 0;
}

E、F

......

原文地址:https://www.cnblogs.com/mwh123/p/11799261.html

时间: 2024-10-05 03:45:22

codeforces - 1245 (div2)的相关文章

Codeforces 583 DIV2 Robot&#39;s Task 贪心

原题链接:http://codeforces.com/problemset/problem/583/B 题意: 就..要打开一个电脑,必须至少先打开其他若干电脑,每次转向有个花费,让你设计一个序列,使得总花费最小. 题解: 就傻傻的走就好..从左走到右,再走回来,更新序列和答案就好. 代码: #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #define MA

Codeforces #180 div2 C Parity Game

// Codeforces #180 div2 C Parity Game // // 这道题的题目意思就不解释了 // // 题目有那么一点难(对于我而言),不多说啦 // // 解题思路: // // 首先如果a串和b串相等,不多说直接YES // 如果b串全是0,直接YES // 注意到a串有一个性质,1的个数不会超过本身的加1. // a有个1的上限设为x,b有个1的个数设为y,则如果x < y // 那么直接NO. // // 现在一般情况下,就是模拟啦,找到a的后缀和b的前缀一样的

Codeforces #246(div2)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <ti

Codeforces #245(div2)

A:A. Points and Segments (easy) 题目看了n久,开始觉得尼玛这是div2的题目么,题目还标明了easy.. 意思是给你一n个点,m个区间,在n个点上放蓝球或者红球,然后让你找一种选择方案使得m个区间内的蓝球和红球数量之差不超过1. 开始想过用dfs,不过这只是div2的A题而已.. 然后想了下,直接输出010101序列不就可以么. 交了一发,发现要先排个序,再输出就可以了. AC代码: #include<iostream> #include<cstdio&g

codeforces#327 div2

codeforces#327 div2 这场状态不好有点可惜,题目都不难,而且很好.. A题:水题. #include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; typedef lo

codeforces#FF(div2) DZY Loves Sequences

n个数,可以任意改变其中一个数,求最长的上升子区间长度 思路:记录一个from[i]表示从位置i的数开始最长的上升区间长度 记录一个to[i]表示到位置i的数所能达到的最长上升区间长度 枚举要改变的数的位置i,此时能达到的长度为to[i - 1] + from[i + 1] + 1,取最大值 //#pragma comment(linker, "/STACK:102400000,102400000") //HEAD #include <cstdio> #include &l

Codeforces 258 Div2

A题,n*m根木棍,相交放置,轮流取走相交的两根,最后谁不能行动,则输掉. min(n,m)&1 为1则先取者赢. B题,给定一个长度为n,且各不相同的数组,问能否通过交换连续一段L....R使得变成单调递增. 如果一开始就是递增的,那么直接输出L...R就是1 1,交换一个就行了:否则判断中间是否有且一段单调递减,且两端交换后使得数组递增. 代码: 1 //Template updates date: 20140718 2 #include <iostream> 3 #include

Codeforces #263 div2 解题报告

比赛链接:http://codeforces.com/contest/462 这次比赛的时候,刚刚注册的时候很想好好的做一下,但是网上喝了个小酒之后,也就迷迷糊糊地看了题目,做了几题,一觉醒来发现rating掉了很多,那个心痛啊! 不过,后来认真的读了题目,发现这次的div2并不是很难! 官方题解:http://codeforces.com/blog/entry/13568 A. Appleman and Easy Task 解析: 一个水题,判断每个细胞周围是否都是有偶数个相邻细胞.   代码

codeforces#333 div2 B. Approximating a Constant Range

http://codeforces.com/contest/602/problem/B 这道题的两种做法, 滑窗+线段树查询区间最值: #include<bits/stdc++.h> #define REP(i,a,b) for(int i=a;i<=b;i++) #define MS0(a) memset(a,0,sizeof(a)) using namespace std; typedef long long ll; const int maxn=1000100; const int