getchar

gets()、getchar()和scanf()的区别

非 Y 不嫁゛ 提交于 2020-02-05 01:26:31
gets()、getchar()和scanf()的区别 本文章仅对于有关字符串和字符的输入说明 一、格式化输入函数scanf(): 在输入数据时,遇到以下情况时认为输入结束: 空格、“回车键”、“跳格(tab)键” 以上字符统一可称为“间隔符”,效果如下: # include <stdio.h> int main ( ) { char str [ 10 ] , c ; scanf ( "%s" , str ) ; scanf ( "%c" , & c ) ; printf ( "%s\n" , str ) ; printf ( "%c\n" , c ) ; return 0 ; } 运行结果: 此时将Hello world中的空格识别为单个的字符输出了。 二、 putchar()用于单个字符的输入: putchar()的作用仅是向终端输出一个字符,与之对应的是getchar()函数。 字符输入函数getchar(): 接受终端输入一个字符; getchar()函数没有参数,函数值就是从输入设备得到的字符。 代码如下: # include <stdio.h> int main ( ) { char c ; c = getchar ( ) ; putchar ( c ) ; return 0 ; } 三、字符串输入函数gets(): 功能:从键盘输入一以回车结束的字符串放入字符数组中

PAT甲级 1022 Digital Library (30分)

让人想犯罪 __ 提交于 2020-02-04 23:52:24
1022 Digital Library (30分) 题目链接: PAT A 1022 题目大意:有一数字图书馆,对于每一本书给出如下信息:书的id,书的名字,书的作者,书的关键字,书的出版社以及书的出版年份。要求根据输入的查找信息输出相应书的ID(7位数字)。 思路分析:这道题题意很直观,但是需要用到的知识点比较多。首先根据题目要求可以分析出这道题一定是使用STL中的map去解决,而且由于题目中说书的某个属性可能对应好几个ID,所以不能使用一般的map解决,要用到嵌套的STL容器,一开始我想到的是map<string, vector >,但是题目中要求输出的ID是按照序号递增的顺序去输出,所以vector不能解决问题,这就要用到set了,因为set容器会对容器中的元素自动排序,恰好符合题目要求。ps:如果不知道怎么访问这种叠加类型的容器,可以百度查找一下,详细学习相关操作。 注意点1:由于题目中很多属性的字符串中是可能带有空格的,而cin遇到空格就会停止输入,所以这时候就要用到getline,getline可以读入带空格的字符串。但是如果前一个语句是cin或者scanf,后面接getline,就必须在getline之前加上getchar(),不然getline会读入换行导致字符串为空串,不懂的可以看这篇文章: 关于getline与cin 注意点2:题目中输入书的关键字那一行

JSOI2012~2013

断了今生、忘了曾经 提交于 2020-02-04 23:39:21
JSOI 2012~2013 C 游戏中的学问 题面: bzoj 题解:递推 注意一个圈至少要三个人…… (上来以为是圆排列然后WA) 式子看代码吧 code I 侦探jyy 题面: bzoj 题解:bfs 对于每个事件,假设他必须发生 那么有两种可能 一是由他往上只要有一个点是一开始钦定了要发生 二是由所有入度为零且不是他祖先的点往下推,推完后还有钦定被发生而没有发生的 code Q 贪心的导游 题面: bzoj 题解:主席树 看到 \(a[i],p\leq 1000\) ,可以考虑暴力 每次在主席树的 \([l,r]\) 区间找到对应的数字 具体看代码吧 code C code #include<bits/stdc++.h> using namespace std; #define ll long long ll s[3005][3005],n,k,p; int main() { scanf("%lld%lld%lld",&n,&k,&p); s[0][0]=1; for(int j=1;j<=k;++j) for(int i=3*j;i<=n;++i) s[i][j]=(1ll*(i-1)*(i-2)*s[i-3][j-1]+1ll*(i-1)*s[i-1][j])%p; printf("%lld\n",s[n][k]); return 0; } top I code

Codeforces Round #592 (Div. 2)

假装没事ソ 提交于 2020-02-04 12:13:02
A. Pens and Pencils (CF 1244 A) 题目大意 给定 \(a,b,c,d,k\) ,问是否 \(\lceil \dfrac{a}{c} \rceil + \lceil \dfrac{b}{d} \rceil \leq k\) ? 解题思路 快速读懂题意即可。 神奇的代码 #include <bits/stdc++.h> #define MIN(a,b) ((((a)<(b)?(a):(b)))) #define MAX(a,b) ((((a)>(b)?(a):(b)))) #define ABS(a) ((((a)>0?(a):-(a)))) using namespace std; typedef long long LL; typedef vector<int> VI; typedef pair<int,int> PII; typedef vector<PII> VPII; typedef vector<LL> VL; typedef pair<LL,LL> PLL; typedef vector<PLL> VPLL; template <typename T> void read(T &x) { int s = 0, c = getchar(); x = 0; while (isspace(c)) c = getchar(); if (c == 45

POJ1423 Big Number 暴力or斯特林公式??

筅森魡賤 提交于 2020-02-04 09:55:15
好吧这题很水。。。可是我没想到正解。。。 题意:求n!有多少位。 正解:斯特林公式。 直接放代码。。。 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<cmath> #include<cctype> #include<cstdlib> #include<vector> #include<map> #include<set> #define ll long long #define R register int static char B[1<<15],*S=B,*D=B; #define getchar() (S==D&&(D=(S=B)+fread(B,1,1<<15,stdin))?EOF:*S++) const int N=10000000; const long double PI=3.141592653589793238463,e=2.7182818284590452354; using namespace std; inline int g() { R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix; do ret=ret*10+(ch^48)

【AW346】走廊泼水节

两盒软妹~` 提交于 2020-02-02 22:46:56
题目链接: https://www.acwing.com/problem/content/348/ 题目大意:给定一棵 \(n\) 个节点的树,要求增加若干条边,把这棵树扩充为完全图,并满足图的唯一最小生成树仍然是这棵树, 求增加的边的权值总和最小是多少 solution 很显然 , 对于增加一条连接 \(a_i\) , \(b_i\) 的边 , 要满足图的唯一最小生成树仍然是这棵树 , 它的边权至少为 \(max\left\{dis(u , v)\right\}(u , v \in Path(a_i , b_i)) + 1\) , 只要枚举每一条边 , 求出最小值并求和即可 时间复杂度 : \(O(n^2logn)\) 感觉上面那个算法不太好写 , 而且时间复杂度也不够优秀... 于是可以换种思路 , 考虑 \(kruscal\) 的过程 , 对于一条连接 \(a_i\) , \(b_i\) , 权值为 \(w_i\) 的边 , 它连接起了 \(a_i\) , \(b_i\) 所在的两个连通块 , 对于这两个连通块之间的边的权值一定不会小于这条边 , 设这两个连通块的大小为 \(size_a\) , \(size_b\) , 则这两个连通块之间的连边的总权值最小为 \((size_a \times size_b - 1) \times (w_i + 1)\) , 模拟 \

CF6

半腔热情 提交于 2020-02-01 22:36:44
A A 不解释 #include<bits/stdc++.h> using namespace std; namespace red{ inline int read() { int x=0;char ch,f=1; for(ch=getchar();(ch<'0'||ch>'9')&&ch!='-';ch=getchar()); if(ch=='-') f=0,ch=getchar(); while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?x:-x; } int a[5]; inline bool check(int id) { return (a[id]+a[id+1]>a[id+2]&&a[id+2]-a[id+1]<a[id]); } inline bool check2(int id) { return (a[id]+a[id+1]>=a[id+2]); } inline void main() { for(int i=1;i<=4;++i) a[i]=read(); sort(a+1,a+4+1); if(check(1)||check(2)) puts("TRIANGLE"); else if(check2(1)||check2(2)) puts("SEGMENT"); else

CF Round #509 (Div. 2)

旧街凉风 提交于 2020-02-01 13:30:00
前言:第一次打 \(CF\) ,因为经验不足以及英语水平很烂,即便在机房大佬的带领下也是花了好久才读懂题目。。 \(A\) 题直到 \(11\) 分钟才 \(A\) ,题目一共才做了 \(4\) 题,太菜了。。 A. Heist Description 有 \(n\) 个正整数,设最小的数为 \(minn\) ,最大的数为 \(maxn\) ,求 \(minn\sim maxn\) 的正整数连续区间里有多少数不属于这 \(n\) 个正整数。 Solution 显然答案就是 \(maxn-minn-n+1\) #include<cstdio> using namespace std; inline int re() { int x = 0; char c = getchar(); bool p = 0; for (; c < '0' || c > '9'; c = getchar()) p |= c == '-'; for (; c >= '0' && c <= '9'; c = getchar()) x = x * 10 + c - '0'; return p ? -x : x; } inline int maxn(int x, int y) { return x > y ? x : y; } inline int minn(int x, int y) { return x < y

[FJOI2018]领导集团问题

青春壹個敷衍的年華 提交于 2020-02-01 00:47:30
  这道题好像有个名字:树上 \(\text{LIS}\) 。   先考虑链上的情况。这个很经典:所要维护的信息 \(f_i\) 就是后缀中选取 \(i\) 个元素时,最前面元素的最大值。显然这个数组是递增的,数组大小就是答案(最多可选取 \(size\) 个元素)。加入 \(w\) 时二分找到刚好比 \(w\) 大的位置 \(pos\) ,则 \(pos+1\) 就可以被 \(pos\) 修改。   由此我们来考虑树上的情况:也就是将多条链合并起来。由于链与链之间互不影响,简单推一推发现,相当于将这些链上的元素合并再排序。最后再修改 \(pos+1\) 。 \(\text{set}\) 或线段树合并都可以,后者复杂度更加优秀。   这个是用 \(\text{set}\) 实现的。复杂度 \(\text{O}(n\log^2n)\) 。 #include <cstdio> #include <cstring> #include <iostream> #include <vector> #include <set> #define ll long long #define ull unsigned long long #define rep(i, a, b) for (int i = a, i##end = b; i <= i##end; ++i) #define per(i, a,

字符串,字符数组

孤人 提交于 2020-01-31 23:24:55
字符数组/字符串 字符类型 字符类型是能存字符的数据类型,除了存储 \(ASCII\) 表里面的数组以外,还能存储类似"\n","\t"的转义字符。比如:"\n"是换行,"\t"是制表符(不懂就自己试试) char a = '\n'; cout << 1 << a << 1; 这个程序的输出就是 1 1 也就是说 \(a\) 就代表了换行。记得 printf("%d\n",x)的含义吗?这里的\n 和前面的是同样的意思。 字符串 字符串是指一串字符,字符串的实质就是数组。需要特别注意的是,"txtxt"的字符串存储就是"txtxt\0",其中,\0代表一个字符串的结尾。 输入方法: 直接读入一个没有空格的字符串: string a; cin >> a; 字符数组 就是字符类型的数组。和字符串有什么区别呢?一点区别 字符数组基本不用 char a[1000]; string b; 以上两种声明方法有什么区别?基本没有。 char a[1000]; string b; b[0] = 'f'; 上面这种操作就是完全可以的。简单来讲:字符串类似字符数组。他们有两点不同之处: 字符数组有两种声明方式:char a[1000],string a 这两种声明方式微微不同。 char a[1000]声明的数组不支持a = "abcdefghi"这种赋值方式,但是他支持cin >> a这种读入方式