第一题:硬币
题目:
思路:贪心即可,优先使用大面值
代码:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int n,m;
while(~scanf("%d %d",&n,&m))
{
if(n>=m) return 1;
int ans = m/n;
if(m%n!=0) ans = ans+1;
printf("%d\n",ans);
}
return 0;
}
第二题 奇妙的数列
题目
解析:
首先根据区间长度分奇偶,如果长度为偶数,
则若开始为偶数,则 ans = -(num/2)
否则为 ans = (num/2)
如果长度为奇数,
则若开始为偶数,ans = r + -(num/2);
否则为-r + num/2
代码:
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int q,l,r;
scanf("%d",&q);
while(q--)
{
scanf("%d%d",&l,&r);
int ans;
if(l==r)
{
if(l%2==0) printf("%d\n",l);
else printf("%d\n",-l);
}
else
{
int num;
num = r-l+1;
if(num%2==0)
{
if(l%2==0) ans = -num/2;
else ans = num/2;
}
else
{
if(l%2==0) ans = r + -(num/2);
else ans = -r + num/2;
}
printf("%d\n",ans);
}
}
return 0;
}
第三题 猜拳游戏
题目
解析:公式题,方案数字为C(n,s)*2(n-s),因为首先赢s局,所以为组合数,剩下那些局是可以输和平局的,所以有2种可能,所以为2(n-s)
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define ll long long
const ll MOD = 1e9+7;
const int N =2020;
ll C[N][N];
void get()
{
for(int i=0;i<2005;i++)
{
C[i][0]=1;
}
for(int i=1;i<2005;i++)
{
for(int j=1;j<=i;j++)
{
C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
}
}
}
int main()
{
get();
ll n,s;
ll a[N];
while(~scanf("%lld%lld",&n,&s))
{
for(int i = 0; i < n ;i++) scanf("%lld",&a[i]);
if(n<s)
{
printf("0\n");
continue;
}
ll ans = C[n][s];
for(int i = 1; i<= n-s;i++)
ans = (ans*2)%MOD;
printf("%lld\n",ans);
}
return 0;
}