西安邮电大学第五届ACM-ICPC校赛(同步赛)
https://ac.nowcoder.com/acm/contest/5678
A 拯救咕咕咕之史莱姆(签到)
题意:略。
题记:按照题目意思计算一下即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main(){
ll n;
while(cin>>n&&n){
if(n<=75)
cout<<"AOLIGEI!"<<endl;
else
cout<<"DAAAAAMN!"<<endl;
}
return 0;
}
B 烦人的依赖(拓扑排序)
题意:略。
题记:首先将字符串转换为数字的形式存图(需要通过字符串也可以找到相应的数字),然后进行拓扑排序即可。
#include<bits/stdc++.h>
using namespace std;
const int N=3e4+10,M=1e5+10;
string mp2[N];
int head[N];
int cnt;
int g[N];
struct Edge{
int to,next;
}edge[M];
void addedge(int u,int v){
edge[cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt++;
}
int main(){
int T,cas=1;
cin>>T;
while(T--){
unordered_map<string,int>mp1;
cnt=0;
memset(head,-1,sizeof(head));
memset(g,0,sizeof(g));
int n,m;
cin>>n>>m;
string s;
for(int i=1;i<=n;i++){
cin>>s;
mp1[s]=i;
mp2[i]=s;
}
string s1,s2;
while(m--){
cin>>s1>>s2;
int u,v;
u=mp1[s1];
v=mp1[s2];
addedge(u,v);
g[v]++;
}
priority_queue<string,vector<string>,greater<string>>q;
for(int i=1;i<=n;i++){
if(!g[i])
q.push(mp2[i]);
}
vector<string>ans;
while(!q.empty()){
string str=q.top();
q.pop();
ans.push_back(str);
int j=mp1[str];
for(int i=head[j];i!=-1;i=edge[i].next){
int v=edge[i].to;
g[v]--;
if(!g[v])
q.push(mp2[v]);
}
}
cout<<"Case #"<<cas++<<":"<<endl;
if(ans.size()!=n)
cout<<"Impossible"<<endl;
else
for(auto x:ans)
cout<<x<<endl;
}
return 0;
}
C
D
E 无敌阿姨(模拟)
题意:略。
题记:简单模拟。
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int a[N];
int main(){
int T;
cin>>T;
while(T--){
int n,m,k;
cin>>n>>m>>k;
for(int i=0;i<n;i++)
cin>>a[i];
int ans=0,i=0;
while(i<n){
int x=m;
ans++;
while(x>0){
if(x<a[i]){
a[i]-=x;
x=0;
}
else{
x-=a[i];
if(x>k){
x-=k;
i++;
}
else{
x=0;
i++;
}
}
}
}
cout<<ans<<endl;
}
return 0;
}
F
G 校车(水题)
题意:略。
题记:用map记录一下每个点有多少个人上车和下车(上车加下车减),map的长度就是站点数量,从头到尾把map的所有值加上,取过程中的最大值就是座位数量。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int main(){
int T;
cin>>T;
while(T--){
map<int,int>mp;
int n;
cin>>n;
int x,y;
for(int i=0;i<n;i++){
cin>>x>>y;
mp[x]++;
mp[y]--;
}
map<int,int>::iterator i;
int ans1=mp.size(),ans2=0,sum=0;
for(i=mp.begin();i!=mp.end();i++){
//cout<<i->second<<endl;
sum+=i->second;
ans2=max(ans2,sum);
}
cout<<ans1<<' '<<ans2<<endl;
}
return 0;
}