尺取 解题记录

尺取法

POJ2566(思维(?))

链接

abs不可以处理long long类型的数据

这里出现了负数,只要想到排序就变得很好处理了

#include<iostream>
#include<vector> 
#include<cmath>
#include<algorithm>
#define P pair<int,int>
using namespace std;
typedef long long ll;
const int N = 1e5 +5;
vector<P> a; 
int sum[N];
void solve(){
	int s=0,t=1,sum =0,cnt =0,del=0,ansval,minans=0x3f3f3f3f,S;
	P ans;
	int n=a.size();
	cin>>S;
	
//	for(int i=0;i<n;i++){
//		cout<<a[i].first<<" "<<a[i].second<<endl;
//	}
	while(t<n&& minans){
		sum=a[t].first-a[s].first;
		if(abs(sum-S)<=minans){
			minans=abs(sum-S);
			ansval=sum;
			ans=P(a[s].second,a[t].second);
		}
		
		if(sum<S) t++;
		if(sum>S) s++;
		if(t==s) t++;
	}
		
	if(ans.first>ans.second){
		swap(ans.first,ans.second);
	}
	cout<<ansval<<" "<<ans.first+1<<" "<<ans.second<<endl;
}
int main(){
	int n,q,tmp;
	while(cin>>n>>q && n+q >0){
		a.clear();
		a.push_back(P(0,0));
		for(int i=1;i<=n;i++){
			cin>>tmp;
			sum[i]=sum[i-1]+tmp;
			a.push_back(P(sum[i],i));
		}
		sort(a.begin(),a.end());
		for(int i=0;i<q;i++)
			solve();			
	}

}

POJ2739(+筛质数)

链接
一个数 被连续质数相加得到 的方案数

#include<iostream>
using namespace std;
const int N = 1e4 +5;
int vis[N],prime[N];
void Prime()
{
    for (int i = 2;i <= N; i++) {
        if (!vis[i]) {
            prime[++prime[0]] = i;    
		}
        for (int j = 1; j <=prime[0] && i*prime[j] <= N; j++) 
		{
            vis[i*prime[j]] = 1;
            if (i % prime[j] == 0) {
                break;
            }
        }
    }
}
void solve(int S){
	int s=1,t=1,sum =0,cnt =0;
	for(;;){
		while(t<=prime[0] && sum<S){
			sum += prime[t++];
		}
		
		if(sum< S) break;
		if(sum== S) cnt++;
		sum -= prime[s++];
	}
	
	cout<<cnt<<endl;
}
int main(){
	Prime();
	int n;
	while(cin>>n && n!=0){
		solve(n);
	}
}

POJ2100

链接
找到n可以表示成几个连续的正整数的平方方案的方案数

#include<iostream>
#include<vector> 
#include<cmath>
#define P pair<ll,ll>
using namespace std;
typedef long long ll;
const int N = 1e4 +5;
vector<P> ans; 
void solve(ll S){
	ll s=1,t=1,sum =0,cnt =0,tmp=0;
	ll n=sqrt(S) +1;
	for(;;){
		while(t<= n&& sum<S){
			sum += (t*t);
			t++;
		}
		//cout<<tmp<<"*"<<cnt<<" "<<s<<" "<<t<<" "<<sum<<endl;tmp++;
		if(sum< S) break;
		if(sum== S){
			ans.push_back(P(s,t));
			cnt++;
		}
		sum -= (s*s);
		s++;
	}
	
	cout<<cnt<<endl;
	for(int i=0;i<cnt;i++){
		P p=ans[i];
		cout<<p.second-p.first<<" ";
		for(ll j=p.first;j<p.second;j++){
			cout<<j<<" ";
		}cout<<endl;
	}
}
int main(){
	ll n;
	cin>>n;
	solve(n);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值