500pt:
链接:http://codeforces.com/problemset/problem/385/A
分析:找前一个减后一个差最大的就行
代码:
#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> #include <string.h> #include <queue> using namespace std; #define ll long long const int N = 1000010; int arr[N]; int n,m; int main() { while(cin>>n>>m) { for(int i=0;i<n;i++) { cin>>arr[i]; } int maxR = 0; for(int i =0;i<n-1;i++) maxR = max(maxR,arr[i]-arr[i+1]); int ret = 0; ret = max(ret,maxR-m); cout<<ret<<endl; } return 0; }
1000pt:
链接:http://codeforces.com/problemset/problem/385/B
分析:找到"bear“,然后计算前后有多少字母,就可以求出有多少组合数,注意要减去重复计算的,复杂度为O(n)
代码:
#include <vector> #include <list> #include <map> #include <set> #include <deque> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <cmath> #include <cstdlib> #include <ctime> #include <string.h> #include <queue> using namespace std; #define ll long long int main() { string s; while(cin>>s) { int n = s.length(); int ret = 0; int lastb = -1; for(int i=0;i<n-3;i++) { if(s.substr(i,4)=="bear") { ret+=(n-(i+3)); ret+=(n-(i+3))*(i-lastb-1); lastb = i; } } cout<<ret<<endl; } return 0; }
链接:http://codeforces.com/problemset/problem/385/C
分析:在计算质数的时候,可以把f也顺便求出来,如2是质数,那么4,6,8都不是质数,但是如果输入中有4,6,8的话,那么他们就可以被2这个质数整除
另外,像这种有m个query的题目,题目给定left和right,一般都处理成[0,i]的的结果,这样在求答案的时候只要[0.right]-[0,left]就行,而不用再去遍历求解,复杂度降低了
代码:
#include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <iostream> #include <string.h> using namespace std; const int maxN = 10000010; bool prime[maxN]; int cnt[maxN]; int inputNumber[maxN]; int n,m; void solve() { memset(prime,true,sizeof(prime)); prime[0]=prime[1]=0; for(int i=2;i<maxN;i++) { if(prime[i]) { for(int j=i;j<maxN;j+=i) { cnt[i]+=inputNumber[j]; prime[j]=false; } } } for(int i=2;i<maxN;i++) cnt[i]+=cnt[i-1]; } int main() { cin>>n; int a; memset(inputNumber,0,sizeof(inputNumber)); memset(cnt,0,sizeof(cnt)); for(int i=0;i<n;i++) { cin>>a; inputNumber[a]++; } solve(); int m; cin>>m; while(m--) { int li,ri; cin>>li>>ri; if(li>maxN) li = maxN-1; if(ri>maxN) ri = maxN-1; cout<<cnt[ri]-cnt[li-1]<<endl; } return 0; }