#418(div2)B

题意:输入n,代表有n种颜色,然后给出a,b2个数列,存在位置i,使得某个数列和a数列在i处不同,其他处相同,存在位置j,使得某个数列和b数列在j出不同,其他处相同,且某个数列中的数为1-n.

思路:在a数列中我们可以肯定有2个一模一样的颜色,b也是,那么a,b不同的的个数可能为0,1,2。好吧,考虑那么多导致我崩了。。。我们只要知道那2个位置必定有一个要改变,我就一个个判断,搞那么多花里胡哨的干嘛。。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 map<int ,int >ma,mb;
 4 int main(){
 5     int n;
 6     int a[1002],b[1002];
 7     cin>>n;
 8     int x=0,y=0;
 9     int sum=0;
10     int t=0;
11     for(int i=1;i<=n;i++) {
12         scanf("%d",&a[i]);
13         if(ma[a[i]]){
14             x=ma[a[i]];
15             y=i;
16         }
17         ma[a[i]]=i;
18     }
19     for(int i=1;i<=n;i++) {
20         scanf("%d",&b[i]);
21     }
22     for(int i=1;i<=n;i++){
23          if(i==a[x]) continue;
24
25          sum=0;
26         for(int j=1;j<=n;j++){
27              if(j==x) {
28                 if(b[j]!=i) sum++;
29                 continue;
30              }
31               if(a[j]!=b[j]) sum++;
32         }
33         if(sum==1&&ma[i]==0){
34                 t=1;
35             a[x]=i;break;
36         }
37     }
38     if(t){
39         for(int i=1;i<=n;i++){
40         cout<<a[i]<<" ";
41         }
42       cout<<endl;return 0;
43     }
44
45     for(int i=1;i<=n;i++){
46          if(i==a[y]) continue;
47
48          sum=0;
49         for(int j=1;j<=n;j++){
50              if(j==y) {
51                 if(b[j]!=i) sum++;
52                 continue;
53              }
54               if(a[j]!=b[j]) sum++;
55         }
56         if(sum==1&&ma[i]==0){
57             a[y]=i;break;
58         }
59     }
60     for(int i=1;i<=n;i++){
61         cout<<a[i]<<" ";
62     }
63     cout<<endl;
64 }
时间: 2024-08-11 07:37:17

#418(div2)B的相关文章

codeforces round 418 div2 补题 CF 814 A-E

A An abandoned sentiment from past 水题 #include<bits/stdc++.h> using namespace std; int a[300],b[300],n,k; bool cmp(int a,int b) { return a>b; } int main() {//freopen("t.txt","r",stdin); scanf("%d%d",&n,&k); f

#418(div2)A

题意:长度为n,m的2个数列a,b.a中有m个0,将m个数代替0,问是否只有一种放法让a为递增的,可以输出No,否则Yes 思路:当m大于1的时候,肯定是Yes,然后我们将他放进去试一下就行了 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int main(){ 5 int n,k; 6 cin>>n>>k; 7 int a[100]; 8 int b[100]; 9 for(int i=1;i<=n;i

cf386(div2)大一狗ACM之路

#cf386(div2)总结#前两题很顺利的做了出来, c题扔了, D题wrong了5发才A掉.A题签到题, 但是想多了, 代码写的有点长了. 找被整除最小值*7.B题 读题读了一会, 读完了就有思路了, 1A. 字符串问题, 从后往前两个两个的放到新的字符串里, 一个从最左, 一个从最右, 模拟指针扫着放, 最后特判会不会扫到一起.C题跳了没看, 最后做完了D题回来看了一眼没什么思路 日后再说.D题, 恩.. 两个多小时都用在这题上面了, 20分钟的时候做完了B之后就一直再啃D题, 暴力判断啊

Codeforces gym Hello 2015 Div1 B and Div2 D

Codeforces gym 100571 problem D Problem 给一个有向图G<V,E>和源点S,边的属性有长度L和颜色C,即E=<L,C>.进行Q次询问,每次给定一个点X,输出S到X的最短路的长度(不存在则输出 -1).但要求S到X的路径中相邻两条边颜色不一样. Limits Time Limit(ms): 1000 Memory Limit(MB): 256 |V|, |E|: [1, 10^5] X, S: [1, |V| ] L: [1, 10^9] |C|

编写css让div2在div1的右下角?

<style>#div1{ width:200px; height:200px; background-color:#F00;}#div2{ width:50px; height:50px; background:#FF0; position:relative; left:75%; top:75%; }</style></head> <body><div id="div1"> <div id="div2&quo

codeforces round #257 div2 C、D

本来应该认真做这场的,思路都是正确的. C题,是先该横切完或竖切完,无法满足刀数要求,再考虑横切+竖切(竖切+横切), 因为横切+竖切(或竖切+横切)会对切割的东西产生交叉份数,从而最小的部分不会尽可能的大. 代码如下,虽然比较长.比较乱,但完全可以压缩到几行,因为几乎是4小块重复的代码,自己也懒得压缩 注意一点,比如要判断最小块的时候,比如9行要分成2份,最小的剩下那份不是9取模2,而应该是4 m/(k+1)<=m-m/(k+1)*k          #include<bits/stdc+

codeforces Round #250 (div2)

a题,就不说了吧 b题,直接从大到小排序1-limit的所有数的lowbit,再从大到小贪心组成sum就行了 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #define N 200000 6 using namespace std; 7 int pos[N],a[N],s[N],f[N],la[N],b[N],i,j,k,ans,n,p

SRM621 (div2)

TwoWaysSorting sort.... NumbersChallenge 01dp... MixingColors loading..... SRM621 (div2),布布扣,bubuko.com

Codeforces 583 DIV2 Robot&#39;s Task 贪心

原题链接:http://codeforces.com/problemset/problem/583/B 题意: 就..要打开一个电脑,必须至少先打开其他若干电脑,每次转向有个花费,让你设计一个序列,使得总花费最小. 题解: 就傻傻的走就好..从左走到右,再走回来,更新序列和答案就好. 代码: #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> #define MA