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