Codeforces Round #128 (Div. 2)

转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents           by---cxlove


A:Two Problems

很坑的题目,好多人栽了,有两道题,初始分数为a,每分钟分值降da,另外一道题初始为b,每分钟降db。问一个人能不能刚好拿到X分。

X可能为0,这让好多人都WA,X为0这是肯定可以的,两题都没做出来。

之后O(t)的做法还是一直WA,无语,无奈下直接O(t*t)暴力了。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<map>
#include<stack>
#include<set>
#include<queue>
#include<string>
#include<vector>
#define eps 1e-6
#define LL long long
#define LD long double
#define pi acos(-1.0)
#define inf 1LL<<60
using namespace std;
int flag[605];
int main(){
	int x,t,a,da,b,db,i,j,aa,bb;
	scanf("%d%d%d%d%d%d",&x,&t,&a,&b,&da,&db);
	if(x==0)puts("YES");
	else{
		for(i=0;i<t;i++)
			for(j=0;j<t;j++){
				aa=a-i*da;
				bb=b-j*db;
				if(aa==x || bb==x || aa+bb==x){
					puts("YES");
					return 0;
				}
			}
			puts("NO");
	}
	return 0;
}


B:Game on Paper

竟然最后没有过评测。做法是放入一个棋子,以这个棋子的为中心的九宫格为中心判断是否形成3*3。由于棋子最多为10W,10W*9*9还是可以接受的。注意在main里面的枚举,是9个位置,当时就是挂在这地方。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<map>
#include<stack>
#include<set>
#include<queue>
#include<string>
#include<vector>
#define eps 1e-6
#define LL long long
#define LD long double
#define pi acos(-1.0)
#define inf 1LL<<60
using namespace std;
bool flag[1005][1005];
int way[9][2]={{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1},{0,0}};
bool check(int x,int y){
	if(flag[x][y]==false)
		return false;
	for(int i=0;i<8;i++)
		if(flag[x+way[i][0]][y+way[i][1]]==false)
			return false;
	return true;
}
int main(){
	int n,m;
	while(scanf("%d%d",&n,&m)!=EOF){
		memset(flag,false,sizeof(flag));
		int x,y;
		int ans=-1;
		for(int t=1;t<=m;t++){
			scanf("%d%d",&x,&y);
			flag[x][y]=true;
			int i;
			if(ans!=-1)
				continue;
			for(i=0;i<9;i++){
				if(check(x+way[i][0],y+way[i][1])){
					ans=t;
					break;
				}
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

 

C:Photographer

比较简单,贪心。先满足要求比较小的顾客就行了,按总消费递增排序。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<map>
#include<stack>
#include<set>
#include<queue>
#include<string>
#include<vector>
#define eps 1e-6
#define LL long long
#define LD long double
#define pi acos(-1.0)
#define inf 1LL<<60
using namespace std;
int n,A,B,d;
struct Node{
	int x,y;
	int cost;
	int idx;
}a[100005];
bool cmp(Node n1,Node n2){
	return n1.cost<n2.cost;
}
int main(){
	while(scanf("%d%d",&n,&d)!=EOF){
		scanf("%d%d",&A,&B);
		for(int i=0;i<n;i++){
			scanf("%d%d",&a[i].x,&a[i].y);
			a[i].cost=A*a[i].x+B*a[i].y;
			a[i].idx=i+1;
		}
		sort(a,a+n,cmp);
		int ans[100005],cnt=0;
		for(int i=0;i<n;i++)
			if(d>=a[i].cost){
				ans[cnt++]=a[i].idx;
				d-=a[i].cost;
			}
			else
				break;
		printf("%d\n",cnt);
		if(cnt!=0){
			for(int i=0;i<cnt-1;i++)
			printf("%d ",ans[i]);
			printf("%d\n",ans[cnt-1]);
		}
	}
	return 0;
}


D:Hit Ball

题目乱七八糟的解释。就是一个走廊里,站在(a/2,m,0)没着向量(vx,vy,vz)扔出一个球,问最后砸在门上的什么位置。门宽为a,门高为b,走廊两侧有墙,上侧有天花板,撞击后会反射。

首先根据y轴方向,速度在y轴上的分量一直是vy,并不由撞击产生改变,可以算出时间-m/vy;

由于每次反射并不改变速度的分量,只是改变了方向,比如和墙撞击,速度由vx变为-vx,已知时间就可以算出X轴方向运动的距离,然后再折合到0-a范围内。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<map>
#include<stack>
#include<set>
#include<queue>
#include<string>
#include<vector>
#define eps 1e-7
#define LL long long
#define LD long double
#define pi acos(-1.0)
#define inf 1LL<<60
using namespace std;
int a,b,m;
int vx,vy,vz;
int main(){
	while(scanf("%d%d%d%d%d%d",&a,&b,&m,&vx,&vy,&vz)!=EOF){
		double t=m*(-1.0)/vy;
		double X=t*vx+a/2.0,ansx;
		if(X<eps){
			X=-X;
			int cx=(int)(X/a);

			ansx=X-cx*a;
			if(cx&1)
				ansx=a-ansx;
		}
		else if(X>a+eps){
			X-=a;
			int cx=(int)(X/a);
			ansx=X-cx*a;
			if(!(cx&1))
				ansx=a-ansx;
		}
		else
			ansx=X;
		double Z=t*vz;
		int cz=(int)(Z/b);
		double ansz=Z-cz*b;
		if(cz&1)
			ansz=b-ansz;
		printf("%.10f %.10f\n",ansx,ansz);

	}
	return 0;
}


E:号称readforces,有时间再看题吧,不过英语着实很差

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值