1. 程式人生 > >八校聯考第一場(20170917)

八校聯考第一場(20170917)

max 排列 第一次 div 當前 範圍 blog oid namespace

排列(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)