今天再次开始刷题了。这里总结每天学到的新技巧。
连续读入字符,直到某个字符结束
for (; scanf("%c", &s) && s != 'E'; i ++)
{
if (s == 'W') q[i] = 1;
else if (s == 'L') q[i] = 2;
else i--;
}
这里的意思是,连续读入多行字符(本题只有W、L),直到读到E后停止,循环体内第三行是用来处理回车或者空格等,以免使数组中的数据不连续
两组关联的数据按不同大小来排序和输出
P1068 [NOIP2009 普及组] 分数线划定 - 洛谷
// 读入
scanf("%d%d", &id, &sc);
q[i++] = {sc,N - id};
// 输出
printf("%d %d\n",N - q[i].second, q[i].first);
本题的数据是一pair类型的,first记录的分数,second记录的报名号,我们需要按分数从高到低排序,当分数相同的时候,又按报名号从小到大,如果我们直接对pair类型用快排的话,就只能满足其中一个情况,所以我们用一个较大的数去减去每组数据的报名号,对两组数据按照从大到小排序输出的时候再用这个较大的数去减去seconde即可实现。
(很基础的一个)向上向下取整
int(a/b) + 1; // 向上取整
int(a/b) - 1; // 向下取整
int(a + 0.5); // 四舍五入
矩阵类的状态存储方式;用模运算来处理数组头尾循环
题解 P1328 【生活大爆炸版石头剪刀布】 - yzzxliuchao 的博客
题目给了一个二维的判断矩阵,可以单独建一个二维矩阵来表示这个判断矩阵
A,B的出拳是循环的,我们是用数组来存储二人的出拳顺序,这里用模运算处理头尾
int vs[5][5] = {{0,0,1,1,0}, //存储得分表 vs[a][b]=0表示a输b赢
{1,0,0,1,0},
{0,1,0,0,1},
{0,0,1,0,1},
{1,1,0,0,0}};
for(int i = 0; i < n; i++)
{
cnta += vs[a[i % na]][b[i % nb]];
cntb += vs[b[i % nb]][a[i % na]];
}
// A,B二人的出拳周期分别是na和nb
// 用 i%na 来处理周期