Codeforces Round#277.5(Div.2)解題報告(A B C D)
3171 ワード
A. SwapSort
構想:大きいから小さいまで各位置に対して、もしその上の数が現在最大でなければ、勝手に最大の交換を探します.この問題は私が長い間穴をあけて、最小のswapの回数を探さなくてもいいことを見ていません...
B. BerSU Ball
考え方:まず数えて、それからスキャンして、ペアリングできる全ペアリングをすればいいです.
C. Given Length and Sum of Digits...
考え方:数を合法化するために、まず最高位置1で、それから暴力は低位/高位から加数すればいい.特殊判定と0の長さが1の場合が必要です.
D. Unbearable Controversy of Being
構想:起点を列挙し、2歩歩き、cnt[i]をある起点の2歩からiまで歩く方法数とし、結果にcnt[i]*(cnt[i]-1)/2を加える.2歩歩いた後、起点に戻らないように注意してください.
構想:大きいから小さいまで各位置に対して、もしその上の数が現在最大でなければ、勝手に最大の交換を探します.この問題は私が長い間穴をあけて、最小のswapの回数を探さなくてもいいことを見ていません...
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int a[3010];
int b[3010];
int main(){
int n;
while(cin>>n){
for(int i=0;i>a[i];
b[i]=a[i];
}
sort(b,b+n);
int ans=0;
vector swa;
for(int i=n-1;i>0;i--){
if(a[i]==b[i])continue;
for(int j=0;j
B. BerSU Ball
考え方:まず数えて、それからスキャンして、ペアリングできる全ペアリングをすればいいです.
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int cntB[110];
int cntG[110];
int main(){
int n,m;
cin>>n;
for(int i=0;i>t; cntB[t]++;
}
cin>>m;
for(int i=0;i>t; cntG[t]++;
}
int ans=0;
for(int i=1;i<=100;i++){
while(cntB[i]&&cntG[i-1]){
cntB[i]--;
cntG[i-1]--;
ans++;
}
while(cntB[i]&&cntG[i]){
cntB[i]--;
cntG[i]--;
ans++;
}
while(cntB[i]&&cntG[i+1]){
cntB[i]--;
cntG[i+1]--;
ans++;
}
}
cout<
C. Given Length and Sum of Digits...
考え方:数を合法化するために、まず最高位置1で、それから暴力は低位/高位から加数すればいい.特殊判定と0の長さが1の場合が必要です.
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int ans1[110];
int ans2[110];
int main(){
int m,s;
while(cin>>m>>s){
memset(ans1,0,sizeof(ans1));
memset(ans2,0,sizeof(ans2));
if(m==1&&s==0){
cout<=1;i--){
while(ans1[i]<9){
if(tmp<=0)break;
ans1[i]++;
tmp--;
}
if(tmp<=0)break;
}
if(tmp!=0){
cout<
D. Unbearable Controversy of Being
構想:起点を列挙し、2歩歩き、cnt[i]をある起点の2歩からiまで歩く方法数とし、結果にcnt[i]*(cnt[i]-1)/2を加える.2歩歩いた後、起点に戻らないように注意してください.
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define ll long long
vector E[3010];
ll cnt[3010];
int main(){
int n,m;
while(cin>>n>>m){
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
E[u].push_back(v);
}
ll ans=0;
for(int k=1;k<=n;k++){
memset(cnt,0,sizeof(cnt));
queue que;
int siz=E[k].size();
for(int i=0;i1){
ans+=cnt[i]*(cnt[i]-1)/2;
}
}
}
cout<