PAT 天梯赛真题集

 题目:L2-010 排座位

题意:

1. x与y是敌对关系: a)也有共同好友:OK but...

                             b)无共同朋友:No way

2. x与y是朋友关系:No problem

3. x与y既不是朋友也不敌对:OK

朋友间并查集,用map记录敌对关系。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <bits/stdc++.h>
#define scf3(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define scf2(a,b) scanf("%d%d",&a,&b)
using  namespace  std;
int  fa[110];
int  find( int  x){ return  fa[x] == x ? x : fa[x] = find(fa[x]);}
int  main(){
     map< pair< int , int > , bool >mp;
     int  n, m, k;
     scf3(n,m,k);
     int  x, y , op;
     for ( int  i = 1; i <= n; i++) fa[i] = i;
     for ( int  i = 1; i <= m; i++){
         scf3(x,y,op);
         if (op == 1){
             fa[find(x)] = find(y);
         }
         else  if (op == -1){
             mp[make_pair(x,y)] =  false ;
             mp[make_pair(y,x)] =  false ;
         }
     }
     while (k--){
         scf2(x,y);
         if (find(x) == find(y)){
             if ( !mp.count(make_pair(x,y)) || !mp.count(make_pair(y,x)) )  //不敌对
                 puts ( "No problem" );
             else
                 puts ( "OK but..." );
         }
         else {
             if ( !mp.count(make_pair(x,y)) || !mp.count(make_pair(y,x)) )  //不敌对
                 puts ( "OK" );
             else
                 puts ( "No way" );
         }
     }
}
题目:L2-009 抢红包   用力戳我直达原题
题意:模拟,sort.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include <bits/stdc++.h>
using  namespace  std;
struct  Node
{
     int  num;
     int  get;
     double  val;
}node[10010];
bool  cmp( const  Node &a, const  Node &b){    //核心排序代码
     if (a.val == b.val)
     {
         if (a.get == b.get)
             return  a.num < b.num;
         else
             return  a.get > b.get;
     }
     else
         return  a.val > b.val;
}
int  main(){
     int  n, m;
     memset (node,0, sizeof (node));
     scanf ( "%d" ,&n);
     for ( int  i = 1; i <= n; i++)   //初始化 下标等于编号
         node[i].num = i;
     for ( int  i = 1; i <= n; i++){
         scanf ( "%d" ,&m);
         int  x;
         double  y;
         while (m--){
             scanf ( "%d%lf" , &x, &y);
             node[x].val += y;
             node[x].get ++;
             node[i].val -= y;
         }
     }
     sort(node + 1, node + n + 1, cmp);
     for ( int  i = 1; i <= n; i++){
         printf ( "%d %.2f\n" ,node[i].num,node[i].val/100);
     }
}
 
 
题目:L2-008 最长对称子串   用力戳我直达原题
 
题意:暴力,O(n2)
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <bits/stdc++.h>
using  namespace  std;
int  main(){
     string s;
     getline(cin,s);
     int  ans = -1;
     for ( int  i = 0; i < s.size(); i++){     //   aba型
         int  sum = 1;
         int  idx = i + 1;
         for ( int  j = i - 1; j >= 0; j--){
             if (s[idx] != s[j])  break ;
             else  sum += 2;
             idx++;
             if (idx >= s.size())  break ;
         }
         ans = max(ans,sum);
     }
     
     for ( int  i = 0; i < s.size(); i++){    //aabb型
         if (s[i] != s[i+1])  continue ;
         int  sum = 2;
         int  idx = i + 2;
         for ( int  j = i - 1; j >= 0; j--){
             if (s[idx] != s[j])  break ;
             else  sum += 2;
             idx++;
             if (idx >= s.size())  break ;
         }
         ans = max(ans,sum);
     }
     cout << ans << endl;
}

 

题目:L2-016. 愿天下有情人都是失散多年的兄妹  

用力戳我直达原题
 
题意:就是....不能近亲结婚...也不能同性恋....
 
用二叉树存双亲,DFS搜x的前四代人,存进set,再搜y的前四代人,看是否存在于set
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <bits/stdc++.h>
using  namespace  std;
set< int >st;
bool  flag;
struct  Node
{
     int  fa,mon;
     char  sex;
}node[100100];
void  dfs( int  x, int  num){
     if (num > 5)
         return ;
     st.insert(x);
     if (node[x].fa != -1)  find(node[x].fa,num + 1);
     if (node[x].mon != -1) find(node[x].mon,num + 1);
}
void  judge( int  x, int  num){
     if (num > 5)
         return ;
     if (st.find(x) != st.end()){
         flag =  false ;
         return ;
     }
     if (node[x].fa  != -1) judge(node[x].fa, num + 1);
     if (node[x].mon != -1) judge(node[x].mon,num + 1);
}
 
int  main(){
     int  n, id, fa, mon;
     char  sex;
     memset (node,-1, sizeof (node));
     scanf ( "%d" ,&n);
     while (n--){
         scanf ( "%d %c %d %d" ,&id, &sex, &fa, &mon);
         node[id].fa = fa;
         node[id].mon = mon;
         node[id].sex = sex;
         node[fa].sex =  'M' ;     //父母也要设置性别啊...不然扣了8分orz
         node[mon].sex =  'F' ;
     }
 
     scanf ( "%d" ,&n);
     int  x, y;
     while (n--){
         cin >> x >> y;
         if (node[x].sex == node[y].sex){
             puts ( "Never Mind" );
             continue ;
         }
         st.clear();
         flag =  true ;
         dfs(x,1);    //深搜将四代存进set
         judge(y,1);  //深搜看四代是否与x重,用st.find()
         if (flag ==  true puts ( "Yes" );
         else              puts ( "No" );
     }
}

 

题目:L2-015. 互评成绩 用力戳我直达原题

 

题意:  模拟,sort,最后存stack。如此水题,去年决赛时竟没做满分,而且弄得很复杂.......

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <bits/stdc++.h>
using  namespace  std;
bool  cmp( const  int  &a,  const  int  &b){ return  a > b;}
int  main(){
     int  n, k , m, x;
     double  sco[10010];
     scanf ( "%d%d%d" ,&n, &k, &m);
     for ( int  i = 0; i < n; i++){
         int  maxx = -1, minn = 110;
         for ( int  j = 0; j < k; j++){
             scanf ( "%d" ,&x);
             maxx = max(maxx, x);
             minn = min(minn, x);
             sco[i] += x;
         }
         sco[i] -= (maxx + minn);  //去掉最高分和最低分
     }
     sort(sco, sco + n, cmp);
     stack< double >sta;
     for ( int  i = 0; i < m; i++){
         sta.push(sco[i] / (k - 2));
     }
     bool  cnt =  false ;
     while (!sta.empty()){    //倒序输出
         if (cnt)  printf ( " " ); cnt =  true ;
         printf ( "%.3f" ,sta.top());
         sta.pop();
     }
}
题目:L1-006 抢红包   用力戳我直达原题
题意:求最长的  最小连续因子
做法:三个for暴力枚举。注意len==1也要跑,因为例如 9 * 9,结果是1 3 ,而不是 1 9
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <bits/stdc++.h>
#define scf0(a) scanf("%s",&a)
#define scf1(a) scanf("%d",&a)
#define scf2(a,b) scanf("%d%d",&a,&b)
#define scf3(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define MEM(a,b) memset(a,b,sizeof(a))
#define pii pair<int,int>
#define pdd pair<double,double>
#define LL long long
using  namespace  std;
const  int  INF = 0x3f3f3f3f;
const  double  eps = 1e-8;
const  int  maxn = 10000 + 5;
int  main() {
     int  n, len, i, j;
     scf1(n);
     bool  flag =  false ;
     for (len = 12; len >= 1; len--) {    //长度从12往1搜
         for (i = 2; i <= ( int ) sqrt (n); i++) {  //i代表连续因子的第一个数,因子最大只能是sqrt(n)
             LL sum = 1;
             for (j = i; j <= len+i-1; j++) {   //连续len个数相乘
                 sum *= j;
             }
             if (n % sum == 0) {
                 flag =  true ;
                 break ;
             }
         }
         if (flag)  break ;
     }
     if (flag) {
         printf ( "%d\n" ,len);
         bool  cnt =  false ;
         for ( int  k = i; k <= len+i-1; k++) {
             if (cnt)  printf ( "*" ); cnt =  true ;
             printf ( "%d" ,k);
         }
         puts ( "" );
     }
     else  {
         printf ( "1\n%d" ,n);
     }
}

 

转载于:https://www.cnblogs.com/bestwzh/p/6476016.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值