生活随笔
收集整理的這篇文章主要介紹了
Codeforces Round #601 (Div. 2)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
傳送門
文章目錄
- A.Changing Volume
- B. Fridge Lockers
- C. League of Leesins
- D. Feeding Chicken
- E1 E2. Send Boxes to Alice
A.Changing Volume
題意:
給你六個(gè)操作,問把aaa變成bbb最少幾步。
思路:
因?yàn)椴僮魇菍ΨQ的,所以轉(zhuǎn)換成把小的數(shù)變成大的數(shù)最少要幾步。首先依次遞增5,讓后再根據(jù)1,2,51,2,51,2,5拼mod5\bmod \ \ 5mod??5后的數(shù)即可。
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std
;
typedef long long LL
;
typedef unsigned long long ULL
;
typedef pair
<int,int> PII
;const int N
=1000010,mod
=1e9+7,INF
=0x3f3f3f3f;
const double eps
=1e-6;int a
,b
;int main()
{
int _
; scanf("%d",&_
);while(_
--){scanf("%d%d",&a
,&b
);if(a
>b
) swap(a
,b
);int c
=b
-a
;int ans
=0;ans
+=c
/5,c
%=5;if(c
>=1&&c
<=2) ans
++;else if(c
>=3&&c
<=4) ans
+=2;printf("%d\n",ans
);}return 0;
}
B. Fridge Lockers
題意:
給nnn個(gè)冰箱,讓你連mmm條邊,使得費(fèi)用最小且每個(gè)冰箱都是私人的,這里定義冰箱是私人的當(dāng)且僅當(dāng)這個(gè)冰箱的度數(shù)>1>1>1。
思路:
首先需要特判n=2n=2n=2的情況。
注意到m<=nm<=nm<=n,考慮當(dāng)m<nm<nm<n的時(shí)候,最多構(gòu)成一棵樹,這樣也是不能滿足的。所以只有m==nm==nm==n的情況才能滿足,也就是首尾相接,都練起來即可。
當(dāng)時(shí)沒看到m<=nm<=nm<=n,所以寫的麻煩了。
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std
;
typedef long long LL
;
typedef unsigned long long ULL
;
typedef pair
<int,int> PII
;const int N
=1000010,mod
=1e9+7,INF
=0x3f3f3f3f;
const double eps
=1e-6;int n
,m
;
int ans
;
vector
<PII
>v
;
struct Node
{int id
,val
;bool operator < (const Node
&w
) const{return val
<w
.val
;}
}a
[N
];bool check()
{if(m
<n
) return false;ans
=0;for(int i
=1;i
<=n
;i
++) v
.pb({a
[i
].id
,a
[(i
+1)>n
? 1:(i
+1)].id
}),ans
+=a
[i
].val
+a
[(i
+1)>n
? 1:(i
+1)].val
;m
-=n
;for(int i
=1;m
&&i
<=n
;i
++)for(int j
=i
+2;m
&&j
<=n
;j
++)v
.pb({a
[i
].id
,a
[j
].id
}),ans
+=a
[i
].val
+a
[j
].val
;return true;
}int main()
{
int _
; scanf("%d",&_
);while(_
--){scanf("%d%d",&n
,&m
); v
.clear();for(int i
=1;i
<=n
;i
++) scanf("%d",&a
[i
].val
),a
[i
].id
=i
;if(n
==2){puts("-1");continue;}sort(a
+1,a
+1+n
);if(check()){printf("%d\n",ans
);for(int i
=0;i
<v
.size();i
++) printf("%d %d\n",v
[i
].X
,v
[i
].Y
);}else puts("-1");}return 0;
}
C. League of Leesins
題意:
給一個(gè)長度為nnn的排列ppp,讓后取排列中相鄰的n?2n-2n?2個(gè)三元組,放到集合qqq中,三元組內(nèi)的順序可以變化,三元組間相對位置可以變化,讓后給你n?2n-2n?2個(gè)三元組,讓你還原一個(gè)可能的排列ppp。
思路:
首先注意到一個(gè)排列取三元組的話,首位和末位都只能出現(xiàn)一次,可以從這個(gè)入手,先找到出現(xiàn)一次的位置,把它放在開頭,讓后這個(gè)時(shí)候能唯一確定開頭的三元組是哪個(gè),以及確定首元素。那么開頭三元組剩下兩個(gè)元素位置怎么確定呢?我們發(fā)現(xiàn)出現(xiàn)次數(shù)少的哪個(gè)一定在出現(xiàn)次數(shù)多的哪個(gè)的后面,比如cnti<=cntjcnt_i<=cnt_jcnti?<=cntj?,那么三元組就是[first,i,j][first,i,j][first,i,j],不懂的可以自己模擬一下。接下來我們唯一確定了第一個(gè)三元組,讓后后面可以根據(jù)前一個(gè)的最后兩個(gè)值來調(diào)整位置,也是唯一確定的,一直遞推下去就好啦。
起了一些陰間變量名,寫錯(cuò)好幾個(gè)地方。。
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std
;
typedef long long LL
;
typedef unsigned long long ULL
;
typedef pair
<int,int> PII
;const int N
=1000010,mod
=1e9+7,INF
=0x3f3f3f3f;
const double eps
=1e-6;int n
;
int cnt
[N
];
map
<PII
,int>mp1
,mp2
;
struct Node
{int x
[3];
}a
[N
];void add(PII x
,int id
)
{if(mp1
.count(x
)&&mp2
.count(x
)) while(1);if(mp1
.count(x
)) mp2
[x
]=id
;else mp1
[x
]=id
;
}int main()
{
scanf("%d",&n
);for(int i
=1;i
<=n
-2;i
++){scanf("%d%d%d",&a
[i
].x
[0],&a
[i
].x
[1],&a
[i
].x
[2]),cnt
[a
[i
].x
[0]]++,cnt
[a
[i
].x
[1]]++,cnt
[a
[i
].x
[2]]++;int x
,y
,z
; x
=a
[i
].x
[0],y
=a
[i
].x
[1],z
=a
[i
].x
[2];add({min(x
,y
),max(x
,y
)},i
); add({max(x
,y
),min(x
,y
)},i
);add({min(x
,z
),max(x
,z
)},i
); add({max(x
,z
),min(x
,z
)},i
);add({min(z
,y
),max(z
,y
)},i
); add({max(z
,y
),min(z
,y
)},i
);sort(a
[i
].x
,a
[i
].x
+3);}int st
=0; PII pre
;for(int i
=1;i
<=n
;i
++) if(cnt
[i
]==1) { st
=i
; break; }for(int i
=1;i
<=n
-2;i
++){if(a
[i
].x
[0]==st
||a
[i
].x
[1]==st
||a
[i
].x
[2]==st
){if(a
[i
].x
[1]==st
) swap(a
[i
].x
[0],a
[i
].x
[1]);else if(a
[i
].x
[2]==st
) swap(a
[i
].x
[2],a
[i
].x
[0]),swap(a
[i
].x
[1],a
[i
].x
[2]);if(cnt
[a
[i
].x
[1]]<cnt
[a
[i
].x
[2]]) pre
={a
[i
].x
[1],a
[i
].x
[2]};else pre
={a
[i
].x
[2],a
[i
].x
[1]},swap(a
[i
].x
[1],a
[i
].x
[2]);st
=i
;break;}}vector
<int>ans
; ans
.pb(st
);for(int i
=1;i
<=n
-3;i
++){if(mp1
[pre
]==st
){st
=mp2
[pre
];ans
.pb(st
);}else{st
=mp1
[pre
];ans
.pb(st
);}int tem
=0;for(int i
=0;i
<3;i
++) if(a
[st
].x
[i
]!=pre
.X
&&a
[st
].x
[i
]!=pre
.Y
) tem
=a
[st
].x
[i
];a
[st
].x
[0]=pre
.X
,a
[st
].x
[1]=pre
.Y
; a
[st
].x
[2]=tem
;pre
={a
[st
].x
[1],tem
};}for(int i
=0;i
<ans
.size();i
++){int id
=ans
[i
];if(i
==0) printf("%d %d %d ",a
[id
].x
[0],a
[id
].x
[1],a
[id
].x
[2]);else printf("%d ",a
[id
].x
[2]);}return 0;
}
D. Feeding Chicken
題意:
給一個(gè)字符矩陣,′.′'.'′.′是空地,′R′'R'′R′是糧食。現(xiàn)在要給kkk個(gè)雞分配位置,要求每個(gè)雞分配的位置是連通的,且每個(gè)雞分配的糧食個(gè)數(shù)最大值與最小值差最小。
思路:
這個(gè)是個(gè)大水題,我們可以直接算一下能否給每個(gè)雞分配等量的‘R’‘R’‘R’個(gè)數(shù),不能的話把多余的拿出來等量分給一些雞就行了。還需要保證聯(lián)通,我們只需要像跑類似蛇一樣的路徑即可(imod2==1i\bmod 2==1imod2==1就從左到右,否則從右到左)。
最后有個(gè)比較坑的就是題目中′R′'R'′R′是跟你輸出的′R′'R'′R′是一樣的,可以把原題中′R′'R'′R′修改為其他字符,比如′[′'['′[′。
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std
;
typedef long long LL
;
typedef unsigned long long ULL
;
typedef pair
<int,int> PII
;const int N
=110,mod
=1e9+7,INF
=0x3f3f3f3f;
const double eps
=1e-6;int tot
,n
,m
,k
;
char s
[N
][N
];
map
<int,char>mp
;int main()
{
for(int i
=1;i
<=26;i
++) mp
[i
]='a'+i
-1;for(int i
=1,j
=27;i
<=26;i
++,j
++) mp
[j
]='A'+i
-1;for(int i
=0,j
=53;i
<=9;i
++,j
++) mp
[j
]='0'+i
;int _
; scanf("%d",&_
);while(_
--){tot
=0; int cnt
=0;scanf("%d%d%d",&n
,&m
,&k
);for(int i
=1;i
<=n
;i
++){scanf("%s",s
[i
]+1);for(int j
=1;j
<=m
;j
++) if(s
[i
][j
]=='R') cnt
++,s
[i
][j
]='[';}int num
=cnt
/k
;for(int i
=1;i
<=cnt
%k
;i
++){char ch
=mp
[++tot
]; int c
=num
+1;for(int i
=1;i
<=n
&&c
;i
++){if(i
%2==1){for(int j
=1;j
<=m
&&c
;j
++){if(s
[i
][j
]!='.'&&s
[i
][j
]!='[') continue;if(s
[i
][j
]=='[') c
--;s
[i
][j
]=ch
;}}else{for(int j
=m
;j
>=1&&c
;j
--){if(s
[i
][j
]!='.'&&s
[i
][j
]!='[') continue;if(s
[i
][j
]=='[') c
--;s
[i
][j
]=ch
;}}}}for(int i
=1;i
<=k
-cnt
%k
;i
++){char ch
=mp
[++tot
]; int c
=num
;for(int i
=1;i
<=n
&&c
;i
++){if(i
%2==1)for(int j
=1;j
<=m
&&c
;j
++){if(s
[i
][j
]!='.'&&s
[i
][j
]!='[') continue;if(s
[i
][j
]=='[') c
--;s
[i
][j
]=ch
;}elsefor(int j
=m
;j
>=1&&c
;j
--){if(s
[i
][j
]!='.'&&s
[i
][j
]!='[') continue;if(s
[i
][j
]=='[') c
--;s
[i
][j
]=ch
;}}}char ch
=mp
[tot
];for(int i
=1;i
<=n
;i
++){if(i
%2==1)for(int j
=1;j
<=m
;j
++){if(s
[i
][j
]!='.'&&s
[i
][j
]!='[') continue;s
[i
][j
]=ch
;}elsefor(int j
=m
;j
>=1;j
--){if(s
[i
][j
]!='.'&&s
[i
][j
]!='[') continue;s
[i
][j
]=ch
;}}for(int i
=1;i
<=n
;i
++) printf("%s\n",s
[i
]+1);}return 0;
}
E1 E2. Send Boxes to Alice
E1簡單點(diǎn),直接質(zhì)因子分解,以質(zhì)因子為組,取中間的位置,都往中間靠就好啦。
題解
總結(jié)
以上是生活随笔為你收集整理的Codeforces Round #601 (Div. 2)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。