太戈编程第308题
暴力法
cin>>n>>m;
for(int i=0;i<n;i++) cin>>name[i]>>year[i];
for(int i=0;i<m;i++){
int x;
string y;
cin>>x>>y;
int OK=0;
for(int j=0;j<n;j++){
if(name[j]==y&&year[j]==x){
OK=1;
break;
}
}
cout<<OK<<" ";
}
这个算法复杂度为O(nm),显然有更快的算法
自定义类型
但是,这样写有个很危险的错误,如下
#include <bits/stdc++.h>
using namespace std;
struct dog{
string name;
int year;
};
int main(){
set<dog> s;
dog a,b;
a.name="mike";a.year=2020;
b.name="wangcai";b.year=2019;
s.insert(a);
s.insert(b);
return 0;
}
运行出来是这样的,
原因很简单,因为set的功能是排序、去重,然而结构体排序要加上“.",所以会报错
改后代码,
#include <bits/stdc++.h>
using namespace std;
struct dog{
string name;
int year;
bool operator<(const dog&d)const {
if(year<d.year) return 1;
if(year>d.year) return 0;
if(name<d.name) return 1;
return 0;
}
};
int main(){
set<dog> s;
dog a,b;
a.name="mike";a.year=2020;
b.name="wangcai";b.year=2019;
s.insert(a);
s.insert(b);
return 0;
}
那么,回到原题,代码该怎么写呢?
#include <bits/stdc++.h>
using namespace std;
struct dog{
string name;
int year;
bool operator<(const dog&d)const {
if(year<d.year) return 1;
if(year>d.year) return 0;
if(name<d.name) return 1;
return 0;
}
};
int main(){
set<dog> s;
dog d;
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++){
cin>>d.name>>d.year;
s.insert(d);
}
for(int i=0;i<m;i++){
cin>>d.year>>d.name;
if(s.count(d)) cout<<"1";
else cout<<"0";
}
return 0;
}
太戈编程第1497题
无set
#include <bits/stdc++.h>
using namespace std;
const int N=100009;
struct student{
int id,score;
bool operator<(const student&b)const {
if(score>b.score) return 1;
if(score<b.score) return 0;
if(id<b.id) return 1;
return 0;
}
};
student f[N];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>f[i].score;
f[i].id=i;
}
sort(f+1,f+1+n);
for(int i=1;i<=n;i++){
cout<<f[i].id<<" "<<f[i].score<<endl;
}
return 0;
}
有set
#include <bits/stdc++.h>
using namespace std;
const int N=100009;
struct student{
int id,score;
bool operator<(const student&b)const {
if(score>b.score) return 1;
if(score<b.score) return 0;
if(id<b.id) return 1;
return 0;
}
};
int main(){
int n;
cin>>n;
set<student> s;
student x;
for(int i=0;i<n;i++){
cin>>x.score;
x.id=i+1;
s.insert(x);
}
set<student>::iterator it;
for(it=s.begin();it!=s.end();it++)
cout<<(*it).id<<" "<<(*it).score<<endl;
return 0;
}
当然这个代码也有高级版,但要升级到c++14,如下
//不推荐使用,OJ好像不行
#include <bits/stdc++.h>
using namespace std;
const int N=100009;
struct student{
int id,score;
bool operator<(const student&b)const {
if(score>b.score) return 1;
if(score<b.score) return 0;
if(id<b.id) return 1;
return 0;
}
};
int main(){
int n;
cin>>n;
set<student> s;
int x;
for(int i=0;i<n;i++){
cin>>x;
s.insert({i+1,x});
}
set<student>::iterator it;
for(it=s.begin();it!=s.end();it++)
cout<<(*it).id<<" "<<(*it).score<<endl;
return 0;
}
太戈编程第309题
大家认真敲代码15min,15min后开讲
#include <bits/stdc++.h>
using namespace std;
struct ren{
int x,id;
bool operator<(const ren&b)const{
if(x<b.x) return 1;
if(x>b.x) return 0;
if(id<b.id) return 1;
return 0;
}
};
int main(){
int n;
cin>>n;
set<ren> s;
set<ren>::iterator it;
ren d;
for(int i=1;i<=n;i++){
cin>>d.x;
d.id=i;
s.insert(d);
}
set<int> ok;
for(int i=1;i<=n;i++){
it=s.begin();
d.x=(*it).x+3;
d.id=(*it).id;
s.erase(it);
s.insert(d);
ok.insert(d.id);
}
cout<<n-ok.size()<<endl;
return 0;
}
希望这些对大家有用,三联必回