首页 > 代码库 > [BestCoder] Round #9
[BestCoder] Round #9
1001
http://acm.hdu.edu.cn/showproblem.php?pid=4993
暴力一下。
#include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #include <stdlib.h> #include <cmath> #include <iomanip> #include <vector> #include <set> #include <map> #include <stack> #include <queue> #include <cctype> #define rd(x) scanf("%d",&x) #define rd2(x,y) scanf("%d%d",&x,&y) #define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z) using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; int t,a,b,c; int ans; int main() { rd(t); while(t--) { rd3(a,b,c); ans=0; for(int x=1;;x++) { if(a*x>c) break; if((c-a*x)%b==0&&(c-a*x)/b!=0) ans++; } cout<<ans<<endl; } return 0; }
1002
http://acm.hdu.edu.cn/showproblem.php?pid=4994
博弈题。题意为有n堆石子,每堆有一定数量的石子,规则为从第一堆开始拿,每个人可以拿一堆里面的任意多个,当第一堆石子全部拿完后,才可以拿第二堆,最后一次拿的为胜,问先手是否能胜。
关键点:谁先取得石子数量大于1的那堆的拿取优先权,谁胜,也就是先求这n堆里面前面有连续的几堆数量为1,设有连续的cnt堆,一堆只有1个,肯定会拿走着一个,当cnt是偶数时,拿完这些数量为1的堆,下一次还是先手先拿,那么他就可以控制自己再拿到下一次的数量大于1的那堆的拿取优先权。 比如 4 1 1 2,先手可以拿3个,那么后手只能拿剩下的1个,然后先手拿1个,后手再拿一个,先手获得数量为2的那堆的拿取优先权,直接全拿走获胜,再比如 4 1 2,那么先手把4全拿走,后手拿走1个,先手照样获得2那堆的优先权,因此谁先获取数量大于1的那堆的拿取优先权,谁就可以掌控整个局面,获胜。
当然给定的n堆里每堆全部是1的情况也要考虑,这下就要判断n是奇数还是偶数了,每堆都为1,只能轮流拿一个。
#include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #include <stdlib.h> #include <cmath> #include <iomanip> #include <vector> #include <set> #include <map> #include <stack> #include <queue> #include <cctype> #define rd(x) scanf("%d",&x) #define rd2(x,y) scanf("%d%d",&x,&y) #define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z) using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; //谁先拿到了第一个大于1的那一堆,谁就赢 const int maxn=1010; int num[maxn]; int n; bool has;//是否存在大于1的那一堆 int cnt; int main() { int t; rd(t); while(t--) { rd(n); cnt=0;has=0; for(int i=1;i<=n;i++) rd(num[i]); for(int i=1;i<=n;i++) { if(num[i]==1) cnt++; else { has=1; break; } } if(!has)//当不存在大于1的堆时 { if(cnt&1) cout<<"Yes"<<endl; else cout<<"No"<<endl; } else { if(cnt&1) cout<<"No"<<endl; else cout<<"Yes"<<endl; } } return 0; }
http://acm.hdu.edu.cn/showproblem.php?pid=4995
模拟题...题意貌似说的不够清楚..输入的点不是按位置从小到大给定的....
看的网上的代码...
#include <iostream> #include <stdio.h> #include <algorithm> #include <string.h> #include <stdlib.h> #include <cmath> #include <iomanip> #include <vector> #include <set> #include <map> #include <stack> #include <queue> #include <cctype> #define rd(x) scanf("%d",&x) #define rd2(x,y) scanf("%d%d",&x,&y) #define rd3(x,y,z) scanf("%d%d%d",&x,&y,&z) using namespace std; typedef long long ll; const int inf=0x3f3f3f3f; const int maxn=100010; int N,M,K; int adj[maxn][12]; struct P { int id;//输入过程中的id int x; }point[maxn]; double v[maxn]; bool cmp(P a,P b) { return a.x<b.x; } bool left_ok(int L,int R,int th) { if(L<=0) return false; if(R>N) return true; if(point[th].x-point[L].x!=point[R].x-point[th].x) return (point[th].x-point[L].x)<(point[R].x-point[th].x); return point[L].id<point[R].id; } void get_knn(int th) { int id=point[th].id; int L=th-1,R=th+1; for(int i=1;i<=K;i++) { if(left_ok(L,R,th)) adj[id][i]=point[L--].id; else adj[id][i]=point[R++].id; } } int main() { int t; rd(t); while(t--) { rd3(N,M,K); for(int i=1;i<=N;i++) { scanf("%d%lf",&point[i].x,&v[i]); point[i].id=i;//这时的id也就是等于要查询的id } sort(point+1,point+1+N,cmp); for(int i=1;i<=N;i++) get_knn(i); double ans=0.0; int x; while(M--) { rd(x); double tp=0.0; for(int j=1;j<=K;j++) tp+=v[adj[x][j]];//V[]输入过程中的编号.. v[x]=tp/K; ans+=v[x]; } printf("%.6lf\n",ans); } return 0; }
[BestCoder] Round #9
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。