CF每日一练(2.10)

CF-1093

1093A - Dice Rolling

  • 输出x/2即可
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int t; cin >> t;
    while (t--)
    {
        int x; cin >> x;
        cout << x / 2 << endl;
    }
    return 0;
}

1093B - Letters Rearranging

  • 当且仅当字符串中所有字符都相同时,答案为-1
  • ans!=-1时,我们可以对字符排个序,然后输出即可。
#include <bits/stdc++.h>
using namespace std;
int t;
char s[1010];
int main(){
    cin>>t;
    while(t--){
        cin>>s;
        int flag = 0,len = strlen(s);
        for(int i=1;i<len;i++){
            if(s[i]!=s[0]){
                flag = 1;break;
            }
        }
        if(flag == 0)
            printf("-1\n");
        else{
            sort(s,s+len);
            cout<<s<<endl;
        }
    }
    return 0;
}

1093C - Mishka and the Last Exam

  • 贪心,每次都让右边尽量大(或者让左边尽量小)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,x;
ll a[200100];
int main(){
    cin>>n>>x;
    a[1] = 0,a[n]=x;
    for(int i=2;i<=n/2;i++){
        cin>>x;
        if(x>=a[i-1]+a[n-i+2]){
            a[i] = x - a[n-i+2];
            a[n-i+1] = a[n-i+2];
        }
        else{
            a[i] = a[i-1];
            a[n-i+1] = x-a[i];
        }
    }
    for(int i=1;i<=n;i++)
        printf("%lld ",a[i]);
    puts("");
    return 0;
}

1093D - Beautiful Graph

  • 给定一个图,相邻两点权值奇偶性不同,权值只能为{1,2,3}。问有多少中赋权值的方法
  • 对于每一个联通块,先假设出发结点为奇数,那么与之相连的点都为偶数,bfs一遍即可算出有多少点为奇数,假设奇数为a个,偶数为b个,则该联通块方法数为:\(a^2+b^2\)
  • 不同的联通块答案相乘即可
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 998244353;
int T,n,m;
vector<int> v[300010];
int vis[300010];
inline ll fast_pow(ll a,ll b){
    ll ans = 1%mod;
    for(;b;b>>=1){
        if(b&1) ans = (ans*a)%mod;
        a = (a*a)%mod;
    }
    return ans;
}
ll bfs(int x){
    vis[x] = 1;
    queue<int> q;
    q.push(x);
    int sum = 0,num = 0;//sum为该联通块总数,num为奇数个数
    while(!q.empty()){
        int u = q.front();q.pop();
        sum++;
        if(vis[u]==1)num++;
        for(int i=0;i<v[u].size();i++){
            int y = v[u][i];
            if(vis[y]!=0){
                //如果已经被访问过的v与u奇偶性相同,则返回0.最终答案也为0
                if(vis[y]+vis[u]!=3){
                    return 0;
                }
                continue;
            }
            vis[y] = 3-vis[u];
            q.push(y);
        }
    }
    ll ans = (fast_pow(2,num)+fast_pow(2,sum-num))%mod;
    return ans;
}
int main(){
    cin>>T;
    while(T--){
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            v[i].clear();
            vis[i] = 0;
        }
        for(int i=1,x,y;i<=m;i++){
            scanf("%d%d",&x,&y);
            v[x].push_back(y);
            v[y].push_back(x);
        }
        ll ans = bfs(1);
        for(int i=1;i<=n;i++){
            if(!vis[i]){
                ans = (ans*bfs(i))%mod;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

原文地址:https://www.cnblogs.com/chd-acm/p/10362792.html

时间: 2024-07-31 17:12:56

CF每日一练(2.10)的相关文章

CF每日一练(2.9)

CF-1013 A. Piles With Stones 比较两个序列的和,因为只能拿走或者不拿,所以总数不能变大. B. And 答案只有 -1,0,1,2几种可能,所以对于每一种答案都暴力扫一次是可以的 或者对于每个 \(a_i\) ,将\(a_i\) 标记加一,如果\(a_i \neq a_i\& x\) ,将\(a_i\&x\) 用另一个数组标记加一.然后整体扫一次就可以了 #include <bits/stdc++.h> using namespace std; in

CF每日一练(2.11)

CF-1114 A. Got Any Grapes? skip B. Yet Another Array Partitioning Task 将n个数分成连续的k组,使得每组的前m大的数字的总和最大. 首先可以想到肯定可以包含n个数中前 m*k 大的数.所以可以先将他们标记,然后扫一遍确定每组的端点即可 #include <bits/stdc++.h> using namespace std; typedef long long ll; int n,m,k; struct node{ int

每日一小练——等值数目

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:等值数目 内容:已知两个整数数组f[]与g[],它们的元素都已经从小到大排列好,而且两个数组中的元素都各不相同.例如,f[]中有1,3,4,7,9,而g[]中有3,5,7,8,10.试编写程序算出这两个数组之间有多少组相同的元素.就上例而言,f[2]和g[1]为3是一组:f[4]和g[3]为8是一组.所以共有两组. 经过了前两天的编写,我觉得程序不具有代表性,所以我打算以后把核心算法的部分写出函数的形式,这样看起来更直

每日一小练——Armstrong数

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:Armstrong数 内容: 在三位的正整数中,例如abc,有一些可以满足a^3+b^3+c^3=abc的条件,也就是说各个位数的立方和正好是该数本身,这些数称为Armstrong数.是编写一个程序求出所有的三位Armstrong数. 我的解法:上来没多想,打开vs2013就敲了起来,问题果然很简单,分分钟就超神..奥,不对就解决了!Armstrong数在国内好像就叫做水仙花数,很多程序设计的课本后面都有这种类型的思考

WindowsAPI每日一练(1) MessageBoxA

WindowsAPI每日一练系列 :https://www.cnblogs.com/LexMoon/category/1246238.html WindowsAPI每日一练(1) WinMain 要跟计算机进行交互,就需要计算机显示信息给人看到,或者发出声音给人听到,然后人看到或听到相应的信息后,再输入其它信息给计算机,这样就可以让计算机进行数据处理,把结果显示给我们.现在就来编写一个最简单的Windows应用程序,让它提示一行文字给我们看到,这就是简单的目标. 1 #include <wind

Python 每日一练(3)

引言 今天的每日一练,学习了一下用Python生成四位的图像验证码,就是我们常常在登录时见到的那种(#`O′) 思路分析 正如常见的那种图像验证码,它是由数字和字母的随机组合产生的,所以我们首先的第一步就是生成这样的数字字母组合 完成第一步后,剩下的就和之前第一次练习给图片加文字一样的操作了 具体实现 生成随机验证码 def genUnit(): ascii_and_num=string.ascii_uppercase+string.digits Verification_Code=random

CSS3每日一练之内容处理-嵌套编号

出处:http://www.w3cfuns.com/thread-5592229-1-17.html 1.大标题一   1.子标题   2.子标题   3.子标题2.大标题二   1.子标题   2.子标题3.大标题三   1.子标题   2.子标题   3.子标题 这种问题,你可能会觉得直接定义两个计数器,分别编号不就行了,于是就写出了如下代码: <!DOCTYPE HTML> <html> <head> <meta charset="gb2312&q

每日一小练——最长平台问题

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:最长平台问题 内容:一直一个已经从小到大排序的数组,这个数组中的一个平台就是连续的一串同样的元素.而且这个元素不能再延伸. 比如,在1,2,2,3,3,3,4,5,5,6中1,2,2,3,3,3,4,5,5,6都是平台.试编写一个程序,接受一个数组,把这个数组中最长的平台找出来.在这个样例中, 3,3,3就是该数组的中的最长的平台. 说明: 这个程序十分简单,可是编写好却不easy,因此在编敲代码时应注意考虑以下几点:

每日一小练——列出全部子集

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:列出全部子集 内容:写一个程序,列出{1,2,3,4,...,n}这个集合的全部子集,包含空集{ }. 解决问题的算法应该有非常多种,只是我发现了一种非常easy也非常好玩的方法,就是用二进制表示几何元素的方法 比方假设n是3,则子集有(不包含空集){1}{2}{3}{1,2}{1,3}{2,3}{1,2,3}就是1*{0,1}and2*{0,1}and3{0,1}每一个组合出现一次,所以也能够看成是{0,0,1}{0