第3次总结

首先是PTA


#include <bits/stdc++.h>

using namespace std;

struct person {
	string name;
	int likes;
} *Person;

bool cmp(pair<string, int> a, pair<string, int> b)
{
	return a.first < b.first;	
}

int main()
{
	int n;
	cin >> n;
	person persons[n];
	map<string, person> mpname;
	for(int i = 0;i < n;i ++)
	{
		cin >> persons[i].name;
		mpname[persons[i].name] = persons[i];
	}
	int m;
	cin >> m;
	double sum = 0;
	vector<pair<string, int>> vec(0);
	vector<pair<string, int>> rvec(0);
	for(int i = 0;i < m;i ++)
	{
		string name;
		int likes;
		cin >> name >> likes;
		if(mpname.count(name) > 0)
		{
			mpname[name].likes = likes;
		} else {
			pair<string, int> np(name, likes);
			vec.push_back(np);
		}
//		mpname[name].name = name
		sum += likes;
	}
	int aver = sum / m * 1.0;
//	cout << aver << endl;
	int len = vec.size();
	for(int i = 0;i < len;i ++)
	{
		if(vec[i].second > aver && mpname.count(vec[i].first) <= 0)
		{
			rvec.push_back(vec[i]);
		}
	}
	sort(rvec.begin(), rvec.end(), cmp);
	
	if(rvec.size() > 0) 
		for(int i = 0;i < rvec.size();i ++)
		{
			cout << rvec[i].first;
			if(i != rvec.size() - 1) cout << endl;
		}
	else 
	{
		cout << "Bing Mei You";
	}
	return 0;
}

 大概思路:

用map记录第一行输入的关注的用户名

在接下来输入用户名的时候,先只存储未关注的用户名(通过map的count来判断是否记录这个用户名,即这个用户是否在关注列表里),不做处理,记录点赞总数

输入完毕后,求得点赞平均值,然后再遍历一遍记录的未关注用户名列表,当他的点赞数超过平均值,就把这个关注用户记录到另外一个vector容器里

记录完“可能的秘密关注用户”列表后,对记录的vector容器进行排序(代码里的rvec, 这里使用了自定义排序),完毕后,依次输出rvec里的用户名即可。


 

#include <bits/stdc++.h>

using namespace std;

int main()
{
	int n;
	cin >> n;
	vector<int> vec(0), vc(0);
	int cnt = 0;
	vector<int>::iterator it;
	getchar();
	for(int i = 0;i < n;i ++)
	{
		string tmp;
		getline(cin, tmp, '\n');
//		cout << tmp.substr(0, 4) << endl;
		if(tmp.size() == 3)
		{
			if(vc.size() >= 1)
			{
				cout << vc[vc.size() - 1] << endl;
				it = lower_bound(vec.begin(), vec.end(), vc[vc.size() - 1]);
				vc.pop_back();
				vec.erase(it);
				cnt --;
			}
			else
			{
				cout << "Invalid" << endl;
			}	
			continue;
		}
		else if(tmp.substr(0, 4) == "Push")
		{
			int a = atol(tmp.substr(4).c_str());
			it = lower_bound(vec.begin(), vec.end(), a);
//			cout << a << endl;
			vec.insert(it, a);
			vc.push_back(a);
			cnt ++;
		}
		else
		{
//			cout << vec.size() << endl;
			if(vec.size() < 1)
			{
				cout << "Invalid" << endl;
			}
			else
			{
				if((vec.size()) % 2 == 0)
				{
					cout << vec[((vec.size()) / 2) - 1] << endl;
				} else {
					cout << vec[((vec.size()) / 2)] << endl;
				}
			}
		}
	}
	return 0;
}

大概思路:

特殊栈,要提取小元,这里使用vector容器比较方便,因为我认为它同时拥有“随机访问”和类似栈的特点。

但是用1个vector容器是不够的,因为这样没法存储“所有键值”的中值,输出的结果是不正确的。于是我们要用2个vector容器,一个当类栈用,一个顺序存储所有键值,用于提取中值。

这里用到了vector的iterator,用于顺序存储键值的vector容器的插入新键值以及删除栈顶时同步删除指定键值。

输出时,注意顺序存储键值的vector容器的大小,偶数和奇数有不同的输出位置。


#include<iostream>

#define int long long

using namespace std;

const int maxn = 1e6 + 1;

typedef struct Bend{
	int startTime;
	int ifBorrow;
} bend;

bend bends[maxn];

main()
{
	int n;
	cin >> n;
	
	for(int i = 0;i < maxn;i ++)
	{
		bends[i].ifBorrow = 0;	
	}
		
	int num, H = 0, M = 0, borrowTime = 0, cnt = 0;
	char uselessChar, mode;
	for(int i = 0;i < n;i ++)
	{
		borrowTime = 0;
		cnt = 0;
		while(1)
		{
			cin >> num >> mode >> H >> uselessChar >> M;
			if(num == 0) break;
			if(mode == 'S')
			{
				bends[num].startTime = H * 60 + M;
				bends[num].ifBorrow = 1;
			}
			else if(mode == 'E' && bends[num].ifBorrow == 1)
			{
				borrowTime += H * 60 + M - bends[num].startTime; 
				cnt ++;
				bends[num].ifBorrow = 0; 
			}
			
		}
		if(cnt != 0) cout << cnt << ' ' << (int)(borrowTime * 1.0 / cnt + 0.5) << endl;
		else cout << "0 0" << endl;
	}
}

 大概思路:

比较“细节”的输入处理,比较关键的是存储的是每本书的相关数据而不是借阅者的。

这里用结构体表示书本,它们都各自有自己的借阅开始时间和是否被借走标记,后者用于处理无效的还书数据。

关键的部分处理完成后,就是加减法和输出了。


#include<bits/stdc++.h>

#define int long long

using namespace std;

main()
{
	int column;
	cin >> column;
	getchar();
	string str;
	getline(cin, str, '\n');      
	 
	int len = str.size();
	int row;
	if(len % column != 0)
	{
		row = len / column + 1;
	} else {
		row = len / column;
	}	
	
	char p[column][row];
	
	for(int i = 0;i < column;i ++)
		for(int j = 0;j < row;j ++)
			p[i][j] = ' ';
			
	int m = 0;
	for(int i = row - 1;i >= 0;i --)
	{
		for(int j = 0;j < column;j ++)
		{
			p[j][i] = str[m];
//			cout << str[m] << endl;
			if(m == len - 1) break;
			m ++;
		} 
	}

	for(int i = 0;i < column;i ++)
	{
		for(int j = 0;j < row;j ++)
		{
			cout << p[i][j];
		} 
		if(i != column - 1) cout << endl;
	}
} 

 大概思路:

一道输出题题题题题,主要就是比较细节的数组大小处理以及赋值逻辑,形成这样的“古风排版”主要还是比较消耗精力和时间去调整细节。


#include<bits/stdc++.h>

#define int long long

using namespace std;

main()
{
	int column;
	cin >> column;
	getchar();
	string str;
	getline(cin, str, '\n');      
	 
	int len = str.size();
	int row;
	if(len % column != 0)
	{
		row = len / column + 1;
	} else {
		row = len / column;
	}	
	
	char p[column][row];
	
	for(int i = 0;i < column;i ++)
		for(int j = 0;j < row;j ++)
			p[i][j] = ' ';
			
	int m = 0;
	for(int i = row - 1;i >= 0;i --)
	{
		for(int j = 0;j < column;j ++)
		{
			p[j][i] = str[m];
//			cout << str[m] << endl;
			if(m == len - 1) break;
			m ++;
		} 
	}

	for(int i = 0;i < column;i ++)
	{
		for(int j = 0;j < row;j ++)
		{
			cout << p[i][j];
		} 
		if(i != column - 1) cout << endl;
	}
} 

 大概思路:

结构体处理+排序+输出

没了


CF的题目有点多,就提几个我能讲的比较明白的(bushi


大致题意


我有一堆蛋糕,每个蛋糕的甜度取决于它相邻下一个蛋糕重量和它本身重量之和

我现在给你一个数组,里面是蛋糕的顺序和每个蛋糕的重量

现在我想知道能吃到最甜的蛋糕的数组,蛋糕的最大甜度是多少的 

(关键的就那么多了好像)

大概思路


不就是找最大和次大么 

遍历一遍数组足矣

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int main()
{
	int T;
	cin >> T;
	for(int t = 0;t < T;t ++)
	{
		int n;
		cin >> n;
		ll Big1 = 0;
		ll Big2 = 0;
		for(int i = 0;i < n;i ++)
		{
			ll tmp;
			cin >> tmp;
			if(Big2 == 0 && Big1 == 0)
			{
				Big1 = tmp;
				continue;
			}
			if(Big2 == 0 && Big1 != 0)
			{
				if(tmp >= Big1)
				{
					Big2 = Big1;
					Big1 = tmp;
				} else {
					Big2 = tmp;
				}
				continue;
			}
			if(tmp >= Big1)
			{
				Big2 = Big1;
				Big1 = tmp;
			} 
			else if(tmp >= Big2)
			{
				Big2 = tmp;
			}
		}
		cout << Big1 + Big2 << endl;
	}
	return 0;
}

大致题意


我有T串字符串

现在我要把它们前面的字符,如果和后面字符相同的话,就把它删掉

即我要删除它的相等前缀字符串,直到不能删了为止

现在我想知道,当我删到不能删了,最后的字符串长成什么样

大概思路


既然要删,既然要比,那我就遍历呗

每次基本比较位为str[0],即第一个字符,往它后面的位置开始遍历

如果找到str[i] == str[0],那么开始从i位置和0位置同时向后比较相同并记录长度,如:

abcabdd

(省事就不打单引号了哈)str[0] = a, str[3] = a, str[0] == str[3]

这时候开始向后比,发现: str[1] == str[4], str[2] != str[5],于是删除长度为2

这个时候再删除字符串的前2个字符就行了,然后开始下一轮遍历

最后,我们就能得到我们想要的结果

#include <bits/stdc++.h>

using namespace std;

int main()
{
	int T;
	cin >> T;
	for(int t = 0;t < T;t ++)
	{
		string str;
		cin >> str;
		int len = str.size();
		int DO = 1;
		while(DO)
		{
			int posL = 0;
			int DL = 1;
			int FR = str.find(str[0], 1);
			int posR = FR;
//			cout << FR << endl;
			if(FR < str.size())
			{
				posR ++;
				posL ++;
				while(posR < str.size() && str[posR] == str[posL])
				{
					DL ++;
					posR ++;
					posL ++;
				}
				str.erase(0, DL);
			}
			else
			{
				break;
			}
		}
		cout << str << endl;
	}
	
	
	return 0;
}

题目真的很多,CF真的很卡,下次写题解吧


这周主要就是刷题、刷题、刷题(上周我还说着比赛比完了接下来重心应该在JAVA上了,没想到组里又有很多任务下发,于是又没什么太多的时间看JAVA了... ...),但是JAVA也看了,看到了面向对象(下),感觉《疯狂JAVA讲义》这本书细节讲的很多,然后就导致我看的很慢啊... ...

这周任务要是不多的话,一定,一定把JAVA尽快往后推一推。

这大概就是这周的目标吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ISansXI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值