Codeforces Round #433
我会4题,写了两题,还提交错误n次,掉了40rating(哭丧脸),又被学长D飞了。
学长:我很心疼你的成绩啊;
我:第四题忘记加特判了。。。
学长:暴力还能写挂。
我:。。。。。。
———————————————————我是分割线———————————————————
T1:给定一个n,求一个分数a/b(满足a+b=n)且gcd(a,b)=1,使这个分数<1且最大。。
我:。。。。
#include<cstdio> #include<cmath> using namespace std; int gcd(int x,int y){return y==0?x:gcd(y,x%y);} int n; int main(){ scanf("%d",&n); for(int i=(n-1)/2;i>=1;i--){ if(gcd(i,n-i)==1){printf("%d %d\n",i,n-i);break;} } }
———————————————————我是分割线———————————————————
T2:一共有n个点,其中k个点已经有人居住,求旁边有人居住的空置的点至少有几个,最多有几个。
我:。。。。。。(如果n==k||k==0输出0 0,否则输出1和j(k*3<=n?j=n-k:j=k*2))
我:假题。
#include<cstdio> using namespace std; long long n,k; int main(){ scanf("%I64d%I64d",&n,&k); if(n==k||k==0)puts("0 0"); else { printf("1 "); if(k*3<=n)printf("%I64d",k*2); else printf("%I64d",n-k); } }
———————————————————我是分割线———————————————————
T3:有n个航班, 第i个航班原始是从第i秒起飞的。不过由于延误,前k秒不能起飞飞机,要求你让每一个航班在k+1~k+n秒中选一个时间起飞(不能重复),而且每一个航班延误1秒花费的代价为ci,要你求最小的代价。
我:。。题目正常了。
感觉尽量让ci越大的航班延误时间越小越好。所以。。大胆猜想!不用证明!
我们把ci按照时间顺序扔进大根堆里中,然后统计答案就好了。
然后我想到了,考场上没来得及写啊(抓狂~~~)
#include<cstdio> #include<vector> #include<queue> using namespace std; int g[300005],n,k,c[300005]; typedef pair<int,int> ii; int main(){ int n,k; scanf("%d%d",&n,&k); for(int i=0;i<n;i++)scanf("%d",&c[i]); priority_queue<ii>pq;k--; long long cost=0; for(int i=0;i<n||(!pq.empty());i++){ if(i<n) pq.push(ii(c[i],i)); if(i>k){ ii re=pq.top(); pq.pop(); cost+=1LL*re.first*(i-re.second); g[re.second]=i+1; } } printf("%I64d\n",cost); for(int i=0;i<n;i++) printf("%d ",g[i]); }
———————————————————我是分割线———————————————————
T4:一共有m张机票,每趟飞机要么从0号点飞向其他点,要么从其他点飞向0号点,给你每趟飞机的到达时间,1-n个城市里刚好有编号为1-n的人,求让这n个人同时在0号城市呆k天且最后回到城市的最小花费是多少。。(时间大小<=1000000)
我:这题目有点意思。、、、
过了一会儿。。。
我:这不就是暴力枚举吗。。。正着枚举一遍时间轴,求1-100000s时n个人到达0号城市的代价,然后反着再枚举一遍时间轴,求n个人回到各自城市的代价。
然后统计答案就好了,暴力题。(考场上写特判挂了。。。)
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; long long Min(long long a,long long b){return a<b?a:b;} struct hh{ long long d,f,t,c; }gg[100001]; long long n,m,k,cost[100001],sum,qc[1000001],l,qian,ans=999999999999999; bool cmp(hh x,hh y){return x.d<y.d;} int main() { scanf("%I64d%I64d%I64d",&n,&m,&k); for(int i=1;i<=m;i++) scanf("%I64d%I64d%I64d%I64d",&gg[i].d,&gg[i].f,&gg[i].t,&gg[i].c); sort(gg+1,gg+1+m,cmp); l=n;qian=1; for(long long i=1;i<=1000000;i++) { while(gg[qian].d==i) { if(!cost[gg[qian].f]&&gg[qian].f!=0) { cost[gg[qian].f]=gg[qian].c; sum+=gg[qian].c; l--; } else { if(cost[gg[qian].f]>gg[qian].c) { sum+=gg[qian].c-cost[gg[qian].f]; cost[gg[qian].f]=gg[qian].c; } } qian++; } if(!l) qc[i]=sum; else qc[i]=-1; } qian=m;l=n;sum=0; memset(cost,0,sizeof cost); for(long long i=1000000;i>=k+2;i--) { while(gg[qian].d==i) { if(!cost[gg[qian].t]&&gg[qian].f==0) { cost[gg[qian].t]=gg[qian].c; sum+=gg[qian].c; l--; } else { if(cost[gg[qian].t]>gg[qian].c) { sum+=gg[qian].c-cost[gg[qian].t]; cost[gg[qian].t]=gg[qian].c; } } qian--; } if(l==0&&qc[i-k-1]!=-1) ans=Min(ans,sum+qc[i-k-1]); } if(ans!=999999999999999) printf("%I64d",ans); else printf("-1"); }
———————————————————我是分割线———————————————————