2019CCSU第二次校赛部分题解(A,B,E,G)

A

签到题,考虑到数据范围很小直接枚举1,2,3分别取多少个就做完了

 1 #define IO std::ios::sync_with_stdio(false);
 2 #define bug(x) cout<<x<<" "<<endl
 3 #include <bits/stdc++.h>
 4 #define itor ::iterator
 5 using namespace std;
 6 #define pb push_back
 7 typedef long long ll;
 8 typedef double db;
 9 const int N=1e6+10;
10 int T,n,m,kase;
11 int a[10],vis[100];
12 int main(){
13     scanf("%d",&T);
14     while(T--){
15         scanf("%d%d",&kase,&n);
16         for(int i=1;i<=3;i++)a[i]=0;
17         for(int i=1;i<=10;i++){
18             int x;
19             scanf("%d",&x);
20             a[x]++;
21         }
22         int flag=0;
23         for(int i=0;i<=a[1];i++){
24             for(int j=0;j<=a[2];j++){
25                 for(int k=0;k<=a[3];k++){
26                     int res=i+j*2+k*3;
27                     if(res==n){
28                         flag=1;
29                         break;
30                     }
31                 }
32             }
33         }
34         printf("%d ",kase);
35         if(flag)printf("YES\n");
36         else printf("NO\n");
37     }
38 }

B

首先对于这种很有可能是找规律的题,我们可以不去想dp啊

遇事不对先打表!

 1 #define IO std::ios::sync_with_stdio(false);
 2 #define bug(x) cout<<x<<" "<<endl
 3 #include <bits/stdc++.h>
 4 #define itor ::iterator
 5 using namespace std;
 6 #define pb push_back
 7 typedef long long ll;
 8 typedef double db;
 9 const int N=1e6+10;
10 int vis[100][2],k;
11 int ans=0;
12 int check(int x,int y){
13     if(x<1||y<1||y>2)return 0;
14     return 1;
15 }
16 int dx[10]={0,0,1,-1};
17 int dy[10]={1,-1,0,0};
18 void dfs(int x,int y,int h){
19     if(h==k){
20         ans++;
21         return;
22     }
23     for(int i=0;i<4;i++){
24         int x1=x+dx[i];
25         int y1=y+dy[i];
26         if(check(x1,y1)&&!vis[x1][y1]){
27             vis[x1][y1]=1;
28             dfs(x1,y1,h+1);
29             vis[x1][y1]=0;
30         }
31     }
32 }
33 int main(){
34     for(int i=1;i<=20;i++){
35         memset(vis,0,sizeof(vis));
36         ans=0;
37         k=i;
38         vis[1][1]=1;
39         dfs(1,1,0);
40         printf("i=%d: %d\n",i,ans);
41     }
42 }

dfs打表发现答案跟是前两项之和然后和奇偶性也有关,

然后这个题就很水了。。。

#define IO std::ios::sync_with_stdio(false);
#define bug(x) cout<<x<<" "<<endl
#include <bits/stdc++.h>
#define itor ::iterator
using namespace std;
#define pb push_back
typedef long long ll;
typedef double db;
const int N=1e6+10;
int T,k,n,mod=1e4+7;
int a[10005];
void init(){
    a[1]=2,a[2]=3;
    for(int i=3;i<=1000;i++){
        if(i%2){
            a[i]=(a[i-1]+a[i-2]+1)%mod;
        }
        else a[i]=(a[i-1]+a[i-2])%mod;
    }
}
int main(){
    init();
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&k,&n);
        printf("%d %d\n",k,a[n]);
    }
}

E

有点恶心的题。。竟然没A出来

显然我们可以枚举正确时间,然后再拿时钟时间和误差时间去配对

配对我们可以排序然后一直扫一遍,注意输入输出的各种细节即可

#define IO std::ios::sync_with_stdio(false);
#define bug(x) cout<<x<<" "<<endl
#include <bits/stdc++.h>
#define itor ::iterator
using namespace std;
#define pb push_back
typedef long long ll;
typedef double db;
const int N=1e3+10;
int T,n,m,kase;
int mod=720;
int a[20],b[20],vis[20],d[20];
char s[100];
int main(){
    scanf("%d",&T);
    while(T--){
        scanf("%d%d",&kase,&n);
        for(int i=1;i<=n;i++){
            int x,y;
            scanf("%d:%d",&x,&y);
            x%=12;
            x=x*60+y;
            a[i]=x;
        }
        for(int i=1;i<=n;i++){
            scanf("%s",s);
            int len=strlen(s);
            int k=0;
            if(s[0]=='+')k++;
            int x=0,y=0,id;
            for(int j=1;;j++){
                if(s[j]==':'){
                    id=j;
                    break;
                }
                x=x*10+s[j]-48;
            }
            x%=12;
            for(int j=id+1;j<len;j++){
                y=y*10+s[j]-48;
            }
            x=x*60+y;
            if(k){
                b[i]=x;
            }
            else b[i]=-x;
        }
        int ans=0,t;
        sort(a+1,a+1+n);
        for(int i=0;i<=719;i++){
            for(int j=1;j<=n;j++){
                d[j]=(i+b[j]+mod)%mod;
            }
            sort(d+1,d+1+n);
            int flag=0;
            for(int j=1;j<=n;j++){
                if(d[j]!=a[j]){
                    flag=1;
                    break;
                }
            }
            if(!flag){
                ans++;
                t=i;
            }
        }
        printf("%d ",kase);
        if(ans>1)printf("%d\n",ans);
        else if(ans==0)printf("none\n");
        else{
            int x=t/60,y=t%60;
            if(x==0)printf("12:%02d\n",y);
            else printf("%d:%02d\n",x,y);
        }
    }
}

G

这题不会写,看网友大佬题解看懂的

传送门:https://www.cnblogs.com/artoriax/p/10576496.html

猜你喜欢

转载自www.cnblogs.com/ccsu-kid/p/10585393.html