码迷,mamicode.com
首页 > 其他好文 > 详细

八校联考第一场(20170917)

时间:2017-09-17 15:04:08      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:printf   答案   oid   efi   输出   大量   字典   思路   bsp   

排列(permutation)
题目描述】
给定一个n*n 的矩阵f,你需要求出有多少个1~n 的排列x 满足对
于1<=i≠j<=n,均有f[i,j]=min(x[i],x[j]),并输出字典序最小的一个。
有多组数据。
【输入数据】
第一行一个整数t 表示数据组数。
每组数据第一行一个正整数n。接下来n 行每行n 个整数,第i
行第j 列的整数表示f[i,j]。
【输出数据】
对于每组数据,如果不存在这样的排列,输出一行一个整数-1。
否则输出两行,第一行一个整数表示排列个数对998244353 取模的结
果,第二行n 个整数表示字典序最小的排列。
【样例输入】
1 2
0 1
1 0
【样例输出】
2
1 2
【数据范围】
对于20%的数据,n<=8。
对于60%的数据,n<=40。
对于100%的数据,t<=10,∑n<=2000,f[i,i]=0,1<=f[i,j](i≠j)<=n。
各档数据中均有一半保证全部有解。
字符串(string)
【题目描述】
定义两个字符串A,B 相似当且仅当满足以下两个条件中的至少一
个:
(1)A 和B 相同;
(2)将A 分为长度相同的两个子串A0,A1,将B 分为长度相同的两
个子串B0,B1,满足A0 相似于B0,A1 相似于B1 或A0 相似于B1,
A1 相似于B0。
给定两个字符串S,T,问它们是否相似。
有多组数据。
【输入数据】
第一行一个整数t 表示数据组数。
每组数据第一行一个字符串S,第二行一个字符串T,保证它们
长度相同。
【输出数据】
每组数据一行,若相似输出YES,不相似输出NO。
【样例输入】
2
abab
baab
aabb
abab
【样例输出】
YES
NO
【数据范围】
对于30%的数据,|S|<=30。
对于60%的数据,|S|<=100。
对于100%的数据,t<=30,∑|S|<=500000。
数(number)
【题目描述】
给定正整数n,m,问有多少个正整数满足:
(1)不含前导0;
(2)是m 的倍数;
(3)可以通过重排列各个数位得到n。
【输入数据】
一行两个整数n,m。
【输出数据】
一行一个整数表示答案对998244353 取模的结果。
【样例输入】
1 1
【样例输出】
1
【数据范围】
对于20%的数据,n<10^10。
对于50%的数据,n<10^16,m<=20。
对于100%的数据,n<10^20,m<=100。

 

就这样三道题,我也不知道说些sm好,第一题死磕半天,埃,最后还不知道正确性,

脑子是越来越没用了,不开窍的时候sm都想不出来,不知道怎么办好,

第一题搞了半天,打到10点半,剩下就一个小时第二第三题,然后都写了写暴力。

这次为什么这么差,原因在于:

  1. 开始没有先将题目看完。
  2. 第一题复杂化,没有换种思路,死磕。
  3. 没有很好的心态,和做题太少。
  4. 草稿纸不够。
  5. 错误方法还去实现,浪费大量时间。

还好这次不是提高组,不然绝对挂惨,幸运的是提前发现了错误,可以总结许多,学会许多。

T1:就是每次找当前这一行的最大上界,就是a1,

  然后按这样方法,找a2,。。。,an为止,特判1情况,然后没了。

T2:暴力,自己傻傻没开大数据范围。

T3:数位dp

下面是第一次的代码

T1

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<algorithm>
  4 #include<cmath>
  5 #include<cstring>
  6 #define N 2007
  7 #define LL long long
  8 #define mod 998244353
  9 using namespace std;
 10 
 11 int n,cnt;
 12 int a[N][N];
 13 int boo[N],ans[N],ckt[N];
 14 
 15 struct Node
 16 {
 17     int l,r,num;
 18 }tr[N];
 19 
 20 LL PL(int x)
 21 {
 22     LL res=1;
 23     for (int i=1;i<=x;i++)
 24         res=res*i%mod;
 25     return res;    
 26 }
 27 int main()
 28 {
 29     freopen("permutation.in","r",stdin);
 30     freopen("permutation.out","w",stdout);
 31     
 32     int cas;scanf("%d",&cas);
 33     while(cas--)
 34     {
 35         scanf("%d",&n);
 36         for (int i=1;i<=n;i++)
 37             for (int j=1;j<=n;j++)
 38                 scanf("%d",&a[i][j]);
 39         bool flag=false;        
 40         for (int i=1;i<=n;i++)
 41             for (int j=i+1;j<=n;j++)
 42                 if (a[i][j]!=a[j][i])
 43                 {
 44                     flag=true;
 45                     break;
 46                 }
 47         if (flag)
 48         {
 49             printf("-1\n");
 50             continue;
 51         }
 52         for (int i=1;i<=n;i++)
 53             boo[i]=1;
 54         for (int i=1;i<=n;i++)
 55             for (int j=i+1;j<=n;j++)
 56                 boo[i]=max(boo[i],a[i][j]),boo[j]=max(boo[j],a[i][j]);
 57         
 58         memset(ckt,0,sizeof(ckt));
 59         int zhi[N]={0};
 60         for (int i=1;i<=n;i++)
 61             zhi[boo[i]]++;
 62         for (int i=1;i<=n-2;i++)
 63             if (zhi[i]!=1)
 64             {
 65                 flag=1;
 66             }
 67         if (zhi[n]==2) flag=1;    
 68         for (int i=1;i<=n;i++)
 69         {
 70             int fzy=0;
 71             for (int j=boo[i];j<=n;j++)
 72                 if (ckt[j]==0)
 73                 {
 74                     ckt[j]=1;
 75                     ans[i]=j;
 76                     fzy=1;
 77                     break;
 78                 }
 79             if (!fzy)
 80             {
 81                 flag=1;
 82                 break;
 83             }
 84         }
 85         if (flag) printf("-1\n");
 86         else
 87         {
 88             int fzy=0;
 89             for (int i=1;i<=n;i++)
 90                 if(boo[i]==n)
 91                 {
 92                     fzy=1;
 93                     break;
 94                 }
 95             if (fzy==0) cout<<2<<endl;
 96             else cout<<1<<endl;
 97             for (int i=1;i<n;i++)
 98                 cout<<ans[i]<<" ";
 99             cout<<ans[n]<<endl;        
100         }
101     }
102 }

T2

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cmath>
 5 #include<cstring>
 6 
 7 using namespace std;
 8 
 9 char c1[107],c2[107];
10 
11 bool dfs(int l1,int r1,int l2,int r2)
12 {
13     int flag=0;
14     for (int i=0;i<=r1-l1;i++)
15         if (c1[i+l1]!=c2[i+l2])
16         {
17             flag=1;
18             break;
19         }
20     if (!flag) return true;
21     if (l1==r1||(r1-l1+1)%2==1) return false;
22     int up=(r1-l1)/2;
23     if (dfs(l1,l1+up,l2,l2+up)&&dfs(l1+up+1,r1,l2+up+1,r2)) return true;
24     if (dfs(l1,l1+up,r2-up,r2)&&dfs(l1+up+1,r1,l2,r2-up-1)) return true;
25     return false;
26 }
27 int main()
28 {
29     freopen("string.in","r",stdin);
30     freopen("string.out","w",stdout);
31     
32     int cas;scanf("%d",&cas);
33     while (cas--)
34     {
35         scanf("%s%s",c1,c2);
36         int len=strlen(c1);
37         for (int i=len;i>=1;i--)
38             c1[i]=c1[i-1],c2[i]=c2[i-1];
39         if (dfs(1,len,1,len)) printf("YES\n");
40         else printf("NO\n");
41     }
42 }

T3

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<iostream>
 6 #include<map>
 7 #define LL long long
 8 
 9 using namespace std;
10 
11 map<LL,bool>p;
12 
13 LL n,m,cnt,ans;
14 LL a[107],boo[107];
15 
16 void dfs(LL now,int ci)
17 {
18     if (ci==cnt)
19     {
20         if (now%m==0)
21         {
22             if (!p[now]) ans++;
23             p[now]=1;
24         }
25         return;
26     }
27     for (int i=1;i<=cnt;i++)
28         if (!boo[i])
29         {
30             if (now==0&&a[i]==0) continue;
31             boo[i]=1;
32             dfs(now*10+a[i],ci+1);
33             boo[i]=0;
34         }
35 }
36 int main()
37 {
38     freopen("number.in","r",stdin);
39     freopen("number.out","w",stdout);
40     
41     scanf("%lld%lld",&n,&m);
42     cnt=0;
43     while(n)
44     {
45         a[++cnt]=n%10;
46         n/=10;
47     }
48     ans=0;
49     memset(boo,0,sizeof(boo));
50     dfs(0,0);
51     printf("%lld",ans);
52 }

对于这么一个特别的日子,没考好真的。。。。

 

八校联考第一场(20170917)

标签:printf   答案   oid   efi   输出   大量   字典   思路   bsp   

原文地址:http://www.cnblogs.com/fengzhiyuan/p/7535387.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!