2018"百度之星"程序设计大赛 - 资格赛-1001,1002,1006

1001-调查问卷

2018

思路:暴力所有问题集即1-->(1< imap保存下来,imap[t]++;这样所有的试卷结果都分开了,再计算不同试卷的对数即可。

Code :

#include
#include
#include
#include
using namespace std;

const int MAX_N=1055;
int n,m,p,T;
string a[MAX_N];
int d[MAX_N];

int main()
{
	ios::sync_with_stdio(false);
	cin>>T;
	for(int k=1;k<=T;++k){
		cin>>n>>m>>p;
		for(int i=0;i>a[i];
		for(int i=0;i imap;
			for(int j=0;j=p)	ans++;
		}
		cout<<"Case #"<

 

1002-子串查询

2018

思路:对于s[l,r]中的最小字典序子串即为按照a-z的顺序s[l,r]中存在的那个,因此可以预处理出a-z所有出现的下标分开保存,在遍历a-z,二分查找即可。

另一思路是可以用数组分别将a-z的前缀和保存下来,直接查询即可

code  二分:

#include
#include
#include
using namespace std;

int n,Q,T;
string str;

int main()
{
	ios::sync_with_stdio(false);
	cin>>T;
	for(int t=1;t<=T;++t)
	{
		vector ive[30];
		cin>>n>>Q>>str;
		for(int i=0;i>l>>r;
			int ans=0;
			for(int i=0;i<26;++i)
				if(ive[i].size()){
					int t1=lower_bound(ive[i].begin(),ive[i].end(),l)-ive[i].begin();
					int t2=lower_bound(ive[i].begin(),ive[i].end(),r+1)-ive[i].begin();
					if(t1!=ive[i].size()&&ive[i][t1]<=r){
						ans=t2-t1;	break;
					}
				}
			cout<

code  数组:

#include
using namespace std;

const int MAX_N=100005;
int n,Q,T;
string str;
int d[30][MAX_N];

int main()
{
	ios::sync_with_stdio(false);
	cin>>T;
	for(int t=1;t<=T;++t)
	{
		cin>>n>>Q>>str;
		for(int i=0;i>l>>r;
			int ans=0;
			for(int i=0;i<26&&!ans;++i)
				ans=d[i][r]-d[i][l-1];
			cout<

 

1006-三原色图

2018

思路:大致思路就是分红绿,蓝绿两次分别查找最小生成树s1,s2,在将剩下的边由小到大排序v1,v2,每次取s1+v1[i],s2+v2[i]的最小值输出即可

Code :

#include
#include
#include
using namespace std;

struct node{
	int u;
	int v;
	int w;
	char c;
	bool operator<(const node &p)const{
		return w e;
vector v1,v2;

int Find(int x);
int Kruskal(char c);
int main()
{
	ios::sync_with_stdio(false);
	cin>>T;
	for(int t=1;t<=T;++t)
	{
		e.clear();	v1.clear();	v2.clear();
		cin>>n>>m;
		int u,v,w;
		char c;
		for(int i=0;i>u>>v>>w>>c;
			e.push_back(node{u,v,w,c});
		}
		sort(e.begin(),e.end());
		int s1=Kruskal('R');
		int s2=Kruskal('B');
		vector vv1,vv2;
		vv1.push_back(0);	vv2.push_back(0);
		for(int i=0,k=0;i

 

你可能感兴趣的:(枚举,生成树,百度之星)