题目
L2-001 紧急救援 (25 分)
最短路问题:
#include <bits/stdc++.h>
using namespace std;
const int N = 605;
int n, m, c1, c2;
int g[N][N], dist[N], cnt[N], st[N], sum[N], w[N]; //cnt是道路的条数,sum是救援队总数,w是救援队
void dij()
{
memset(dist, 0x3f, sizeof dist);
dist[c1] = 0, sum[c1] = w[c1], cnt[c1] = 1;
for (int i = 0; i < n; i++)
{
int t = -1;
for (int j = 0; j < n; j++)
{
if (!st[j] && (t == -1 || dist[j] < dist[t]))
{
t = j;
}
}
st[t] = 1;
for (int j = 0; j < n; j++)
{
if (dist[j] > dist[t] + g[t][j])
{
dist[j] = dist[t] + g[t][j];
sum[j] = sum[t] + w[j];
cnt[j] = cnt[t];
}
else if (dist[j] == dist[t] + g[t][j])
{
cnt[j] += cnt[t];
sum[j] = max(sum[j], sum[t] + w[j]);
}
}
}
cout << cnt[c2] << " " << sum[c2];
}
int main()
{
memset(g, 0x3f, sizeof g);
cin >> n >> m >> c1 >> c2;
for (int i = 0; i < n; i++)
{
cin >> w[i];
}
while (m--)
{
int a, b, c;
cin >> a >> b >> c;
g[a][b] = min(g[a][b], c);
g[b][a] = min(g[b][a], c);
}
dij();
}
L2-002 链表去重 (25 分)
L2-003 月饼 (25 分)
#include<bits/stdc++.h>
using namespace std;
const int N=1005;
struct node{
double a;
double b;
double c;
}moon[N];
bool cmp(node x,node y){
return x.c>y.c;
}
int main(){
int n,d;
cin>>n>>d;
for(int i=1;i<=n;i++){
cin>>moon[i].a;
}
for(int i=1;i<=n;i++){
cin>>moon[i].b;
moon[i].c=(moon[i].b)/moon[i].a;
}
sort(moon+1,moon+1+n,cmp);
int j=1;
double ans=0;
while(d>0&&j<=n){ //被坑了一个点,j<=n 当最大库存大于0但圆饼全部卖完时也break
if(d>=moon[j].a){
ans+=(moon[j].b);
d-=moon[j].a;
}
else{
ans+=(d/moon[j].a)*(moon[j].b);
d=0;
}
j++;
}
printf("%.2f",ans);
}
L2-004 这是二叉搜索树吗? (25 分)
L2-005 数叶子节点(25 分)
#include <bits/stdc++.h>
using namespace std;
const int N = 10005;
vector<int> v[N];
int d[N]; // 叶子节点个数s
int maxdepth;
void dfs(int u,int depth){
if(!v[u].size()){
d[depth]++;
maxdepth = max(maxdepth, depth);
return ;
}
for (int i = 0; i < v[u].size();i++){
dfs(v[u][i], depth + 1);
}
}
int main()
{
int n, m;
cin >> n >> m;
while(m--){
int id, k;
cin >> id >> k;
for (int i = 0; i < k;i++){
int son;
cin >> son;
v[id].push_back(son);
}
}
dfs(1, 0);
cout<<d[0];
for (int i = 1; i <=maxdepth;i++){
cout << " "<<d[i];
}
}
L2-006 树的遍历 (25 分)
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
using namespace std;
const int N = 40;
int n;
int postorder[N], inorder[N];
unordered_map<int, int> l, r, pos;
int q[N];
int build(int il, int ir, int pl, int pr)
{
int root = postorder[pr];
int k = pos[root];
if (il < k) l[root] = build(il, k - 1, pl, pl + (k - 1 - il));
if (k < ir) r[root] = build(k + 1, ir, pl + (k - 1 - il) + 1, pr - 1);
return root;
}
void bfs(int root)
{
int hh = 0, tt = 0;
q[0] = root;
while (hh <= tt)
{
int t = q[hh ++ ];
if (l.count(t)) q[ ++ tt] = l[t];
if (r.count(t)) q[ ++ tt] = r[t];
}
cout << q[0];
for (int i = 1; i < n; i ++ ) cout << ' ' << q[i];
cout << endl;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i ++ ) cin >> postorder[i];
for (int i = 0; i < n; i ++ )
{
cin >> inorder[i];
pos[inorder[i]] = i;
}
int root = build(0, n - 1, 0, n - 1);
bfs(root);
return 0;
}
L2-008 最长对称子串 (25 分)
#include<bits/stdc++.h>
using namespace std;
int main(){
string s;
getline(cin,s);
int ans=-1;
for(int i=0;i<s.size();i++)
{
for(int j=s.size()-1;j>=i;j--)
{
int l=i,r=j;
while(s[l]==s[r] && l<=r)
{
l++;
r--;
}
if(l>r)
{
ans=max(ans,j-i+1);
}
}
}
cout<<ans;
}
L2-010 排座位 (25 分)
#include<bits/stdc++.h>
using namespace std;
int par[1001],enm[1111][1111];
int find(int x){
return par[x]==x?x:par[x]=find(par[x]);
}
void unite(int x,int y){
x=find(x);
y=find(y);
if(x!=y){
par[y]=x;
}
}
int main(){
memset(enm,0,sizeof enm);
int n,m,k;
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
par[i]=i;
}
for(int i=1;i<=m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(c==1){
unite(a,b);
}
else{
enm[a][b]=1;
enm[b][a]=1;
}
}
while(k--){
int a,b;
cin>>a>>b;
if(find(a)==find(b)&&enm[a][b]==0){
printf("No problem\n");}
else if(find(a)==find(b)&&enm[a][b]==1){
printf("OK but...\n");
}
else if(find(a)!=find(b)&&enm[a][b]==0){
printf("OK\n");
}
else {
printf("No way\n");
}
}
}
L2-029 特立独行的幸福 (25 分)
谷歌的招聘
#include<iostream>
#include<bits/stdc++.h>
#include<algorithm>
using namespace std;
bool isPrimer(int a)
{
bool flag=true;
for(int i=2; i<sqrt(a); i++)
{
if(a%i==0)
{
flag=false;
break;
}
}
return flag;
}
int main()
{
int L,K,p;
cin>>L>>K;
getchar();
string s,b;
getline(cin,s);
if(s.length()>=K)
{
for(int i=0; i<=s.length()-K; i++)
{
b=s.substr(i,K); //itoa(number, string,10)数字变字符
p=atoi(b.c_str()); // stoi(s)字符串转数字
if(isPrimer(p))
{
cout<<b;
return 0;
}
}
}
cout<<"404";
return 0;
}
L2-013 红色警报
#include<bits/stdc++.h>
using namespace std;
int par[100001],fail[100001]={0};
struct node{
int u;
int v;
}edge[100001];
int find(int u){
return u==par[u]?u:par[u]=find(par[u]);
}
void unite(int x,int y){
x=find(x); y=find(y);
if(x!=y) {
par[x]=y;
}
}
int main(){
int n,m;
int num1=0;
cin>>n>>m;
for(int i=0;i<n;i++){
par[i]=i;
}
for(int i=0;i<m;i++){
cin>>edge[i].u>>edge[i].v;
unite(edge[i].u,edge[i].v);
}
for(int i=0;i<n;i++){
if(par[i]==i){
num1++;
}
}
memset(fail,0,sizeof fail);
int k;
cin>>k;
while(k--){
int num2=0;
for(int i=0;i<n;i++){
par[i]=i;
}
int q;
cin>>q;
fail[q]=1;
for(int i=0;i<m;i++){
if(fail[edge[i].u]==1||fail[edge[i].v]==1)
continue;
else
unite(edge[i].u,edge[i].v);
}
for(int i=0;i<n;i++){
if(par[i]==i){
num2++;
}
}
if(num1==num2||num1+1==num2){
cout<<"City "<<q<<" is lost."<<endl;
}
else{
cout<<"Red Alert: City "<<q<<" is lost!"<<endl;
}
num1 = num2;
}
int ans=0;
for(int i=0;i<n;i++){
if(fail[i]){
ans++;
}
}
if(ans==n)cout<<"Game Over."<<endl;
}
L2-014 列车调度
#include<bits/stdc++.h>
using namespace std;
set<int> st;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int k;
cin>>k;
auto it=st.lower_bound(k);
if(it!=st.end()){
st.erase(it);
st.insert(k);
}
else{
st.insert(k);
}
}
cout<<st.size();
}
L2-015 互评成绩
#include<bits/stdc++.h>
const int N=100005;
#define LL long long
using namespace std;
int q[N][11];
double d[N];
int main(){
int n,m,k;
cin>>n>>m>>k;
for(int i=0;i<n;i++){
int ma=0,mi=101;
for(int j=0;j<m;j++){
scanf("%d",&q[i][j]);
if(ma<q[i][j])ma=q[i][j];
if(mi>q[i][j])mi=q[i][j];
}
d[i]=(accumulate(q[i],q[i]+m,0)-ma-mi)*1.0/(m-2);
}
sort(d,d+n);
printf("%.3f",d[n-k]);
for(int i=n-k+1;i<n;i++){
printf(" %.3f",d[i]);
}
}
L2-016 愿天下有情人都是失散多年的兄妹
#include<bits/stdc++.h>
using namespace std;
int n,t;
const int N=100005;
bool st[N];
bool flag=0;
vector<int> ve[N];
char sex[N];
void dfs(int x,int num){
if(num>=4)return ;
for(int i=0;i<ve[x].size();i++){
if(!st[ve[x][i]]){
st[ve[x][i]]=1;
dfs(ve[x][i],num+1);
}
else{
flag=1;
return ;
}
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
int k;
char c;
int x,y;
scanf("%d %c %d %d",&k,&c,&x,&y);
sex[k]=c;
if(x!=-1){
ve[k].push_back(x);
sex[x]='M';
}
if(y!=-1){
ve[k].push_back(y);
sex[y]='F';
}
}
cin>>t;
while(t--){
flag=0;
int x,y;
memset(st,0,sizeof st);
cin>>x>>y;
if(sex[x]==sex[y]){
puts("Never Mind");
}
else{
dfs(x,0);
dfs(y,0);
if(flag){puts("No");}
else{puts("Yes");}
}
}
}
L2-017 人以群分
#include<bits/stdc++.h>
using namespace std;
int a[10000002];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
int n1=accumulate(a,a+n/2,0);
int n2=accumulate(a+n/2,a+n,0);
if(n%2==0){
cout<<"Outgoing #: "<<n/2<<endl;
cout<<"Introverted #: "<<n/2<<endl;
cout<<"Diff = "<<abs(n2-n1)<<endl;
}
else{
cout<<"Outgoing #: "<<n/2+1<<endl;
cout<<"Introverted #: "<<n/2<<endl;
cout<<"Diff = "<<abs(n2-n1)<<endl;
}
}
L2-019 悄悄关注
#include<bits/stdc++.h>
using namespace std;
map <string,int> mp;
int main(){
int n;
string s[40001];
cin>>n;
int sum=0;
for(int i=0;i<n;i++){
cin>>s[i];
mp[s[i]]=-1;
}
int t;
bool flag=0;
cin>>t;
string str;
int num;
int m=t;
while(t--){
cin.get();
cin>>str>>num;
sum+=num;
// int cnt=str[0]*8+str[1]*4+str[2]*2+str[3];
if(mp[str]!=-1){
mp[str]=num;
}
}
int ave=sum/m;
for(auto it : mp){
if(it.second>ave){
flag=1;
cout<<it.first<<endl;
}
}
if(!flag){cout<<"Bing Mei You";}
}
L2-020 功夫传人
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
bool st[N];
double z,r;
vector<int> ve[N];
double sum=0;
void dfs(int idx,double power){
if(st[idx]){
sum+=ve[idx][0]*power;
return ;}
for(int i=0;i<ve[idx].size();i++){
dfs(ve[idx][i],power*(1-r));
}
}
int main(){
int n;
cin>>n>>z>>r;
r=r/100;
int k;
int x;
for(int i=0;i<n;i++){
cin>>k;
if(!k){
cin>>x;
st[i]=1;
ve[i].push_back(x);
}
else{
for(int j=0;j<k;j++){
cin>>x;
ve[i].push_back(x);
}
}
}
dfs(0,z);
cout<<(int)sum;
}