游戏:
可以通过观察得出,例如下面的图片,flea如果和m相同,则不会胜利;
如果flea在m的左边则不如在m的右边,为什么呢?因为c在m右边的次数多,因此flea失败的次数就会多。
那么此刻flea应该选择m的右边,且是m右边第一个是最优的
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; int n,m; int main(){ cin>>n>>m; if(n%2 == 1 && m == (n+1)/2)cout<<m-1<<endl; else if( m<=(n+1)/2 ) cout<<m+1<<endl; else cout<<m-1<<endl; return 0; }
circle
任意三个数,满足什么条件就是顺时针
a<b<c一定是么?yes
顺时针还可以是什么条件
a<b<c这一圈,改变a,b,c的位置,则有了不同的大小关系
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; int n,a,b,c; int main(){ scanf("%d%d%d%d",&n,&a,&b,&c); if((a<b && b<c) || (a<b && c<b && a > c) || (a>b && b<c && a>c)) printf("1"); if((a>b && b>c) || (a<b && c<b && a < c) || (a>b && b<c && a<c)) printf("0"); return 0; }
将军下棋
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #define p 1000000007 #define ll long long using namespace std; int n,m,a[2005][2005]; ll f[2005][2005],g[2005][2005]; int main(){ scanf("%d%d",&n,&m); for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++){ scanf("%d",&a[i][j]); } f[1][1] = a[1][1]; g[1][1] = 1; for(int i = 2; i <= n; i++){ f[i][1] = f[i-1][1] + a[i][1]; g[i][1] = 1; } for(int j = 2; j <= m; j++){ f[1][j] = f[1][j - 1] + a[1][j]; g[1][j] = 1; } for(int i = 2; i <= n; i++) for(int j = 2; j <= m; j++){ if(f[i - 1][j] > f[i][j - 1]){ f[i][j] = f[i-1][j] + a[i][j]; g[i][j] = g[i-1][j]%p; } else if(f[i-1][j] < f[i][j-1]){ f[i][j] = f[i][j-1] + a[i][j]; g[i][j] = g[i][j-1]%p; } else{ f[i][j] = f[i][j-1] + a[i][j]; g[i][j] = (g[i][j-1]%p + g[i-1][j]%p)%p; } } printf("%lld\n%lld\n",f[n][m],g[n][m]%p); return 0; }