希望下次秒懂的是算法题_哔哩哔哩_bilibili
[NOIP2007 普及组] 纪念品分组 - 洛谷
#include
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
typedef long long LL;
LL gcd(LL a,LL b){ return b==0 ? a : gcd(b,a%b); }
LL lcm(LL a,LL b){ return a / gcd(a,b) * b ; }
bool is_prime(int x){if(x<2) return false;
for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true;}
const int N = 3e4+10,mod = 1e9+7;
int n,w,a[N];
LL ans;
inline void solve(){
cin>>w>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n);
int l=1,r=n;
while(l<=r){
if(a[l]+a[r]<=w){
l++; r--; ans ++;
}else {
r--; ans ++;
}
}
cout<> _;
_ = 1;
while(_ --) solve();
return 0;
}
https://www.luogu.com.cn/problem/P1102
1.直接暴力,当然会tle了,hh( O(n^2) )
2.妙用map;(O(n))
3.用二分函数,upper_bound和lower_bound;对于a[i](a),其后满足 b-a=c的连续区间长度可以用二分函数来求得(当然是对于排好序的数组) O(nlogn)
详细解答请看代码 :
直接暴力,当然会收获tle(3个),hhh
#include
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
typedef long long LL;
LL gcd(LL a,LL b){ return b==0 ? a : gcd(b,a%b); }
LL lcm(LL a,LL b){ return a / gcd(a,b) * b ; }
bool is_prime(int x){if(x<2) return false;
for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true;}
const int N = 2e5+10,mod = 1e9+7;
LL n,c,a[N];
LL ans;
inline void solve(){
cin>>n>>c;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if( (LL)(abs(a[i]-a[j])) == c )
ans ++;
}
}
cout << ans << endl;
}
int main()
{
IOS
int _;
// cin >> _;
_ = 1;
while(_ --) solve();
return 0;
}
// map
#include
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
typedef long long LL;
LL gcd(LL a,LL b){ return b==0 ? a : gcd(b,a%b); }
LL lcm(LL a,LL b){ return a / gcd(a,b) * b ; }
bool is_prime(int x){if(x<2) return false;
for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true;}
const int N = 2e5+10,mod = 1e9+7;
LL n,c,a[N];
LL ans;
map mp;
inline void solve(){
cin>>n>>c;
for(int i=1;i<=n;i++) cin>>a[i],mp[a[i]]++;
for(int i=1;i<=n;i++) ans += mp[a[i]-c];
cout << ans << endl;
}
int main()
{
IOS
int _;
// cin >> _;
_ = 1;
while(_ --) solve();
return 0;
}
#include
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
typedef long long LL;
LL gcd(LL a,LL b){ return b==0 ? a : gcd(b,a%b); }
LL lcm(LL a,LL b){ return a / gcd(a,b) * b ; }
bool is_prime(int x){if(x<2) return false;
for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true;}
const int N = 2e5+10,mod = 1e9+7;
LL n,c,a[N];
LL ans;
inline void solve(){
cin>>n>>c;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
ans += ((upper_bound(a+1,a+n+1,a[i]+c)-a)-(lower_bound(a+1,a+n+1,a[i]+c)-a));
}
cout << ans << endl;
}
int main()
{
IOS
int _;
// cin >> _;
_ = 1;
while(_ --) solve();
return 0;
}
平台 - 洛谷
结构体排序 + 暴力,其实不难,要注意细节;
不然,就像这样(aaa) :
第一次排序规则 : 高度优先,编号其次,由小到大;
第二次排序规则 : 编号优先,由小到大;
注意 :
#include
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
typedef long long LL;
LL gcd(LL a,LL b){ return b==0 ? a : gcd(b,a%b); }
LL lcm(LL a,LL b){ return a / gcd(a,b) * b ; }
bool is_prime(int x){if(x<2) return false;
for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true;}
const int N = 1e4+10;
int n,xl,xr;
struct Node{
int idx,h,l,r,yl,yr;
bool operator < (const Node &u) const
{
return h == u.h ? idx > u.idx : h < u.h;
}
}a[N];
bool cmp(const Node& x,const Node& y){
return x.idx < y.idx;
}
inline void solve(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].h>>a[i].l>>a[i].r;
a[i].idx = i;
}
sort(a+1,a+n+1);
for(int i=1;i<=n;i++){
xl=0,xr=0;
for(int j=i-1;j>=1;j--){
if(a[j].la[i].l && a[j].h < a[i].h){
xl = a[j].idx;
break;
}
}
for(int j=i-1;j>=1;--j){
if(a[j].r>a[i].r && a[j].l> _;
_ = 1;
while(_ --) solve();
return 0;
}
EK的代码中是用的一个pair
修复公路 - 洛谷
并查集
代码(cv!):
#include
using namespace std;
int fa[1000+10],n,m;
struct node
{
int x,y,t;
}a[100000+10];//结构体大法好!
bool cmp(node fir,node sec)
{
return fir.t=2),输出-1
return 0;//愉快的结束主程序
}
最大子段和 - 洛谷
贪心,由前向后遍历,sum记录和,如果sum<0的话,sum=0(不然的话,只会对后面的sum产生负影响),循环更新ans = max(ans,sum);
#include
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl '\n'
using namespace std;
typedef long long LL;
int gcd(int a,int b){ return b==0 ? a : gcd(b,a%b); }
int lcm(int a,int b){ if(a==0||b==0) return 0; return (a*b)/gcd(a,b); }
bool is_prime(int x){if(x<2) return false;
for(int i=2;i<=x/i;i++) if(x%i==0) return false; return true;}
const int N = 2e5+10;
int n,x;
LL sum=0,ans = -1e9;
inline void solve(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>x;
sum += x;
ans = max(ans,sum);
if(sum < 0) sum = 0;
}
cout << ans << endl;
}
int main()
{
IOS
int _;
// cin >> _;
_ = 1;
while(_ --) solve();
return 0;
}