10.19

来源:互联网 发布:java cs架构开发书本 编辑:程序博客网 时间:2024/06/08 04:00

打牌

贪心:1和2直接组成对子,3-n先判断能否和前两两个数组成对子。我们分情况讨论,当当前数字个数为奇数时若能拿出当前数字中的一个与另外两个数字组成顺子显然很优,若为偶数个数字若拿出第一个数字与另外两个数组成顺子,当前个数没有影响,但最后一个数字与后面的数字配对更有潜力。

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<ctime>#include<algorithm>using namespace std;int a[1000005];int n,ans=0,x;int main(){//freopen("k.in","r",stdin);//freopen("k.out","w",stdout);ios::sync_with_stdio(false);cin.tie(NULL);cin>>n;for(int i=1;i<=n;i++){cin>>x;a[x]++;}int ans=0;for(int i=1;i<=n;i++){ans+=(a[i]/2);a[i]%=2;if(i+1<n){if(a[i]==1&&a[i+1]%2&&a[i+2]){ans++;a[i]--;a[i+1]--;a[i+2]--;}}}cout<<ans;return 0;}
弹球
此题可以暴力递归,枚举右上,右下,左上,左下四个方向分别用1,2,3,4表示,再枚举第几行第几列,可得30分。找规律:经过的=格子满足x+y或x-y为gcd(n-1,m-1)的倍数。那么经过的格子总数为(n-1)*(m-1)/gcd(n-1,m-1)+1即所有折线的总长度。
#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<ctime>#include<algorithm>using namespace std;long long gcd(long long a,long long b){if(b==0) return a;return gcd(b,a%b);}int main(){//freopen("k.in","r",stdin);//freopen("k.out","w",stdout);long long t,n,m,x,ans;cin>>t;while(t--){cin>>n>>m;x=gcd(n-1,m-1);ans=(n-1)*(m-1)/x+1;ans-=(ans/(n-1)-1)*(ans/(m-1)-1);cout<<ans<<endl;}return 0;}
放盒子

阶乘枚举哪个盒子被哪个盒子嵌套,或者各种搜索剪枝可得50分。