CodeForces 558A,B
2015-12-17 09:33
302 查看
CodeForces 558A
题意:给定一些苹果树的位置和树上的苹果数,然后一个人站在原点,每次碰到苹果就往相反的方向走,问能得到的最大苹果数。
思路:直接模拟即可。先假设往左走,然后再假设往右走。遍历一遍即可。
code:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <sstream>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int INF=0x3fffffff;
const int inf=-INF;
const int N=1000000;
const int M=205;
const int mod=1000000007;
const double pi=acos(-1.0);
#define cls(x,c) memset(x,c,sizeof(x))
#define cpy(x,a) memcpy(x,a,sizeof(a))
#define ft(i,s,n) for (int i=s;i<=n;i++)
#define frt(i,s,n) for (int i=s;i>=n;i--)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lrt rt<<1
#define rrt rt<<1|1
#define middle int m=(r+l)>>1
#define lowbit(x) (x&-x)
#define pii pair<int,int>
#define mk make_pair
#define IN freopen("in.txt","r",stdin);
#define OUT freopen("out.txt","w",stdout);
struct node
{
int x,a;
}g[M];
bool cmp(node A,node B){
return A.x<B.x;
}
int main()
{
int n;
scanf("%d",&n);
ft(i,1,n) scanf("%d %d",&g[i].x,&g[i].a);
sort(g+1,g+1+n,cmp);
g[0].a=g[0].x=0;
g[n+1].a=g[n+1].x=0;
int t=1,ans=0,s=0;
ft(i,2,n){
if (g[i-1].x<0&&g[i].x>0){ t=i;break;}
}
if (t==1){
if (g[1].x>0) printf("%d\n",g[1].a);
else printf("%d\n",g
.a);
return 0;
}
s=g[t].a;
for (int p=t-1,q=t+1;;p--,q++)
{
if (g[p].a) s+=g[p].a;
else break;
if (g[q].a) s+=g[q].a;
else break;
}
ans=g[t-1].a;
for (int p=t-2,q=t;;p--,q++)
{
if (g[q].a) ans+=g[q].a;
else break;
if (p<0) break;
if (g[p].a) ans+=g[p].a;
else break;
}
ans=max(ans,s);
printf("%d\n",ans);
}
CodeForces 558B
题意:在不改变整个数组出现最多的数的次数的条件下使区间尽量小。
思路:在输入的时候,记录某个数的左右区间。然后遍历,当某个数的出现次数等于最大值时就缩减。
code:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <sstream>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int INF=0x3fffffff;
const int inf=-INF;
const int N=1000000+5;
const int M=1e5+5;
const int mod=1000000007;
const double pi=acos(-1.0);
#define cls(x,c) memset(x,c,sizeof(x))
#define cpy(x,a) memcpy(x,a,sizeof(a))
#define ft(i,s,n) for (int i=s;i<=n;i++)
#define frt(i,s,n) for (int i=s;i>=n;i--)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lrt rt<<1
#define rrt rt<<1|1
#define middle int m=(r+l)>>1
#define lowbit(x) (x&-x)
#define pii pair<int,int>
#define mk make_pair
#define IN freopen("in.txt","r",stdin);
#define OUT freopen("out.txt","w",stdout);
int n,v[M];
int ct
;
struct node
{
int x,y;
}g
;
int main()
{
scanf("%d",&n);
cls(ct,0);
ft(i,1,n) {
scanf("%d",&v[i]);
int t=v[i];
if (ct[t]==0)g[t].x=i;
g[t].y=i;
ct[t]++;
}
int mx=0;
ft(i,1,n) mx=max(mx,ct[v[i]]);
int al=1,ar=n;
ft(i,1,N){
if (ct[i]==mx){
int ti=g[i].x,tj=g[i].y;
if (tj-ti<ar-al)
{
al=ti;ar=tj;
}
}
}
printf("%d %d\n",al,ar);
}
题意:给定一些苹果树的位置和树上的苹果数,然后一个人站在原点,每次碰到苹果就往相反的方向走,问能得到的最大苹果数。
思路:直接模拟即可。先假设往左走,然后再假设往右走。遍历一遍即可。
code:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <sstream>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int INF=0x3fffffff;
const int inf=-INF;
const int N=1000000;
const int M=205;
const int mod=1000000007;
const double pi=acos(-1.0);
#define cls(x,c) memset(x,c,sizeof(x))
#define cpy(x,a) memcpy(x,a,sizeof(a))
#define ft(i,s,n) for (int i=s;i<=n;i++)
#define frt(i,s,n) for (int i=s;i>=n;i--)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lrt rt<<1
#define rrt rt<<1|1
#define middle int m=(r+l)>>1
#define lowbit(x) (x&-x)
#define pii pair<int,int>
#define mk make_pair
#define IN freopen("in.txt","r",stdin);
#define OUT freopen("out.txt","w",stdout);
struct node
{
int x,a;
}g[M];
bool cmp(node A,node B){
return A.x<B.x;
}
int main()
{
int n;
scanf("%d",&n);
ft(i,1,n) scanf("%d %d",&g[i].x,&g[i].a);
sort(g+1,g+1+n,cmp);
g[0].a=g[0].x=0;
g[n+1].a=g[n+1].x=0;
int t=1,ans=0,s=0;
ft(i,2,n){
if (g[i-1].x<0&&g[i].x>0){ t=i;break;}
}
if (t==1){
if (g[1].x>0) printf("%d\n",g[1].a);
else printf("%d\n",g
.a);
return 0;
}
s=g[t].a;
for (int p=t-1,q=t+1;;p--,q++)
{
if (g[p].a) s+=g[p].a;
else break;
if (g[q].a) s+=g[q].a;
else break;
}
ans=g[t-1].a;
for (int p=t-2,q=t;;p--,q++)
{
if (g[q].a) ans+=g[q].a;
else break;
if (p<0) break;
if (g[p].a) ans+=g[p].a;
else break;
}
ans=max(ans,s);
printf("%d\n",ans);
}
CodeForces 558B
题意:在不改变整个数组出现最多的数的次数的条件下使区间尽量小。
思路:在输入的时候,记录某个数的左右区间。然后遍历,当某个数的出现次数等于最大值时就缩减。
code:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <sstream>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <bitset>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int INF=0x3fffffff;
const int inf=-INF;
const int N=1000000+5;
const int M=1e5+5;
const int mod=1000000007;
const double pi=acos(-1.0);
#define cls(x,c) memset(x,c,sizeof(x))
#define cpy(x,a) memcpy(x,a,sizeof(a))
#define ft(i,s,n) for (int i=s;i<=n;i++)
#define frt(i,s,n) for (int i=s;i>=n;i--)
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define lrt rt<<1
#define rrt rt<<1|1
#define middle int m=(r+l)>>1
#define lowbit(x) (x&-x)
#define pii pair<int,int>
#define mk make_pair
#define IN freopen("in.txt","r",stdin);
#define OUT freopen("out.txt","w",stdout);
int n,v[M];
int ct
;
struct node
{
int x,y;
}g
;
int main()
{
scanf("%d",&n);
cls(ct,0);
ft(i,1,n) {
scanf("%d",&v[i]);
int t=v[i];
if (ct[t]==0)g[t].x=i;
g[t].y=i;
ct[t]++;
}
int mx=0;
ft(i,1,n) mx=max(mx,ct[v[i]]);
int al=1,ar=n;
ft(i,1,N){
if (ct[i]==mx){
int ti=g[i].x,tj=g[i].y;
if (tj-ti<ar-al)
{
al=ti;ar=tj;
}
}
}
printf("%d %d\n",al,ar);
}
相关文章推荐
- 强烈的求知欲望
- 买楼10大误解
- HDU3783
- poj 1003 1004 1005水
- poj 1016水
- hihocoder #1258 签到题
- 清水言志
- 五个数的最大值
- hdu4608
- HDU 1009 FatMouse' Trade(水贪心)
- 1002. A+B for Polynomials (25)
- uva 12293 Box Game
- zoj 1745 Tree Recovery
- zoj 3490 String Successor
- zoj 2256 Mincost
- IO-00 ---- IO-09
- 分支01 —— 分支10
- 分支11 —— 分支17、分支19、分支20
- 分支18
- 循环-01. 求整数段和(15)