codeforces 125 A-E 补题

Measuring Lengths in Baden

进制转换 水题

#include<bits/stdc++.h>
using namespace std;


int main()
{
 int n;
 scanf("%d",&n);
 int a=n/36;
 n-=a*36;
 int b=(n)/3;
 if((n%3)>=2)b++;
 while(b>=12)b-=12,a+=1;
 printf("%d %d
",a,b);
 return 0;
}

Simple XML

用栈实现的括号匹配相信大家都会 

当然所有栈都可以用更直接粗暴的方法实现。

#include <iostream>

using namespace std;

int main()
{
    string s; int x=0,y=0;
    cin >> s;
    for(int i=0; s[i]; i++)if(s[i]=='>')
    {
        if(s[i-2]=='/')y-=2;
        for(int i=0; i<y; i++)cout<<" ";
        for(int j=x; j<=i; j++)cout<<s[j]; cout<<endl;
        if(s[i-2]!='/')y+=2;x=i+1;
    }
}

Hobbits' Party

很简单的贪心构造

#include<bits/stdc++.h>
using namespace std;

const int N=500;
vector<int> gues[N];
int main()
{
 gues[1].resize(2);gues[2].resize(2);gues[3].resize(2);
 gues[1][0]=1;gues[1][1]=2;
 gues[2][0]=1;gues[2][1]=3;
 gues[3][0]=2;gues[3][1]=3;
 int k;
 scanf("%d",&k);
 k-=3;
 int t=3;
 int i;
 for( i=4;;i++)
 	{
 	 if((i-1)>k)break;
 	 for(int j=1;j<=i-1;j++)
 	 	{
 	 	 gues[j].push_back((t+j));
 	 	 gues[i].push_back((t+j));
		}
	 t+=(i-1);
	 k-=(i-1);
	}
 printf("%d
",i-1);
 for(int j=1;j<i;j++)
 {
 
 	for(int k=0;k<gues[j].size();k++)
 		printf("%d ",gues[j][k]);
    printf("
");
 }
 return 0;
}

  

Two progressions

给定一个序列 试问能否将它拆分成两个等差数列 满足元素之间的相对位置不改变

暴力分配每个元素属于第一个还是第二个序列即可

剪枝:每个元素对于每个公差的序列只用搜索一次(证明方法自己思考)

#include<cstdio>
#include<set>
using namespace std;

int n, al, bl, ff, i; 
int s[30000], a[30000], b[30000];
set<int> visa[30000], visb[30000];

void dfs(){
	if(al == n) return;
	if(al + bl == n) {ff = 1; return;}
	if(al < 2 || s[al+bl]-a[al-1] == a[al-1]-a[al-2] && (visb[al+bl].find(a[al-1]-a[al-2])==visb[al+bl].end())){
		a[al] = s[al+bl];
		if(al>1) visa[al+bl].insert(a[al]-a[al-1]);
		al++;
		dfs();
		if(ff) return;
		al--;
	}
	if(bl < 2 || s[al+bl]-b[bl-1] == b[bl-1]-b[bl-2] && (visa[al+bl].find(b[bl-1]-b[bl-2])==visa[al+bl].end())){
		b[bl] = s[al+bl];
		if(bl>1) visb[al+bl].insert(b[bl]-b[bl-1]);
		bl++;
		dfs();
		if(ff) return;
		bl--;
	}
}

int main(){
	scanf("%d", &n);
	for(i = 0; i < n; i++)
		scanf("%d", &s[i]);
	ff = al = bl = 0;
	dfs();
	if(ff){
		for(i = 0; i < al; i++)
			printf("%d ", a[i]);
		printf("
");
		for(i = 0; i < bl; i++)
			printf("%d ", b[i]);
		printf("
");
	}
	else
		printf("No solution
");
	return 0;
}

  

MST Company

传送门

原文地址:https://www.cnblogs.com/heisenberg-/p/6994740.html