P3613洛谷:深积 & P5741旗鼓相当 %P1104生日 &set题海战

1-用map可以实现数组对应数值,再用vec传输。

#include<bits/stdc++.h>
using namespace std;
int n, q, mes, x, y, val;
typedef pair<int, int> pr;
map<pr, int> mp;
vector<int> vec;

int main(){
	cin >> n >> q;
	for(int i = 0; i < q; i ++){
		cin >> mes;
		if(mes == 1){
			cin >> x >> y >> val;
			pr p1 = make_pair(x, y);
			mp[p1] = val;
		}
		if(mes == 2){
			cin >> x >> y;
			pr p2 = make_pair(x, y);
			vec.push_back(mp[p2]);
		}
	}
	for(int i = 0; i < vec.size(); i ++){
		cout << vec[i] << endl;
	}
	return 0;
}

2-注意结构体里面不要定义结构体内成员的加减!!!

#include<bits/stdc++.h>
using namespace std;
const int maxx = 1e3 + 7;
int n;
struct stydent{
	string name;
	int chi, math, eng;
	//int sum = chi + math + eng;
}a[maxx];
int main(){
	cin >> n;
	for(int i = 0; i < n; i ++){
		cin >> a[i].name >> a[i].chi >> a[i].math >> a[i].eng;
	}
	for(int i = 0; i < n; i ++){
		for(int j = i + 1; j < n; j ++){
			int ans1 = abs(a[i].chi - a[j].chi);
			int ans2 = abs(a[i].math - a[j].math);
			int ans3 = abs(a[i].eng - a[j].eng);
			int ans4 = abs(a[i].chi + a[i].math + a[i].eng - a[j].chi - a[j].math - a[j].eng);
			if(ans1 <= 5 && ans2 <= 5 && ans3 <= 5 && ans4 <= 10){
				if(a[i].name < a[j].name)
				cout << a[i].name << " " << a[j].name << endl;
				else
				cout << a[j].name << " " << a[i].name << endl;
			}
		}
	}
	
	return 0;
}

3-多层要求的比较:再定义一个cmp函数

#include<bits/stdc++.h>
using namespace std;
int n;
struct student{
	string name;
	int y, m, d, level;//level为记录输入先后 
}s[105];
bool cmp(student a, student b){
	if(a.y != b.y)
	return a.y < b.y;
	else{
		if(a.m != b.m)
		return a.m < b.m;
		else{
			if(a.d != b.d) 
			return a.d < b.d;
			else
			return a.level > b.level;
		}
	}
}
int main(){
	cin >> n;
	for(int i = 0; i < n; i ++){
		cin >> s[i].name >> s[i].y >> s[i].m >> s[i].d;
		s[i].level = i; 
	}
	sort(s, s + n, cmp);
	for(int i = 0; i < n; i ++){
		cout << s[i].name << endl;
	}
	return 0;
}

4.难的要s

set数组自动是升序的去重数组

注意每次clear,加入用insert

#include<bits/stdc++.h>
using namespace std;
int a,b,n[10005],m[105][105],k[10005],c,d,e,m1[105][105],n1[10005];
//n放的是做过的题有多少个,n1放的是没做的题有多少个 
//m放的是做过的题是哪些,m1放的是没做过的题有哪些
//vis标识做过的题为1 
set<int> st;
vector <int> vec[10005];
int main(){
	cin >> a >> b;
	//每个人做过的题是哪些,用set返回后继续放到数m组 
	for(int i=1;i<=a;i++){
		st.clear();
		cin >> n[i];
		for(int j=1;j<=n[i];j++){
			cin >> m[i][j];
			st.insert(m[i][j]);
		}
		n[i]=0;
		int vis[10005]={};
		for(set<int>::iterator it=st.begin();it!=st.end();it++){
			n[i]++; //记录每个做了多少不重复的题 的下标 
			m[i][n[i]]=*it;//依次把题数代替原来题目数组 
			vis[*it]=1;//这个题做过就标记为1 ,避免反复调用set 
		}
		//每个人没做的题有哪些,放入m1数组 
		for(int z = 1;z<=b;z++){//遍历题目总数 
			if(vis[z]==0){//找没有做过的题 
				n1[i]++;//记录这个人到底没做多少题 
				m1[i][n1[i]] = z;//存一下没有做的题有哪些
			}
		}
	}
	cin >> c;
	for(int i=1;i<=c;i++){
		st.clear();
		cin >> d >> e;
		for(int j=1;j<=e;j++){
			cin >> k[j];
			st.insert(k[j]);
		}
		int j=0;
		//报名的人数是j个,这些人是谁都放在k数组里 
		for(set<int>::iterator it=st.begin();it!=st.end();it++){
			j++; //记录每个报名的人下标 
			k[j]=*it;//set去重
		}
		//训练 
		if(d==1){
			int vis[10005]={};
			//从报名的人的第一个开始遍历 ,看大家没做过的题
			for(int z=1;z<=j;z++){
				//第一个人是k[z],他没做过的题的数目是是n1[] 
				for(int p=1;p<=n1[k[z]];p++){
					vis[m1[k[z]][p]]=1;//标记没做过的题
				}
			}
			for(int z=1;z<=b;z++){
				if(vis[z]==0){//大家做过的题 
					vec[i].push_back(z);//就是我们要的题 
				}
			}
		}
		else{
			int vis[10005]={};
			for(int z=1;z<=j;z++){
				//从报名的人的第一个开始遍历 ,看大家做过的题
				for(int p=1;p<=n[k[z]];p++){
					//第一个人是k[z],他做过的题的数目是是n[]
					vis[m[k[z]][p]]=1;//标记做过的题
				}
			}
			for(int z=1;z<=b;z++){
				if(vis[z]==0){
					vec[i].push_back(z);//输出能做的题
				}
			}
		}
	}
	for(int i = 1; i <= c; i ++){
		for(int j = 0; j < vec[i].size(); j ++)
		cout << vec[i][j] << " " ;
		cout << endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值