2018.11.4薛猫杯比赛

Posted redblackk

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018.11.4薛猫杯比赛相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/diy/contest_show.php?cid=34362

 

题目比较水(有难度的1003,1007,1008)

 

1001,模拟,理解题意,排序找就行。0的话特殊考虑也是麻烦的一种,不为0就简单了,一个循环找下去记录就行。

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <cstdio>
 5 #include <cstring>
 6 using namespace std;
 7 typedef long long ll;
 8 const int maxn=1e6+5;
 9 ll a[maxn];
10 ll t[maxn];
11 ll n;
12 
13 ll getcner(ll n)
14 {
15     n=n-1;
16     ll s=n*(1+n)/2;
17 
18     return s;
19 }
20 
21 int main()
22 {
23     ios::sync_with_stdio(false); cin.tie(0);
24 
25     int T;
26     cin>>T;
27     while(T--)
28     {
29         memset(t,0,sizeof(t));
30 
31         cin>>n;
32         for(int i=1;i<=n;i++) cin>>a[i];
33 
34         sort(a+1,a+1+n);
35         ll Min=1e9+5;
36         for(int i=2;i<=n;i++)
37         {
38             Min=min(Min,a[i]-a[i-1]);
39         }
40         if(Min==0)
41         {
42             ll last=a[1];
43             int p=1;
44             for(int i=2;i<=n;i++)
45             {
46                 if(a[i]==last) t[p]++;
47                 else
48                 {
49                     last=a[i];
50                     p++;
51                 }
52             }
53 
54             ll cnt=0;
55             for(int i=1;i<=p-1;i++)
56             {
57                 cnt+=getcner(t[i]+1);
58             }
59             if(t[p]) cnt+=getcner(t[p]+1);
60 
61             cout<<Min<< <<cnt<<endl;
62         }
63         else
64         {
65             ll cnt=0;
66             for(int i=2;i<=n;i++)
67             {
68                 if(a[i]-a[i-1]==Min) cnt++;
69             }
70 
71             cout<<Min<< <<cnt<<endl;
72         }
73     }
74 
75     return 0;
76 }

 

1002,简单题,模拟即可。用map和string会好做些。

 1 #include <iostream>
 2 #include <string>
 3 #include <map>
 4 using namespace std;
 5 map<int,string> mp;
 6 string s[53];
 7 
 8 int main()
 9 {
10 
11     int p=0;
12     char c=64;
13     for(int i=1;i<=4;i++)
14     {
15         c++;
16         for(int j=1;j<=13;j++)
17         {
18             if(j<=9)
19             {
20                 char t=j+0;
21 
22                 string z="";
23                 z=z+c;
24                 z=z+t;
25 
26                 mp[++p]=z;
27             }
28             else
29             {
30                 string t;
31                 if(j==10) t="10";
32                 else if(j==11) t="J";
33                 else if(j==12) t="Q";
34                 else if(j==13) t="K";
35 
36                 string z="";
37                 z=z+c;
38                 z=z+t;
39 
40                 mp[++p]=z;
41             }
42         }
43     }
44 
45 
46     int T;
47     cin>>T;
48     while(T--)
49     {
50         for(int i=1;i<=51;i++) cin>>s[i];
51 
52         int f=0;
53         for(int i=1;i<=51;i++)
54         {
55             if(mp[i]!=s[i])
56             {
57                 f=i;
58                 break;
59             }
60         }
61         if(f==0) cout<<mp[52]<<endl;
62         else cout<<mp[f]<<endl;
63     }
64 }

 

1003,重点,经典二分题最小值最大化,Judge函数略难写,想了好长时间用2个数组写出Judge函数。

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <cstdio>
 5 #include <cstring>
 6 using namespace std;
 7 typedef long long ll;
 8 const int maxn=1e6+5;
 9 ll a[maxn],t[maxn];
10 int L,N,M;
11 
12 ll judge(ll x)
13 {
14     for(int i=1;i<=N;i++) t[i]=a[i];
15     ll last=t[1],cnt=0;
16     for(int i=1;i<=N-1;i++)
17     {
18         if(t[i]<x)
19         {
20             cnt++;
21             t[i]+=t[i+1];
22             t[i+1]=t[i];
23         }
24         //else
25     }
26     if(t[N]<x) cnt++;
27 
28     return cnt;
29 }
30 
31 int main()
32 {
33     ios::sync_with_stdio(false); cin.tie(0);
34 
35     int t;
36     cin>>t;
37     while(t--)
38     {
39         cin>>N>>M;
40         ll l=1e7,sum=0;
41         for(int i=1;i<=N;i++) { cin>>a[i]; sum+=a[i]; l=min(l,a[i]); }
42 
43         //sort(a+1,a+1+N);
44         ll r=sum;
45         ll ans=0;
46         while(l<=r)
47         {
48             ll mid=(l+r)/2;
49 
50             int t=judge(mid);
51             if(t<=M)
52             {
53                 ans=max(ans,mid);
54                 l=mid+1;
55             }
56             else r=mid-1;
57         }
58 
59         cout<<ans<<endl;
60     }
61 
62     return 0;
63 }

 

1004,找为k的子矩阵,循环或递归找判断下去即可

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <cstdio>
 5 #include <cstring>
 6 #include <cmath>
 7 using namespace std;
 8 typedef long long llo;
 9 const int maxn=1000;
10 int a[maxn][maxn];
11 int n,m,kk;
12 int f;
13 
14 void so(int x,int y,int k)
15 {
16     if(f) return;
17     if(k<0) return;
18 
19     for(int j=y;j<=y+k;j++) if(a[x][j]!=0) { f=1; return; }
20     for(int i=x;i<=x+k;i++) if(a[i][y]!=0) { f=1; return; }
21 
22     if(f==0 && x+1<=n && y+1<=m) so(x+1,y+1,k-1);
23 
24 }
25 
26 int main()
27 {
28     ios::sync_with_stdio(false);cin.tie(0);
29 
30 
31     int T;
32     cin>>T;
33     while(T--)
34     {
35 
36     cin>>n>>m>>kk;
37     for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j];
38 
39     for(int i=1;i<=n;i++)
40     {
41         for(int j=1;j<=m;j++)
42         {
43             f=0;
44             if(a[i][j]==0 && i+kk-1<=n && j+kk-1<=m)
45             {
46                 so(i,j,kk-1);
47             }
48             else f=1;
49             if(f==0) break;
50         }
51         if(f==0) break;
52     }
53 
54     if(f==0) cout<<"Yes"<<endl;
55     else cout<<"No"<<endl;
56 
57     }
58 
59     return 0;
60 }

 

1005,题目给你说的绕的超麻烦,看样例或模拟后找到规律即可

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <iomanip>
 5 #include <cstdio>
 6 #include <cstring>
 7 #include <cmath>
 8 using namespace std;
 9 typedef long long ll;
10 typedef unsigned long long ull;
11 const int maxn=1e6+5;
12 int a[maxn];
13 int t,n;
14 
15 int main()
16 {
17     scanf("%d",&t);
18     while(t--)
19     {
20         scanf("%d",&n);
21         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
22 
23         sort(a+1,a+1+n);
24         int cnt=0;
25         for(int i=2;i<=n;i++)
26         {
27             if(a[i]==a[i-1]) cnt++;
28         }
29 
30         printf("%d
",cnt);
31     }
32 
33     return 0;
34 }

 

1006,排个序,贪心思想走下去即可。从短到长,后一个必须包含前一个才能继续,不用考虑字典序和相等时情况

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <map>
 5 using namespace std;
 6 
 7 struct px
 8 {
 9     string s;
10     int len;
11 }T[1005];
12 bool cmp(px aa,px bb)
13 {
14     return aa.len<bb.len;
15 }
16 
17 int main()
18 {
19     ios::sync_with_stdio(false); cin.tie(0);
20 
21     int t;
22     cin>>t;
23     while(t--)
24     {
25         int n;
26         cin>>n;
27         for(int i=1;i<=n;i++)
28         {
29             cin>>T[i].s;
30 
31             T[i].len=T[i].s.length();
32         }
33 
34         sort(T+1,T+1+n,cmp);
35 
36         int f=0;
37         string last=T[1].s;
38         for(int i=2;i<=n;i++)
39         {
40             if(T[i].s.find(last)!=string::npos) continue;
41             else { f=1; break;}
42 
43             last=T[i].s;
44         }
45         if(f) cout<<"No"<<endl;
46         else cout<<"Yes"<<endl;
47     }
48 
49     return 0;
50 }

 

1007,难题,防Ak

 

1008,重点,搜索题,单纯搜索的很好些,但这题要找到所有的方法,很容易超时!

暴力超时代码

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <cstdio>
 5 #include <cstring>
 6 using namespace std;
 7 typedef long long ll;
 8 const int maxn=1e6+5;
 9 const int mod=1000000007;
10 char a[1005][1005];
11 int vis[1005][1005],f[1005][1005];
12 int n,m;
13 int gx,gy;
14 int ans;
15 
16 void so(int x,int y)
17 {
18     if(x==gx && y==gy)
19     {
20         ans++;
21         ans%=mod;
22         return;
23     }
24 
25     //
26     if(y+1<=m && a[x][y+1]==. && vis[x][y+1]==0) { vis[x][y+1]=1; so(x,y+1); vis[x][y+1]=0; }
27 
28     //
29     if(x+1<=n && a[x+1][y]==. && vis[x+1][y]==0) { vis[x+1][y]=1; so(x+1,y); vis[x+1][y]=0; }
30 
31     //
32     if(x-1>=1 && a[x-1][y]==. && vis[x-1][y]==0) { vis[x-1][y]=1; so(x-1,y); vis[x-1][y]=0; }
33 
34     //
35     if(y-1>=1 && a[x][y-1]==. && vis[x][y-1]==0) { vis[x][y-1]=1; so(x,y-1); vis[x][y-1]=0; }
36 }
37 
38 int main()
39 {
40     ios::sync_with_stdio(false); cin.tie(0);
41 
42     int T;
43     cin>>T;
44     while(T--)
45     {
46         ans=0;
47         cin>>n>>m;
48         for(int i=1;i<=n;i++)
49         {
50             for(int j=1;j<=m;j++)
51             {
52                 cin>>a[i][j];
53             }
54         }
55         cin>>gx>>gy;
56 
57         vis[1][1]=1;
58         so(1,1);
59         vis[1][1]=0;
60 
61         if(ans) cout<<ans<<endl;
62         else cout<<"-1"<<endl;
63     }
64 
65     return 0;
66 }

Ac代码

 

完。

以上是关于2018.11.4薛猫杯比赛的主要内容,如果未能解决你的问题,请参考以下文章

2018.11.3 杭电薛猫猫杯程序设计网络赛

两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。 已抽签决定比赛名单。有人向队员打听比赛的名单。 a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。(代码片段

2018.11.4 Hibernate中多对多的关系

十大视频场景化应用工具+五大视频领域冠军/顶会算法开源

Firebase实时数据库GroupBy方法

十大视频场景化应用工具+五大视频领域冠军顶会算法重磅开源!