Codeforces Round#277.5(Div.2)解題報告(A B C D)

3171 ワード

A. SwapSort
構想:大きいから小さいまで各位置に対して、もしその上の数が現在最大でなければ、勝手に最大の交換を探します.この問題は私が長い間穴をあけて、最小の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<