您的位置:首页 > 其它

CROC-MBTU 2012, Final Round (Online version, Div. 2)

2012-11-28 15:51 411 查看
A题:略。

B题:恶心的模拟题。

#include<iostream>
#include <fstream>
#include<vector>
#include<string>
using namespace std;
int n;
vector<string> cur;
int main()
{
int i,j,k;
cin>>n;
for(k=0;k<n;k++)
{
string s;
cin>>s;
cur.clear();
i=0;
while (i< s.length())
{
string c = "";
while(i<s.length()&&s[i]!=':')
{
c+=s[i];
i++;
}
i++;
if(i==1&&cur.size()==0) continue;
cur.push_back(c);
}
for(i=0; i<cur.size();i++)
{
for(j=cur[i].length();j<4;j++)
cout<<"0";
cout<<cur[i];
if(cur[i].length()==0)
{
for(j=cur.size();j<8;j++)
{
cout<<":0000";
}
}
if(i!=cur.size()-1)
cout<<":";
}
cout<<endl;
}
}


C题:题意是从1~k中选一个数x,在数组a中去掉所有的x,然后从左到右扫描,当数字改变时,ans++,求使ans最小的x。求解时先把相邻的相同的数压缩成一个数,存入另一个数组,然后逆向考虑,如果某个数左右两边的数相同,则去掉该数,改变的值少了2次,否则少1次,于是只要把每个数记录一遍就行了

#include <iostream>
using namespace std;
int a[100005],b[100001];
int main()
{
int n,i,j,k,t,sum;
while (cin >>n>>k)
{
sum=0;
j=0;
for (i=0;i<n;i++)
{
cin >>t;
if (a[j]!=t)
a[++j]=t;
}
for(i=1;i<=j;i++)
{
if(a[i-1]==a[i+1])
b[a[i]]+=2;
else
b[a[i]]+=1;
}
int ans=0;
for(i=1;i<=k;i++)
{
if (b[i]>b[ans])
ans=i;
}
cout <<ans<<endl;
}
return 0;
}


D题:如果暴力枚举yi和y'j,时间复杂度是n*m,但可以把y和y' 排序后,用贪心策略

#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
const int inf=999999999;
int n,m,a,b;
int y[100005],yy[100005],l[100005];

double pf(double x)
{
return x*x;
}

double count(int i, int j)
{
return sqrt(pf(y[i])+pf(a))+sqrt(pf(a-b)+pf(y[i]-yy[j]))+l[j];
}

int main()
{
int i,j,p,q;
double ans;
cin >>n>>m>>a>>b;
for (i=1;i<=n;i++)
cin >>y[i];
for (i=1;i<=m;i++)
cin >>yy[i];
for (i=1;i<=m;i++)
cin >>l[i];
sort(y+1,y+n);
sort(yy+1,yy+m);
ans=inf;
j=1;
for(i=1;i<=m;i++)
{
while(j<n&&count(j,i)>count(j+1,i))
j++;
if (ans>count(j,i))
{
ans=count(j,i);
p=j,q=i;
}
}
cout <<p<<" "<<q<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: