HELLO WORLD !!!

The real hero is

to see the world as it is

and to love it !

figvalar

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
  • L2-008 最长对称子串
    要学会做题之前计算时间复杂度,选择/优化算法。
    要学会中间遍历的思想。

include<bits/stdc++.h>

using namespace std;

int main()
{
string str;
int ans = 0;
getline(cin, str);

for (int i = 0; i <str.size(); i++)
{
	int l = i - 1, r = i + 1;
	while(l>=0&&r<str.size()&&str[l] == str[r])l--, r++;
	l++, r--;
	ans = max(ans, r-l+1);
	l = i, r = i + 1;
	while(l>=0&&r<str.size()&&str[l] == str[r]) l--, r++;
	l++, r--;
	ans = max(ans, r-l+1);
}
cout << ans << '\n';
return 0;

}

  • L2-009 抢红包
    模拟,结构体排序。
    复习重载小于号:

include<bits/stdc++.h>

using namespace std;
const int N = 1e4+10;

struct nod
{
int val, num, id;//金额,抢到个数,编号。
bool operator < (const nod &b) const
{
if(val == b.val)
{
if(num == b.num) return id < b.id;
else return num > b.num;
}
else return val > b.val;
};
};
nod dat[N];

int main()
{
int n; cin >> n;
for (int i = 1; i <= n; i++)
{
int k; cin >> k;
dat[i].id = i;
for(int j = 0; j < k; j++)
{
int who, value;
cin >> who >> value;
dat[i].val -=value;
dat[who].val += value;
dat[who].num++;
}
}
sort(dat + 1, dat + 1 + n);
for(int i = 1; i <= n; i++)
{
printf("%d %.2lf\n", dat[i].id, dat[i].val/100.0);
}
return 0;
}

  • L2-010 排座位

include<bits/stdc++.h>

using namespace std;
const int N = 110;
int fa[N], g[N][N];

int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]);}

void merge(int x, int y)
{
int xx = find(x), yy = find(y);
if(xx == yy) return;
fa[yy] = xx;
return;
}

int main()
{
int n, m, k; cin >> n >> m >> k;
for(int i = 1; i <= n; i++) fa[i] = i;
for(int i = 0; i < m; i++)
{
int x, y, z;
cin >> x >> y >> z;
g[x][y] = g[y][x] = z;
if(z == 1) merge(x, y);
}

while(k--)
{
	int x, y; 
	cin >> x >> y;
	int xx = find(x), yy = find(y);
	if(xx == yy && g[x][y] != - 1) cout << "No problem\n";
	else if(xx != yy && g[x][y] != -1) cout << "OK\n";
	else if(xx == yy && g[x][y] == -1) cout << "OK but...\n";
	else cout << "No way\n";
}
return 0;

}

  • L2-011 玩转二叉树

include<bits/stdc++.h>

using namespace std;
const int N = 40;
int in[N], pre[N];

struct nod{
int val;
nod* lef = NULL;
nod* rig = NULL;
};

nod* build(int inl, int inr, int prel, int prer)
{
if(inl>inr) return NULL;
else if(inl == inr)
{
nod* p = (nod)malloc(sizeof(nod));
p -> val = pre[prel];
return p;
}
int x = pre[prel];
nod
p = (nod)malloc(sizeof(nod));
p -> val = x;
int i;
for(i = inl; i<=inr && in[i]!=x; i++) ;
p->lef = build(inl, i-1, prel+1, prel+1+((i-1)-inl+1)-1);
p->rig = build(i+1, inr, prel+1+((i-1)-inl+1), prer);
return p;
}
queue q;
int main()
{
int n; cin >> n;
for(int i = 0; i < n; i++) cin >> in[i];
for(int i = 0; i < n; i++) cin >> pre[i];
nod
head = build(0,n-1,0,n-1);
q.push(head);
while(q.size())
{
auto x = q.front();
q.pop();
if(x.val != head -> val) cout << ' ';
cout << x.val;
if(x.rig!=NULL) q.push(
(x.rig));
if(x.lef!=NULL) q.push(*(x.lef));
}
return 0;
}

  • L2-012 关于堆的判断
    学习:
    小根堆,up,down函数

include<bits/stdc++.h>

using namespace std;
int tre[5000], idx = 1;

void up(int x)
{
if(x==1)return;
else
{
if(tre[x/2]>tre[x])
{
swap(tre[x/2],tre[x]);
up(x/2);
}
}
}

int main()
{
int n, m; cin >> n >> m;
for(int i = 0; i < n; i++)
{
int x; cin >> x;
tre[idx] = x;
up(idx);
idx++;
}
getchar();
while(m--)
{
string str;
int x, y;
getline(cin,str);
if(str.find("root")!=string::npos)
{
sscanf(str.c_str(),"%d is the root",&x);
int i;
for(i = 1; i < idx; i++) if(tre[i] == x) break;
if(i == 1) cout << "T\n";
else cout << "F\n";
}
else if(str.find("siblings")!=string::npos)
{
sscanf(str.c_str(),"%d and %d are siblings", &x, &y);
int i, j;
for(i = 1; i < idx; i++) if(tre[i]x) break;
for(j = 1; j < idx; j++) if(tre[j]
y) break;
if(i/2 == j/2) cout << "T\n";
else cout << "F\n";
}
else if(str.find("parent")!=string::npos)
{
sscanf(str.c_str(),"%d is the parent of %d", &x, &y);
int i, j;
for(i = 1; i < idx; i++) if(tre[i]x) break;
for(j = 1; j < idx; j++) if(tre[j]
y) break;
if(i == j/2) cout << "T\n";
else cout << "F\n";
}
else if(str.find("child")!=string::npos)
{
sscanf(str.c_str(),"%d is a child of %d", &x, &y);
int i, j;
for(i = 1; i < idx; i++) if(tre[i]x) break;
for(j = 1; j < idx; j++) if(tre[j]
y) break;
if(i/2 == j) cout << "T\n";
else cout << "F\n";
}
}
return 0;
}

  • L2-013 红色警报

include <bits/stdc++.h>

using namespace std;

int fa[510];
int find(int x) {return fa[x] == x ? x : fa[x] = find(fa[x]);}
void merge(int x, int y)
{
int xx = find(x), yy = find(y);
if(xx == yy) return;
else fa[xx] = yy;
return;
}
//结构体存边
struct nod
{
int x, y;
bool flag = 0;
};
nod edge[5010];

int main()
{
int n, m; cin >> n >> m;
int landcount = 0;
for(int i = 0; i < n; i++) fa[i] = i;

for(int i = 0; i < m; i++)
{
	cin >> edge[i].x >> edge[i].y;
	merge(edge[i].x, edge[i].y);
} 
for (int s = 0; s < n; s++) if(fa[s] == s) landcount++;
int k; cin >> k;
for(int ss = 0; ss < k; ss++)
{
	int lostcity; cin >> lostcity;
	int nowlandcount = 0;
	for(int s = 0; s < n; s++) fa[s] = s;
	for(int i = 0; i < m ;i++)
	{
		if(edge[i].flag == 1 || edge[i].x == lostcity || edge[i].y == lostcity)
		{
			edge[i].flag = 1;
			continue;
		}
		merge(edge[i].x, edge[i].y);
	}
	for (int s = 0; s < n; s++) if(fa[s] == s) nowlandcount++; 
	if(nowlandcount >= landcount + 2) printf("Red Alert: City %d is lost!\n", lostcity);
	else printf("City %d is lost.\n", lostcity);
	landcount = nowlandcount;
}
if(k == n) printf("Game Over.\n");
return 0;

}

  • L2-014 列车调度

//Dilworth定理,最长上升子序列,最长下降子序列

include<bits/stdc++.h>

using namespace std;
const int N = 100010;
int dat[N];
vector q;

int main()
{

int n; cin >> n;
for(int i = 0; i < n; i++)
{
	cin >> dat[i];
}

for(int i = 0; i < n; i++)
{
	if(i == 0||q[q.size() - 1] < dat[i])
	{
		q.push_back(dat[i]);
	}
	int l = 0, r = q.size() - 1;
	while(l < r)
	{
		int mid = (l+r)/2;
		if(dat[i]<q[mid]) r = mid;
		else l = mid + 1;
	}
	q[l] = dat[i];
}
cout << q.size();
return 0;

}

  • L2-015 互评成绩

include<bits/stdc++.h>

using namespace std;

int main()
{
int n, k, m; cin >> n >> k >> m;
vector a;
for(int i = 0; i < n; i++)
{
int sum = 0, Min = 1e9, Max = 0;
for(int j = 0; j < k; j++)
{
int x; cin >> x;
sum+=x;
Max = max(Max, x);
Min = min(Min, x);

	}
	sum -= Max + Min;
	a.push_back(1.0*sum/(k-2));
}
sort(a.begin(), a.end());
for(int i = a.size() - m ; i < a.size(); i++)
{
	printf("%.3lf",a[i]);
	if(i < a.size() - 1) printf(" ");
} 
return 0;

}

  • L2-016 愿天下有情人都是失散多年的兄妹
    投降了,没调出来

  • L2-017 人以群分

include<bits/stdc++.h>

using namespace std;
using ll = long long;
int main()
{
int n; cin >> n;
vector a;
a.push_back(0);
for(int i = 1; i <= n; i++)
{
int x; cin >> x;
a.push_back(x);
}
sort(a.begin(),a.end());
ll sum1 = 0, sum2 = 0;
for(int i = 1; i <= n; i++)
{
if(i <= n/2) sum1+=a[i];
else sum2+=a[i];
}

printf("Outgoing #: %d\nIntroverted #: %d\nDiff = %d", n - n/2, n/2, sum2 - sum1);
return 0;

}

  • L2-018 多项式A除以B

  • L2-019 悄悄关注

include<bits/stdc++.h>

using namespace std;
map<string, bool> mp;

int main()
{
int n; cin >> n;
for(int i = 1; i <= n; i++)
{
string s; cin >> s;
mp[s] = 1;
}

int k; cin >> k;
double sum = 0;
vector<pair<string ,int>> a;
for(int i = 1; i <= k; i++)
{
	string s; cin >> s;
	int x; cin >> x;
	sum += x;
	if(!mp.count(s)) a.push_back({s, x});
}
sum = 1.0 * sum / k;
sort(a.begin(), a.end());
bool ok = 0;
for(int i = 0; i < a.size(); i++)
{
	if(a[i].second > sum)
	{
		cout << a[i].first << '\n';
		ok = 1;
	}
}
if(!ok) cout << "Bing Mei You\n";
return 0;

}

posted on 2025-04-06 10:08  figvalar  阅读(10)  评论(0)    收藏  举报