尺取法
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);
}