//昨天做了一下以前的上海热身赛,贴一下代码留个纪念
//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[n]=v[n];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; }