杭电oj平台上的11页题目代码:hdu-page11 (2060~2069)2060、2061、2062、2063、2064、2065、2066、2068

//2060
/*斯诺克的桌球游戏,关键在于对题目的理解

下面是别的大牛解释的题意

题意为,给你场上剩下的球数m , 和 a ,b 两名队员目前得分,现在假设a将

所有的球m都打入洞中,然后让你输出是否最终a的得分会超过b;

总共有15个红球,和6个有颜色的球,每个红球的得分为1 ,6

个有颜色的球分别为2 , 3, 4 ,5, 6, 7 ;

因为 要求最大得分,需要考虑的情况有两种;

A :当 m > 6时 ,应该将有颜色的球都取了,有色球得分为

2 + 3 + 4 + 5 + 6 + 7 ,有色球总得分为27 ;然后再取红球 m - 6 ,本

来得分应该是 ( m - 6 ) * 1 ,但是由于有色球全部打进洞后,每个球需要

额外增加黑球(最高得分)的得分;所以红球总得分为( m - 6 ) * 1 + ( m

- 6 ) * 7 ;

总得分为( m - 6 ) * 8 + 27 ;

B:当 m <= 6 时 ,应该由价值最高的黑球( 7 分) 向前依

次增加求和,又因为有色球满足等差数列 ,由前6项减去前 6 - m项和,所以

求得为( 7 - m + 1 + 7 ) * m / 2 ( 这里直接通过得分来计算的)。因

此,第二种情况的得分为( 15 - m ) *m/ 2 ;*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int main()
{
int n;
int m, a, b;
scanf("%d", &n);
while (n--)
{
scanf("%d%d%d", &m, &a, &b);
if (m > 6)
{
a = a + (m - 6) * 8 + 27;
}
else
{
a = a + (15 - m)*m / 2;
}
if (a>=b)
{
printf("Yes ");
}
else
{
printf("No ");
}
}
return 0;
}

//2061
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define MAXN_LEN 31
char course_name[MAXN_LEN];
int main()
{
int n;
int k;
double credit;
double score;
double gpa;
int count = 0;
int flag;//用来标记是不是有一门课小于60分
scanf("%d", &n);
double sum1, credit_sum;
while (n--)
{
gpa = 0;
sum1 = 0;
credit_sum = 0;
flag = 0;
scanf("%d", &k);
for (int i = 0; i < k; i++)
{
scanf("%s%lf%lf", course_name, &credit, &score);
if (score>=0&&score<60)
{
flag = 1;
//break;这里加了break就错了,因为break了以后的就scanf不进去了,就跳出循环了
}
else
{
sum1 += credit*score;
credit_sum += credit;
}
}
gpa = sum1*1.0 / credit_sum;
if (flag==0)
{
printf("%.2lf ", gpa);
}
else
{
printf("Sorry! ");
}
if (n!=0)
{
printf(" ");
}
}
return 0;
}

//2063
//匈牙利算法http://blog.csdn.net/dark_scope/article/details/8880547
/*思路:
*Rabbit只愿意和XHD或PQK做partner,
*Grass只愿意和linle或LL做partner,
*PrincessSnow愿意和水域浪子或伪酷儿做partner;
boss让找到partner的人去坐过山车,输出可以坐上过山车的最多组合数
*/
#include<stdio.h>
#include<string.h>
int line[510][510], boy[510], used[510];
int n, m;
int Find(int x)
{
int i, j;
for (i = 1; i <= m; i++)//遍历所有被选者
{
if (line[x][i] == 1 && used[i] == 0)
{//如果 x对i有好感且在这一个递归选取阶段没有被选取(哪怕是暂时选取,新的递归可能会换)
used[i] = 1;//标记被选取
if (boy[i] == 0 || Find(boy[i]))//如果被选者没有归属或他的归属着可以调换(他的归属者可以选择其它被选者)
{
boy[i] = x;//将归属定为 x
return 1;
}
}
}
return 0;
}
int main()
{
int i, j, k, x, y, sum;
while (scanf("%d %d %d", &k, &n, &m), k != 0)
{
memset(line, 0, sizeof(line));
memset(boy, 0, sizeof(boy));
memset(used, 0, sizeof(used));
for (i = 0; i<k; i++)
{
scanf("%d %d", &x, &y);
line[x][y] = 1;//表示 x希望与 y有关系
}
sum = 0;//记录能撮合的情侣对数
for (i = 1; i <= n; i++)
{
memset(used, 0, sizeof(used));//每次都要清 0
if (Find(i)) sum++;//找到一对就记录
}
printf("%d ", sum);
}
return 0;
}


//2064
/*思路:假设将n层塔从A经B挪到C需要f[n]步。
那么具体的移动过程可以这样看:将上面n-1层从A经B挪到C需要f[n-1]步,
再将第n层从A挪到B,需要一步,
再将上n-1层从C经B挪到A,需要f[n-1]步,
再将第n层从B挪到C,需要一步,
再将上n-1层从A经B挪到C,需要f[n-1]步,总计3*f[n-1] + 2步,其中 f[1] = 2;*/
#include<stdio.h>
typedef long long ll;
#define N 36
ll dp[N];
int main()
{
int n;
dp[0] = 0;
dp[1] = 2;
for (int i = 2; i < N; i++)
{
dp[i] = 3 * dp[i - 1] + 2;
}
while (~scanf("%d", &n))
{
printf("%lld ", dp[n]);
}
return 0;
}

//2065
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
//快速幂Fast Exponentiation
int haha(int a, _int64 b)
{
int sum = 1;
while (b)
{
//如果b是奇数,b%2==1
if (b&1)
{
sum = (sum*a) % 100;
}
a = (a*a) % 100;
b = b >> 1;
}
return sum;
}

int main()
{
int T;
int i;
int temp;
_int64 n;
while (~scanf("%d",&T))
{
if (T==0)
{
break;
}
for ( i = 1; i <= T; i++)
{
scanf("%I64d", &n);
temp = (haha(2, n - 1) + haha(4, n - 1)) % 100;
printf("Case %d: %d ", i,temp);
}
printf(" ");
}
return 0;
}

//2068
/*思路:将编号为1的元素放在第2到第n个位置之上,有n-1种方法,错排余下的n-1个元素。类推,将编号为1到将共k个元素的话,就有n-k种方法;
选k个人错排。*/
#include<stdio.h>
#include<math.h>
typedef long long ll;
ll d[14] = { 0, 0, 1, 2 };
//错排公式
void init()
{
for (int i = 4; i < 14; i++)
{
d[i] = (i - 1)*(d[i - 1] + d[i - 2]);
}
}

//求组合数
ll C_n_m(int n, int m)
{
if (m==0)
{
return 1;
}
ll up = 1;
ll down = 1;
for (int i = n; i >= (n-m+1); i--)
{
up *= i;
}
for (int i = 1; i <= m; i++)
{
down *= i;
}
return up / down;
}

int main()
{
int n;
init();
while (~scanf("%d",&n))
{
if (n==0)
{
break;
}
ll ans = 1;
//从n个人中去i个人错排
for (int i = 0; i <= n/2; i++)
{
ans += C_n_m(n, i)*d[i];
}
printf("%lld ", ans);
}
return 0;
}

一生有所追!
原文地址:https://www.cnblogs.com/BlueBlue-Sky/p/8604552.html