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;
}