今天下午做了个模拟,99分,最后一题一个点超时,没办法了,希望明天能满分,90分的时候是4点,99分时候是4.20,想优化想了一会儿
1140:
这题一开始没看懂,把后面三题全做了才回来看的,意思就是用第n+1个数可以说出第n个数,很像递归有没有,举个例子,第n个字符串是122111的话,那么第n+1个就是1个1,2个2,3个1,即112213,以此类推
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<unordered_map>
#include<string.h>
#include<set>
using namespace std;
int main()
{
//freopen("test.txt", "r", stdin);
string s;
int n;
cin >> s >> n;
n--;
while (n--)
{
string res;
int len = s.length();
int cnt = 1;
char pre = s[0];
for (int i = 1; i < len; ++i)
{
if (pre != s[i]) {
res.push_back(pre);
res.push_back(cnt + '0');
cnt = 1;
pre = s[i];
}
else if (pre == s[i])cnt++;
}
res.push_back(s[len-1]);
res.push_back(cnt + '0');
s.clear();
s = res;
}
cout << s;
return 0;
}
接下来两道水题都是一次过的没啥好说
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<unordered_map>
using namespace std;
unordered_map<string, int> str2int;
unordered_map<int, string> int2str;
int cnt = 1;
int getid(string s)
{
if (str2int[s] == 0) {
str2int[s] = cnt++;
}
int2str[str2int[s]] = s;
return str2int[s];
}
unordered_map<int, double> schoolscore;
unordered_map<int, int>renshu;
struct resnode {
string sname;
int calscore, pnum;
resnode(string ss, int aa, int bb) {
sname = ss;
calscore = aa;
pnum = bb;
}
};
vector<resnode> finres;
string trans(string s)
{
for (int i = 0; i < s.length(); ++i)
{
if (s[i] >= 'A'&&s[i] <= 'Z')
{
s[i] = s[i] - 'A' + 'a';
}
}
return s;
}
bool cmp(resnode a, resnode b)
{
return a.calscore != b.calscore ? a.calscore > b.calscore:(a.pnum == b.pnum ? a.sname < b.sname : a.pnum < b.pnum);
}
int main()
{
//freopen("test.txt", "r", stdin);
int n;
scanf("%d\n", &n);
for (int i = 0; i < n; ++i)
{
char c;
scanf("%c", &c);
int id, score;
string school;
cin >> id >> score >> school;
school = trans(school);
scanf("\n");
int schoolid = getid(school);
double cal_score = (double)score;
switch (c) {
case 'B':
cal_score /= 1.5;
break;
case 'T':
cal_score *= 1.5;
break;
}
schoolscore[schoolid] += cal_score;
renshu[schoolid]++;
}
for (int i = 1; i < cnt; ++i)
{
string tmpname = int2str[i];
int ren = renshu[i];
int finscore = schoolscore[i];
resnode tmp(tmpname, finscore, ren);
finres.push_back(tmp);
}
sort(finres.begin(), finres.end(), cmp);
printf("%d\n", cnt-1);
int rank = 1;
cout << rank << " " << finres[0].sname << " " << finres[0].calscore << " " << finres[0].pnum << endl;
for (int i = 1; i < finres.size(); ++i)
{
if (finres[i].calscore < finres[i - 1].calscore)rank = i + 1;
cout <<rank<<" "<< finres[i].sname << " " << finres[i].calscore << " " << finres[i].pnum << endl;
}
return 0;
}
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<unordered_map>
#include<string.h>
using namespace std;
bool g[250][250];
bool isin[250];
int main()
{
//freopen("test.txt", "r", stdin);
memset(g, 0, sizeof(g));
int nv, ne;
scanf("%d%d", &nv, &ne);
for (int i = 0; i < ne; ++i)
{
int s, e;
scanf("%d%d", &s, &e);
g[s][e] = g[e][s] = 1;
}
int q;
scanf("%d", &q);
while (q--)
{
memset(isin, 0, sizeof(isin));
int num;
scanf("%d", &num);
int flag = 0;
vector<int> cur;
for (int i = 0; i < num; ++i)
{
int n;
scanf("%d", &n);
isin[n] = 1;
cur.push_back(n);
}
for (int i = 0; i < num - 1; ++i)
{
for (int j = i + 1; j < num; ++j)
{
if (g[cur[i]][cur[j]] == 0)flag = 1;
if (flag == 1)break;
}
if (flag == 1)break;
}
if (flag == 1) {
printf("Not a Clique\n");
continue;
}
else {
int flag2 = 0;
for (int j = 1; j <= nv; ++j)
{
if (isin[j] == 0) {
int i = 0, flag1 = 0;
for (i; i < cur.size(); ++i) {
if (g[cur[i]][j] == 0) {
flag1 = 1;
break;
}
}
if (flag1 == 1 && i < cur.size())continue;
else if (flag1 == 0 && i == cur.size()) {
printf("Not Maximal\n");
flag2 = 1;
break;
}
}
}
if (flag2 == 0) {
printf("Yes\n");
continue;
}
}
}
return 0;
}
最后一题其实也没有什么好说的,就是普通的建树,然后lca我一开始是用了set,将其中一个的所有父节点都插入进去,然后将另一个的所有父节点比较,有相同的就说明找到了lca,就退出循环,这样得了21分,然后后来优化,我用了一个标记,两个节点同时向上遍历,具体的自己看代码
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<unordered_map>
#include<string.h>
#include<set>
using namespace std;
int pre[10010];
struct bstnode {
bstnode* l = NULL, *r = NULL, *p = NULL;
int val, tag=0;
};
void build(bstnode* &root, int l, int r, bstnode* p)
{
if (root == NULL) root = new bstnode();
int rval = pre[l];
root->val = rval;
root->p = p;
int index = l + 1;
while (index <= r && pre[index] < rval)index++;
int llen = index - l - 1;
int rlen = r - index + 1;
if (llen > 0)build(root->l, l + 1, index - 1, root);
if (rlen > 0)build(root->r, index, r, root);
}
bstnode* search(int val, bstnode* tree)
{
/*if (tree == NULL)return NULL;
else if (tree->val == val)return tree;
else if (tree->val > val)return search(val, tree->l);
else if (tree->val < val)return search(val, tree->r);*/
bstnode* c = tree;
while (c != NULL)
{
if (val == c->val)return c;
else if (val < c->val)c = c->l;
else c = c->r;
}
if (c == NULL)return NULL;
}
int main()
{
//freopen("test.txt", "r", stdin);
int q, n;
scanf("%d%d", &q, &n);
for (int i = 0; i < n; ++i)scanf("%d", &pre[i]);
bstnode* root = NULL;
build(root, 0, n - 1, NULL);
while (q--)
{
int a, b;
scanf("%d%d", &a, &b);
bstnode* aaddr = search(a, root);
bstnode* baddr = search(b, root);
if (aaddr == NULL || baddr == NULL) {
if (aaddr != NULL)printf("ERROR: %d is not found.\n", b);
else if (baddr != NULL)printf("ERROR: %d is not found.\n", a);
else printf("ERROR: %d and %d are not found.\n", a, b);
continue;
}
//
int flag = 0;
bstnode* p = aaddr->p;
while (p != NULL)
{
if (p == baddr) {
flag = 1;
printf("%d is an ancestor of %d.\n", b, a);
break;
}
p = p->p;
}
if (flag == 1)continue;
flag = 0;
p = baddr->p;
while (p != NULL)
{
if (p == aaddr) {
flag = 1;
printf("%d is an ancestor of %d.\n", a, b);
break;
}
p = p->p;
}
if (flag == 1)continue;
//
bstnode* pa = aaddr->p, *pb = baddr->p;
while (true)
{
if (pa != NULL)
{
if (pa->tag == 1) {
printf("LCA of %d and %d is %d.\n", a, b, pa->val);
break;
}
else {
pa->tag = 1;
pa = pa->p;
}
}
if (pb != NULL)
{
if (pb->tag == 1) {
printf("LCA of %d and %d is %d.\n", a, b, pb->val);
break;
}
else {
pb->tag = 1;
pb = pb->p;
}
}
}
pa = aaddr->p, pb = baddr->p;
while (pa!=NULL&&pa->tag == 1) {
pa->tag = 0;
pa = pa->p;
}
while (pb!=NULL&&pb->tag == 1) {
pb->tag = 0;
pb = pb->p;
}
}
return 0;
}