题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4445
这题正好就是大一小学期的时候好像是曦曦出的那个牛那题吧,就是要买多少块板然后正好把牛给拦完。这题也是一样,就是找最大的距离,当做隔板,依次把最大的距离去掉,最后的就是最小的了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define llson j<<1,l,mid
#define rrson j<<1|1,mid+1,r
#define INF 0x7fffffff
#define maxn 1010
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
//freopen("test.txt","r",stdin);
int t;
scanf("%d",&t);
for(int ii=1;ii<=t;ii++)
{
int n,m,i,sum=0,a[102];
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
scanf("%d",a+i);
sort(a,a+n);
for(i=1;i<n;i++)
a[i-1]=a[i]-a[i-1];
sort(a,a+n-1);
for(i=0;i<n-m;i++)
sum+=a[i];
printf("Case #%d: %d\n",ii,sum);
}
return 0;
}
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4448
这题刚开始我也没想好怎么做,因为找最小的,所以感觉和最小生成做有并。但是怎么有关的,想了好久,原来是预处理那里。先打发电站放进并查集里就行了,然后求出来的最小生成树肯定就是最小的啦。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define llson j<<1,l,mid
#define rrson j<<1|1,mid+1,r
#define INF 0x7fffffff
#define maxn 1010
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
struct abc
{
int u,v,w;
bool operator<(const abc &a)const
{
return w<a.w;
}
}a[40005];
int f[202],t,i,j,k,n,m,fa,power;
int find(int x)
{
return x==f[x]?x:f[x]=find(f[x]);
}
int kruscal()
{
sort(a,a+m);
int sum=0;
for(j=0;j<m;j++)
{
int x=find(a[j].u);
int y=find(a[j].v);
if(x!=y) sum+=a[j].w,f[y]=x;
}
return sum;
}
int main()
{
//freopen("test.txt","r",stdin);
scanf("%d",&t);
for(i=1;i<=t;i++)
{
scanf("%d%d%d",&n,&m,&k);
for(j=0;j<=n;j++)
f[j]=j;
scanf("%d",&fa);
for(j=1;j<k;j++)
{
scanf("%d",&power);
f[power]=fa;
}
for(j=0;j<m;j++)
scanf("%d%d%d",&a[j].u,&a[j].v,&a[j].w);
printf("Case #%d: %d\n",i,kruscal());
}
return 0;
}
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4450
思路:一看题就知道是哈希了,因为把后面的与前面的比较,如果相等就加2, 这样一直下去得到的肯定是最大的回文。然后第一发WA是忘了注释文件了,第二发WA是ABBBA这个例子没过,原来是while循环那写成了r1<l2了,改成r1<=l2才行,因为……这个不用解释了;然后交了还是WA,尼玛,神坑啊……然后别人都是用暴力做的,然后就想自己难道用哈希错了??然后又试了几个样列都对,就想了肯定哈希一定过,只是哪里错了。然后想啊想,想起以前有道哈希是因为种子的原因然后有冲突的时候,把种子131改成1313就过了,尼玛……真的有冲突!!!!
原来冲突是因为:以前写的131的种子的时候是写成hash[i]=hash[i-1]*seed+s[i]的,然后现在写成hash[i]=hash[i-1]*seed+s[i]-'A'+1;就起冲突了,所以得记住这个问题啊!!!教训啊!!!!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define llson j<<1,l,mid
#define rrson j<<1|1,mid+1,r
#define INF 0x7fffffff
#define maxn 50010
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
ull hash[maxn],base[maxn];
char s[maxn];
int main()
{
//freopen("test.txt","r",stdin);
int t,ii;
for(ii=1,base[0]=1;ii<maxn;ii++)
base[ii]=base[ii-1]*1313;
scanf("%d",&t);
for(ii=1;ii<=t;ii++)
{
scanf("%s",s);
int i,len=strlen(s);
if(len==1)
{
printf("Case #%d: 1\n",ii);
continue;
}
for(i=1,hash[0]=0;i<=len;i++)
hash[i]=hash[i-1]*1313+s[i-1]-'A'+1;
int l1=0,r1=1,l2=len-1,r2=len,sum=0;
while(r1<=l2)
{
ull hash1=hash[r1]-hash[l1]*base[r1-l1];
ull hash2=hash[r2]-hash[l2]*base[r2-l2];
if(hash1==hash2)
{
//cout<<l1<<' '<<r1<<' '<<l2<<' '<<r2<<endl;
sum+=2,l1=r1,r2=l2;
}
r1++,l2--;
}
if(r1-l1>1||r2-l1==1) sum++;
printf("Case #%d: %d\n",ii,sum);
}
return 0;
}
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4451
思路:这题刚才开始看的时候,就觉得应该是用堆做了,因为是取最优的,就是取最小或者最大的,这正好符合堆的性质。但是该怎么修改堆里面的东西呢,就是这里我没想明白,以前也没有遇到过这种边修改边查询的堆,然后……就没有然后了……不机智啊!
想了好久,实在不行了,就看了下题解,原来很简单的思想,把所有的都初始为时间0,就是同一个起点了,然后就好比较了。同一个速率放同一堆里就行了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#include<set>
#include<cmath>
#include<bitset>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson i<<1,l,mid
#define rson i<<1|1,mid+1,r
#define llson j<<1,l,mid
#define rrson j<<1|1,mid+1,r
#define INF 0x7fffffff
#define maxn 50010
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
//freopen("test.txt","r",stdin);
int t,ii;
scanf("%d",&t);
for(ii=1;ii<=t;ii++)
{
int n,t,s,r;
char str[2];
priority_queue<int,vector<int>,less<int> >q[101];
scanf("%d",&n);
printf("Case #%d:\n",ii);
while(n--)
{
scanf("%s%d",str,&t);
if(str[0]=='P')
{
scanf("%d%d",&s,&r);
q[r].push(s-r*t);
}
else
{
ll Max=0,ans;
for(int i=0;i<101;i++)
if(!q[i].empty())
{
ll MM=(ll)i*(ll)t+(ll)q[i].top();
if(MM>=Max) ans=i,Max=MM;
}
q[ans].pop();
printf("%lld %d\n",Max,ans);
}
}
}
return 0;
}