您的位置:首页 > 大数据 > 人工智能

The 36th ACM/ICPC Asia Regional Shanghai Site —— Warmup

2012-09-22 09:19 501 查看
 

//昨天做了一下以前的上海热身赛,贴一下代码留个纪念

 

//1001-贪心

代码如下:

#include<stdio.h>
__int64 num[110000];
int main()
{
int n,cass,cas,i;
__int64 a,b,ans,tem;
scanf("%d",&cass);
for(cas=1;cas<=cass;cas++)
{
scanf("%d%I64d%I64d",&n,&a,&b);
for(i=1;i<=n;i++)
scanf("%I64d",&num[i]);
ans=a+b;
for(i=2;i<=n;i++)
{
tem=(num[i]-num[i-1]-1)*b;
if(tem<a*2)
ans+=tem;
else ans+=a*2;
ans+=b;
}
ans+=a;
printf("Case #%d: %I64d\n",cas,ans);
}
return 0;
}


//1005-规律题,枚举几组数据,再加上用例就可以推出规律了

//代码如下:

#include<stdio.h>
int main()
{
int cas,cass;
double n,m,k;
scanf("%d",&cass);
for(cas=1;cas<=cass;cas++)
{
scanf("%lf%lf",&m,&k);
n=(m+1)*k+1;
printf("Case #%d: %.8lf\n",cas,1/n);
}
return 0;
}


//1006-搜索,利用位与运算的性质来剪枝,a&b<=MIN(a,b);

//代码如下:

#include<stdio.h>
#include<algorithm>
using namespace std;
int n,k;
__int64 v[50],Min,sum[50];
void dfs(__int64 num,int dep,int p)
{
__int64 tem=num;
if(num<Min)Min=num;
if(dep>=k||p>n)return;
tem&=sum[p];
if(tem>=Min)return;
dfs(num&v[p],dep+1,p+1);
dfs(num,dep,p+1);
}
int main()
{
__int64 start;
int cass,cas,i;
scanf("%d",&cass);
for(cas=1;cas<=cass;cas++)
{
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
scanf("%I64d",&v[i]);
sort(v+1,v+n+1);
for(i=n-1,sum
=v
;i>0;i--)
sum[i]=sum[i+1]&v[i];
Min=v[1];
for(i=2;i<=k;i++)Min&=v[i];
start=1;
start<<=63;
start=~start;
dfs(start,0,1);
printf("Case #%d: %I64d\n",cas,Min);
}
return 0;
}


//1008-模拟题

//代码如下:

#include<stdio.h>
char str[10000];
int main()
{
int cas,cass,i,flag;
scanf("%d",&cass);
for(cas=1;cas<=cass;cas++)
{
scanf("%s",str);
flag=0;
printf("Case #%d: ",cas);
for(i=0;str[i];i++)
{
if(flag&&(str[i]==':'||str[i]=='/'))
break;
if(flag)putchar(str[i]);
if(str[i]=='/'&&str[i+1]=='/')
{
i+=2;
flag=1;
putchar(str[i]);
}
}
putchar('\n');
}
return 0;
}


//1010-分类排序+树状数组

//代码如下:

#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
struct node
{
__int64 cnt,len;
};
bool cmp(node a,node b){return a.cnt>b.cnt;}
vector <node> customer[510000];
__int64 sum[1010000];
__int64 v[1010000];
int lowbit(int n){return n&(-n);}
void add(int p,int n,__int64 v)
{
int i;
for(i=p;i<=n;i+=lowbit(i))
sum[i]+=v;
}
__int64 getsum(int p)
{
__int64 ss=0;
for(;p>0;p-=lowbit(p))
ss+=sum[p];
return ss;
}
int main()
{
int cass,cas,n,m,q,i,j,k,maxlen;
scanf("%d",&cass);
for(cas=1;cas<=cass;cas++)
{
scanf("%d%d%d",&n,&m,&q);
for(i=1;i<=m;i++)
{
node tem;
scanf("%d%I64d%I64d",&k,&tem.cnt,&tem.len);
customer[k].push_back(tem);
}
maxlen=0;
for(i=1;i<=n;i++)
{
m=customer[i].size();
if(m>maxlen)maxlen=m;
sort(customer[i].begin(),customer[i].end(),cmp);
}
for(i=0;i<=maxlen;i++)
sum[i]=0;
for(i=1;i<=n;i++)
{
for(j=0;j<customer[i].size();j++)
add(j+1,maxlen,customer[i][j].len);
}
for(i=1;i<=maxlen;i++)
v[i]=getsum(i);
printf("Case #%d:\n",cas);
while(q--)
{
scanf("%d",&k);
if(k>maxlen)
k=maxlen;
printf("%I64d\n",v[k]);
}
for(i=1;i<=n;i++)
customer[i].clear();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  vector
相关文章推荐