例题3-5,例题4-2,例题4-3

例题3-5生成元

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define maxn 100005
 4 int ans[maxn];
 5
 6 int main() {
 7     int T, n;
 8     memset(ans, 0, sizeof(ans));
 9     for (int m = 1; m < maxn; m++) {
10         int x = m, y = m;
11         while (x > 0) {
12             y += x % 10;
13             y /= 10;
14         }
15         if(ans[y] == 0 || m < ans[y])
16             ans[y] = m;
17     }
18     scanf("%d", &T);
19     while(T--) {
20         scanf("%d", &n);
21         printf("%d\n", ans[n]);
22     }
23     return 0;
24 }

例题4-2 刽子手游戏

#include <stdio.h>
#include <string.h>
#define maxn 100
int left, chance;   //还需猜测left个位置,错chance次之后就输了
char s[maxn], s2[maxn];     //答案是字符串s,玩家猜的字母序列是s2
int win, lose;      //win=1表示已经赢了;lose=1表示已经输了

void guess(char ch) {
    int bad = 1;
    for(int i = 0; i < strlen(s); i++) {
        if(s[i] == ch) {
            left--;
            s[i] = ‘ ‘;
            bad = 0;
        }
        if(bad)
            --chance;
        if(!chance)
            lose = 1;
        if(!left)
            win = 1;
    }
}
int main() {
    int rnd;
    while (scanf("%d%s%s",&rnd, s, s2) == 3 && rnd != -1) {
        printf("Round %d\n", rnd);
        win = lose = 0;     //求解一组新数据之前要初始化
        left = strlen(s);
        chance = 7;
        for (int i = 0; i < strlen(s2); i++) {
            guess(s2[i]);       //猜测一个字母
            if(win || lose)     //检查状态
                break;
        }
        if(win)
            printf("You win.\n");
        else if(lose)
            printf("You lose.\n");
        else
            printf("You chickened out.\n");
    }
    return 0;
}

例题4-3救济金发放

#include <stdio.h>
#define maxn 25
int n, k, m, a[maxn];

//逆时针走t步,步长是d(-1表示顺时针走),返回新位置
int go(int p, int d, int t) {
    while (t--) {
        do {
            p = (p+d+n-1) %n + 1;
        }while(a[p] == 0);      //走到下一个非0数字
    }
    return p;
}

int main() {
    while (scanf("%d%d%d", &n, &k, &m) == 3 && n) {
        for (int i = 1; i <= n; i++)
            a[i] = i;
        int left = n;
        int p1 = n, p2 = 1;
        while(left) {
            p1 = go(p1, 1, k);
            p2 = go(p2, -1, m);
            printf("%3d", p1);
            left--;
            if(p2 != p1) {
                printf("%3d", p2);
                left--;
            }
            a[p1] = a[p2] = 0;
            if (left)
                printf(",");
        }
        printf("\n");
    }
    return 0;
}

原文地址:https://www.cnblogs.com/ton2018/p/9127425.html

时间: 2024-10-09 00:45:51

例题3-5,例题4-2,例题4-3的相关文章

【高斯消元】兼 【期望dp】例题

[总览] 高斯消元基本思想是将方程式的系数和常数化为矩阵,通过将矩阵通过行变换成为阶梯状(三角形),然后从小往上逐一求解. 如:$3X_1 + 2X_2 + 1X_3 = 3$ $              X_2 + 2X_3 = 1$ $2X_1 + X_3 = 0$ 化为矩阵为:--->----->-----> 然后就可以通过最后一行直接求出$X_3 = ...$,将其带回第二行,算出$X_2$,同理算出$X_1$. 代码很好理解: inline void gauss(){ int

acm常见算法及例题

转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法

黑书例题 Fight Club 区间DP

题目可以在bnuoj.soj等OJ上找到. 题意: 不超过40个人站成一圈,只能和两边的人对战.给出任意两人对战的输赢,对于每一个人,输出是否可能是最后的胜者. 分析: 首先序列扩展成2倍,破环成链. dp[i][j]表示i和j能够相遇对打,那么dp[i][i+n]为真代表可以成为最后胜者. 枚举中间的k,若i和j都能和k相遇,且i和j至少一人能打赢k,那么i和j可以相遇. 复杂度o(n^3) 1 #include<cstdio> 2 #include<cstring> 3 usi

linux脚本进阶例题解析

例题一:编写脚本/root/bin/createuser.sh,实现如下功能: 使用一个用户名做为参数,如果指定参数的用户存在,就显示其存在,否则添加之:并生成8位随机口令并存在一个文件中,初步提示改口令,显示添加的用户的id号等信息 #!/bin/bash # ------------------------------------------ # Filename: useradd.sh  # Revision: null # Date: 2017-09-11 21:47:22 # Auth

JAVA基础汇总及例题详解

java语言的一个核心: jdk, java development kits---面向开发人员 jre, java Runtime Environment---服务器上 java虚拟机---(以字节码为指令的CPU)---*.class java编译器-->字节码-->类加载器进行验证-->虚拟机运行 垃圾回收机制 public class ...{ int a = 1; } c/c++垃圾回收由程序员去运行 java编程语言(一门纯面向对象)的特点: 1, 面向对象  封装  继承

【强连通分量】tarjan算法及kosaraju算法+例题

阅读前请确保自己知道强连通分量是什么,本文不做赘述. Tarjan算法 一.算法简介 Tarjan算法是一种由Robert Tarjan提出的求有向图强连通分量的时间复杂度为O(n)的算法. 首先我们要知道两个概念:时间戳(DFN),节点能追溯到的最早的栈中节点的时间戳(LOW).顾名思义,DFN就是在搜索中某一节点被遍历到的次序号(dfs_num),LOW就是某一节点在栈中能追溯到的最早的父亲节点的搜索次序号. Tarjan算法是基于深度优先搜索的算法.在搜索过程中把没有Tarjan过的点入栈

第10章例题(紫书)

21/21 题目都很基础,有很多题书上讲得比较详细,然后隔得时间有点久,所以具体什么trick都忘了,思路也懒得去回忆,所以将就着放上来了.... 例题10–1 Uva 11582 题意:输入a, b, n让你计算F[a^b]%n;其中这个F[i]是斐波那契数: 题解: 这题是快速幂+找循环节,用什么方法找循环节呢?因为第一个数是0和1,然后当再出现0和1的时候就是出现循环节的时候,然后假如找到了循环节T,然后就有F[n] = F[n % T],预处理找循环节,O(一百万左右),快速幂logn

数组模拟单向链表例题(UVa11988)

指针的链表实现方式是,当前节点的next指向下一个节点,用数组模拟就是 for(int i=next[0];i!=0;i=next[i]) i=next[i]:就是一条链. 例题: 你有一个破损的键盘.键盘上的所有键都可以正常工作,但有时Home键或者End键会自动按下.你并不知道键盘存在这一问题,而是专心打稿子,甚至连显示器都没打开.当你打开显示器时之后,展现在你面前的是一段悲剧文本.你的任务时在打开显示器之前计算出这段悲剧文本. 输入包含多组数据.每组数据占一行,包含不超过100000个字母

例题9-14 完美的服务 UVa1218

1.题目描述:点击打开链接 2.解题思路:本题的分析思路类似于上一道例题.还是利用树状dp解决.根据题意,可以定义如下的三种状态值: (1)d(u,0)表示u不是服务器,但u的父亲是服务器(暗含u的所有子结点都不是服务器):(2)d(u,1)表示u是服务器,子结点可以是也可以不是:(3)d(u,2)表示u,u的父亲都不是服务器(暗含u的其中一个子结点是服务器): 定义了这样的三个状态之后,状态转移方程便不难得出: (1) d(u,0)=sum{d(v,2)}(v是u的子结点); (2) d(u,

[入门向选讲] 插头DP:从零概念到入门 (例题:HDU1693 COGS1283 BZOJ2310 BZOJ2331)

转载请注明原文地址:http://www.cnblogs.com/LadyLex/p/7326874.html 最近搞了一下插头DP的基础知识……这真的是一种很锻炼人的题型…… 每一道题的状态都不一样,并且有不少的分类讨论,让插头DP十分锻炼思维的全面性和严谨性. 下面我们一起来学习插头DP的内容吧! 插头DP主要用来处理一系列基于连通性状态压缩的动态规划问题,处理的具体问题有很多种,并且一般数据规模较小. 由于棋盘有很特殊的结构,使得它可以与“连通性”有很强的联系,因此插头DP最常见的应用要数