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;
}