2021.4.19团队赛补题

D - AD 2020

题目大意:
多组输入。
每组给出起始日期和终止日期,我们需要把年月日合成的日期当成字符串并且判断这个字符串里面有没有202这个子串。然后判断在起始日期和终止日期之间有多少个有202这个子串的日期。
思路:
对于完整的年份,当我们知道他是多少年的时候,就已经知道他有多少个含有“202”的日期了。对于不完整的年份,就暴力遍历每一天,不然的话情况太复杂了。
AC代码:

#include <bits/stdc++.h>
using namespace std;

int run(int y){
    
    //判断是不是闰年 
    if((y%4==0&&y%100!=0)||y%400==0)
        return 1;
    return 0;
}

int nian(int y)
{
    
    
    if(y/10==202||y%1000==202)//202几年和1202,2202,3202,202等年 
        return 1;
    if(y%10==2)//***2年 
        return 2;
    else
        return 0;
}

int yue(int x,int y)
{
    
    
    if(y==1||y==3||y==5||y==7||y==8||y==10||y==12)//天数为31天的月 
        return 31;
    if(y==2)//2月 
    {
    
    
        if((x%4==0&&x%100!=0)||x%400==0)//闰年二月29天 
            return 29;
        else
            return 28;
    }
    return 30;//其他天数为30的月 
}

int ff(int x,int y,int z)
{
    
    
    if(x%1000==202||x/10==202)//202几年,以及*202年 
        return 1;
    if(x%10==2&&y==2)//***2年2月 
        return 1;
    if(y%10==2&&z==2)//***2年2日 
        return 1;
    return 0;
}

int main()
{
    
    
    int a1,b1,c1,a2,b2,c2,x,t;
    scanf("%d",&t);
    while(t--)
    {
    
    
        int ans=0;
        int f1,f2;//输入开始和截止的日期。 
        scanf("%d %d %d %d %d %d",&a1,&b1,&c1,&a2,&b2,&c2);

        for(int i=a1+1; i<a2; i++)//整年 
        {
    
    
            f1=nian(i);
            if(f1==1)
            {
    
    
                f2=run(i);
                if(f2==1)
                    ans+=366;
                else
                    ans+=365;
            }
            else if(f1==2)
            {
    
    
                f2=run(i);
                if(f2==1)
                    ans+=30;
                else
                    ans+=29;
            }
            else
                ans+=2;//202,1202其他年 
        }

        if(a1<a2)
        {
    
    
            for(int i=b1; i<=12; i++)
            {
    
    
                x=yue(a1,i);
                for(int j=1; j<=x; j++)
                {
    
    
                    if(i==b1&&j<c1)
                        continue;
                    if(ff(a1,i,j)==1)
                        ans++;
                }
            }

            for(int i=1; i<=b2; i++)
            {
    
    
                x=yue(a2,i);
                for(int j=1; j<=x; j++)
                {
    
    
                    if(i==b2&&j>c2)
                        continue;
                    if(ff(a2,i,j)==1)
                        ans++;
                }
            }
        }

        else if(a1==a2)
        {
    
    
            for(int i=b1; i<=b2; i++)
            {
    
    
                x=yue(a1,i);
                for(int j=1; j<=x; j++)
                {
    
    
                    if(i==b1&&j<c1)
                        continue;
                    if(i==b2&&j>c2)
                        continue;
                    if(ff(a1,i,j)==1)
                        ans++;
                }
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

G - Easy DP Problem

我无能为力我是废物,还是来看大佬讲题吧
这个只有代码

#include <bits/stdc++.h>
using namespace std;
#define PI acos(-1.0)
#define max(a,b) (a) > (b) ? (a) : (b)
#define min(a,b) (a) < (b) ? (a) : (b)
#define ll long long
#define eps 1e-10
#define MOD 1000000007
#define N 300006
#define M 300006
#define inf 1e12
struct Node{
    
    
    int x,y;
    int cost;
}edge[M];
int n,m;
int fa[N];
void init(){
    
    
    for(int i=0;i<N;i++){
    
    
        fa[i]=i;
    }
}
int find(int x){
    
    
    return fa[x]==x?x:fa[x]=find(fa[x]);
}
bool cmp(Node a,Node b){
    
    
    return a.cost>b.cost;
}
int main()
{
    
    
    int t;
    scanf("%d",&t);
    while(t--){
    
    
        scanf("%d%d",&n,&m);
        init();
        for(int i=0;i<m;i++){
    
    
            int a,b,c;
            scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].cost);
        }
        sort(edge,edge+m,cmp);
        int flag=1;
        int ans;
        int num=n-1;
        for(int i=0;i<m;i++){
    
    
            int root1=find(edge[i].x);
            int root2=find(edge[i].y);
            if(root1!=root2){
    
    
                if(flag){
    
    
                    ans=edge[i].cost;
                    flag=0;
                }else{
    
    
                    ans&=edge[i].cost;
                }
                fa[root1]=root2;
                num--;
            }
        }
        if(num!=0){
    
    
            printf("0\n");
        }
        else{
    
    
            printf("%d\n",ans);
        }
    }


    return 0;
}

猜你喜欢

转载自blog.csdn.net/LXC_007/article/details/115916860