題目鏈接:https://cn.vjudge.net/contest/235654#overview
建隊以來的第一場組隊賽,打的總體來說一般。
賽後總結一下,前期打得不錯,隊友手速A掉兩道水題。之後,就。。。
這次開的題其實挺多的,但可惜很多都沒做出來。
想D題,一開始思路跑了。。。
E題,莫名其妙寫掛了。。。
G題,debug了2小時,最後我們仨盯着電腦看了半個小時找出來了。。。
I題,窩想出了個O(n^2)的暴力算法,賽後查了一下,應該是對的(還沒補)。可是由於前面卡的題有點多以及對自己字符串處理的不自信,寫到一般沒寫完。。。
最後比賽結束,用Reply看了一下榜,RANK85,沒能擠進銀區,銅首。不過,這纔是第一場,相信以後會越來越好的~
因此窩待補的題有:
G
E
I
D
好了,下面進入正題,看幾道水題的題解(沒更新完,最近要忙期末考試,不過會持續更新~)
--------------------------------------------------------------------------------------------------------------------------
J - Judging Moose
思路:C語言上機題
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b;
scanf("%d%d",&a,&b);
if(a==0&&b==0)
printf("Not a moose\n");
else
{
if(a!=b)
printf("Odd %d\n",2*max(a,b));
else
printf("Even %d\n",a+b);
}
return 0;
}
B - Best Relay Team
思路:好像是簡單排序。隊友A的,賽後看了一下題解,應該不難。(這裏就用隊友的代碼了)
#include<cstdio> #include<algorithm> #include<iostream> #define maxn 505 using namespace std; struct node { string name; double t1,t2; int num; } p[maxn],tmp[maxn]; int max(int x,int y){ return x>y?x:y; } bool cmp(node a,node b){ return a.t2<b.t2; } int ansnum[5]; int main(){ int n; scanf("%d",&n); int k=-1; double mint1=100.0; for(int i=0;i<n;i++){ cin>>p[i].name>>p[i].t1>>p[i].t2; p[i].num=tmp[i].num=i; tmp[i].name=p[i].name; tmp[i].t1=p[i].t1; tmp[i].t2=p[i].t2; } double ans=100.0; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ p[j].num=tmp[j].num; p[j].name=tmp[j].name; p[j].t1=tmp[j].t1; p[j].t2=tmp[j].t2; } double t=0; t+=p[i].t1; sort(p,p+n,cmp); int k=0; for(int j=0;k<3;j++){ if(p[j].num!=i){ t+=p[j].t2; k++; } } if(ans>t){ ans=t; ansnum[0]=i; k=1; for(int j=0;k<=4;j++){ if(p[j].num!=i){ ansnum[k]=p[j].num; k++; } } } } printf("%.2f\n",ans); for(int i=0;i<4;i++){ for(int j=0;j<n;j++){ if(ansnum[i]==p[j].num) cout<<p[j].name<<endl; } } return 0; }
G - Galactic Collegiate Programming Contest
思路:好像方法很多。隊友用的是優先隊列來模擬,重載比較運算符。標程給的是set,也是重載。看網上還有人用BIT做,真是神奇~
這個是隊友寫的優先隊列的
#include<cstdio>
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
const int MAXN = 1e5+9;
int n, m;
bool in[MAXN];
struct node{
int id, a, b;
bool operator < (const node &y) const
{
return a==y.a?b<y.b:a>y.a;
}
}s[MAXN];
int main(){
priority_queue<node> Q;
scanf("%d%d", &n, &m);
for(int i=1; i<=n; ++i){
s[i].id=i;
}
int id, p;
while(m--){
scanf("%d%d", &id, &p);
s[id].a+=1;
s[id].b+=p;
if(1==id){
while(!Q.empty()){
node cur=Q.top();
if(s[1].a<cur.a||(s[1].a==cur.a&&s[1].b>cur.b)){
break;
}
else{
Q.pop();
in[cur.id]=false;
//printf("%d %d %d\n", s[1].a, s[2].a, s[3].a);
//printf("***%d %d\n", cur.a, s[cur.a].a);
if((s[cur.id].a>s[1].a||(s[cur.id].a==s[1].a&&s[cur.id].b<s[1].b))){
Q.push(s[cur.id]);
in[cur.id]=true;
}
}
}
}
else{
if(!in[id])
{
if(s[1].a<s[id].a||(s[1].a==s[id].a&&s[1].b>s[id].b))
{
Q.push(s[id]);
in[id]=true;
}
}
}
printf("%d\n", Q.size()+1);
}
return 0;
}
這個是我賽後補得set的
#include<bits/stdc++.h>
using namespace std;
bool vis[100010];
struct node
{
int x,y,z;
friend bool operator < (node a,node b)
{
if(a.x!=b.x)
{
return a.x<b.x;
}
else
{
if(a.y!=b.y)
return a.y>b.y;
else
{
return a.z>b.z;
}
}
}
node(){}
node(int x2,int y2,int z2)
{
x=x2;
y=y2;
z=z2;
}
} p[100010];
set<node> s;
int main()
{
int n,m;
int t1,t2;
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
scanf("%d%d",&t1,&t2);
p[t1].x++;
p[t1].y+=t2;
if(t1==1)
{
while(!s.empty())
{
node tem=*s.begin();
if((tem.x>p[1].x)||(tem.x==p[1].x&&tem.y<p[1].y))
break;
s.erase(s.begin());
}
}
else
{
s.erase(node(p[t1].x-1,p[t1].y-t2,t1));
if((p[t1].x>p[1].x)||(p[t1].x==p[1].x&&p[t1].y<p[1].y))
s.insert(node(p[t1].x,p[t1].y,t1));
}
printf("%d\n",s.size()+1);
}
return 0;
}
------------------------------------------------------------------------------------------------------------------------
(先寫到這,待更,預習期末考試去了~)