UPC2018组队训练赛第四场

题目来自NAIPC2018


 

D题:Missing Gnomes

直接模拟

 1 #include<bits/stdc++.h>
 2  
 3 using namespace std;
 4 typedef long long ll;
 5 bool check[100050];
 6 int uncheck[100050];
 7 int op[100050];
 8 int ans[100050];
 9 int main()
10 {
11     int n,m;
12     while(scanf("%d %d",&n,&m)!=EOF)
13     {
14         memset(check,0,sizeof(check));
15         for(int i=1;i<=m;i++)
16         {
17             scanf("%d",&op[i]);
18             check[op[i]]=1;
19         }
20         int k=1;
21         for(int i=1;i<=n;i++)
22         {
23             if(check[i]==0)
24             {
25                 uncheck[k++]=i;
26             }
27         }
28         k=1;
29         for(int i=1;i<=m;i++)
30         {
31             if(op[i]>uncheck[k])
32             {
33                 while(op[i]>uncheck[k]&&k<=n-m)
34                 {
35                     printf("%d\n",uncheck[k]);
36                     k++;
37                 }
38             }
39                 printf("%d\n",op[i]);
40         }
41         for(;k<=n-m;k++)
42         {
43             printf("%d\n",uncheck[k]);
44         }
45     }
46     return 0;
47 }
View Code

 

H题:Recovery

输入两个字符串s,t分别代表行和列的状态(规定行或列中 1的个数为奇数 对应的是1,1的个数为偶数 对应的是0),求还原后的方阵。题目给出了两个条件:1、要求1的数量尽可能多;2、一次把每行接到上一行的后面,在条件1的前提下,使得衔接后的二进制数值最小(即让0尽量靠前)

如果行和列中1的个数奇偶性不同,直接输出-1。对于可以还原的,先把可以需要放0的行和列存下来(记需要放0的行数为rr,列数为cc)。如果rr>=cc,首先在需要放0的行中按从小到大的顺序找到( rr-cc )个行把这些行的第一个变为0;其次对于剩下的行,按列从小到大的顺序相应的都变为0,其余的都为1。如果rr<cc,同理

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int mp[60][60],a[60],b[60],aa[60],bb[60];
 4 char s[60],t[60];
 5 int main()
 6 {
 7     while(scanf("%s%s",s,t)!=EOF)
 8     {
 9         int r=strlen(s),c=strlen(t);
10         for(int i=0;i<r;i++)
11             a[i]=s[i]-'0';
12         for(int i=0;i<c;i++)
13             b[i]=t[i]-'0';
14         int rr=0,cc=0,cnt1=0,cnt2=0;
15         for(int i=0;i<r;i++)
16         {
17             if(c&1){
18                 if(!a[i])   aa[cnt1++]=i;
19  
20             }
21             else{
22                 if(a[i])    aa[cnt1++]=i;
23             }
24             rr+=a[i];
25         }
26         for(int i=0;i<c;i++)
27         {
28             if(r&1){
29                 if(!b[i])   bb[cnt2++]=i;
30             }
31             else{
32                 if(b[i])    bb[cnt2++]=i;
33             }
34             cc+=b[i];
35         }
36         if((rr+cc)&1)
37         {
38             printf("-1\n");
39             continue;
40         }
41         for(int i=0;i<r;i++)
42             for(int j=0;j<c;j++)
43                 mp[i][j]=1;
44         if(cnt1<=cnt2)
45         {
46             for(int i=0;i<cnt2-cnt1;i++)
47                 mp[0][bb[i]]=0;
48             for(int i=cnt2-cnt1;i<cnt2;i++)
49                 mp[aa[i-cnt2+cnt1]][bb[i]]=0;
50         }
51         else
52         {
53             for(int i=0;i<cnt1-cnt2;i++)
54                 mp[aa[i]][0]=0;
55             for(int i=cnt1-cnt2;i<cnt1;i++)
56                 mp[aa[i]][bb[i-cnt1+cnt2]]=0;
57         }
58         for(int i=0;i<r;i++)
59         {
60             for(int j=0;j<c;j++)
61                 printf("%d",mp[i][j]);
62             printf("\n");
63         }
64     }
65     return 0;
66 }
67  
View Code

 

转载于:https://www.cnblogs.com/scott527407973/p/9538532.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值