P1428 小鱼比可爱
题目描述
人比人,气死人;鱼比鱼,难死鱼。小鱼最近参加了一个“比可爱”比赛,比的是每只鱼的可爱程度。参赛的鱼被从左到右排成一排,头都朝向左边,然后每只鱼会得到一个整数数值,表示这只鱼的可爱程度,很显然整数越大,表示这只鱼越可爱,而且任意两只鱼的可爱程度可能一样。由于所有的鱼头都朝向左边,所以每只鱼只能看见在它左边的鱼的可爱程度,它们心里都在计算,在自己的眼力范围内有多少只鱼不如自己可爱呢。请你帮这些可爱但是鱼脑不够用的小鱼们计算一下。
题解
用枚举即可,用一个数组存储每个鱼的可爱值,双循环比较可爱值,再用另一个数组存储多少鱼不如自己可爱,最后输出即可。
详细代码如下,有疑问的在评论区提出即可:
#include<iostream>
using namespace std;
int a[101]={0};
int b[101];//={0};
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)//读入每条小鱼的可爱值
{
cin>>a[i];
}
b[1]=0;//最左的肯定是0,哈哈!
for(int j=1;j<=n;j++)//枚举。把后面每一条小鱼和当前a[j]比较
{
for(int k=j+1;k<=n;k++)
{
if (a[k]>a[j])//只要比 a[j]高就加1分
{
b[k]++;
}
}
}
for(int m=1;m<=n;m++)
{
cout<<b[m]<<" ";
}
return 0;
}
P1427 小鱼的数字游戏
题目描述
小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字 aiai(长度不一定,以 00 结束),记住了然后反着念出来(表示结束的数字 00 就不要念出来了)。这对小鱼的那点记忆力来说实在是太难了,你也不想想小鱼的整个脑袋才多大,其中一部分还是好吃的肉!所以请你帮小鱼编程解决这个问题。
题解
存入数组,遇到0停下,然后倒着输出即可。
详细代码如下,有疑问的在评论区提出即可:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main(void){
int a[100];
int i,j;
for(i=0;i<100;i++)
{
cin>>a[i];
if(a[i]==0){
break;
}
}
for(j=i-1;j>=0;j--)
{
if(j==0){
cout<<a[0];
}else{
cout<<a[j]<<" ";
}
}
return 0;
}
P5727 【深基5.例3】冰雹猜想
题目描述
给出一个正整数 nn,然后对这个数字一直进行下面的操作:如果这个数字是奇数,那么将其乘 33 再加 11,否则除以 22。经过若干次循环后,最终都会回到 11。经过验证很大的数字(7×10117×1011)都可以按照这样的方式比变成 11,所以被称为“冰雹猜想”。例如当 nn 是 2020,变化的过程是 20→10→5→16→8→4→2→120→10→5→16→8→4→2→1。
根据给定的数字,验证这个猜想,并从最后的 11 开始,倒序输出整个变化序列。
题解
依据题目改变值即可,然后把每次改变的值存入数组,然后再输出数组。
详细代码如下,有疑问的在评论区提出即可:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main(void){
int n,j,i=0;
int a[250];
cin>>n;
a[0]=n;
while(a[i]!=1){
i++;
if(n%2==0){
n=n/2;
a[i]=n;
}
else if(n%2==1)
{
n=n*3+1;
a[i]=n;
}
}
for(j=i;j>=0;j--)
{
if(j==0){
cout<<a[0];
}
else{
cout<<a[j]<<" ";
}
}
return 0;
}
P1047 [NOIP2005 普及组] 校门外的树
题目描述
某校大门外长度为 ll 的马路上有一排树,每两棵相邻的树之间的间隔都是 11 米。我们可以把马路看成一个数轴,马路的一端在数轴 00 的位置,另一端在 ll 的位置;数轴上的每个整数点,即 0,1,2,…,l0,1,2,…,l,都种有一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
题解
我用了比较笨拙的方法,直接把最大范围的数组的每一位数都赋值为1,然后读入左右边r,l,然后就把左边遍历到右边,逐一将下标为这个范围的都变成0,最后将范围相加即可。
详细代码如下,有疑问的在评论区提出即可:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<cmath>
int a[10004];
using namespace std;
int main(void){
int l,m,v,u,i=0,k,j;
for(k=0;k<10004;k++){
a[k]=1;
}
cin>>l>>m;
for(i=0;i<m;i++)
{
cin>>v>>u;
for(j=v;j<=u;j++)
{
a[j]=0;
}
}int sum=0;
for(i=0;i<=l;i++)
{
sum+=a[i];
}
cout<<sum<<endl;
return 0;
}
P5728 【深基5.例5】旗鼓相当的对手
题目描述
现有 NN 名同学参加了期末考试,并且获得了每名同学的信息:语文、数学、英语成绩(均为不超过 150150 的自然数)。如果某对学生 〈i,j〉〈i,j〉 的每一科成绩的分差都不大于 55,且总分分差不大于 1010,那么这对学生就是“旗鼓相当的对手”。现在想知道这些同学中,有几对“旗鼓相当的对手”?同样一个人可能会和其他好几名同学结对。
题解
双循环,每个都与每个后面的所有数都比较一下,看是否满足旗鼓相当的对手的条件,满足就为一对。用一个int记录队数即可。
详细代码如下,有疑问的在评论区提出即可:
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main(void) {
int n,a,b,c,i,j,k,s1,s2,f=0;
int arr[1001];
int brr[1001];
int crr[1001];
cin>>n;
for(i=1;i<=n;i++){
cin>>a>>b>>c;
arr[i]=a;
brr[i]=b;
crr[i]=c;
}
for(j=1;j<=n;j++){
for(k=j+1;k<=n;k++){
s1=arr[j]+brr[j]+crr[j];
s2=arr[k]+brr[k]+crr[k];
if(arr[j]-arr[k]<=5&&arr[j]-arr[k]>=-5&&brr[j]-brr[k]<=5&&brr[j]-brr[k]>=-5&&crr[j]-crr[k]<=5&&crr[j]-crr[k]>=-5&&s1-s2<=10&&s1-s2>=-10){
f++;
}
}
}
cout<<f;
return 0;
}
P5729 【深基5.例7】工艺品制作
题目描述
(由于公式复制到这里都是乱码,而作者又懒得打,所以这个没有题目复制)
题解
这道题还是考察对数组的运用。
开一个三维循环数组,判断每个小方块有没有被切掉。题目里有一句话提醒得很到位:
换句话说,所有满足x1到x2,y1到y2,z1到z2的点都会被激光蒸发。
先定义一个sum=x*y*z,将所有的都乘上,初始化为总数(如果所有都没有被切割的情况下)
所以我们就循环出这区间的所有小方块,把它们设为未被蒸发的,也就是初始化为0,然后用三重循环循环每一个维度,如果在这个区间内且未被蒸发的就将其变成1,总数--,最后再输出剩余没有被蒸发的数量总和sum。
详细代码如下,有疑问的在评论区提出即可:
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
int arr[25][25][25]={0};
int main(){
int x,y,z,q,sum,x1,y1,z1,x2,y2,z2;
cin>>x>>y>>z>>q;
sum=x*y*z;
for(int i=0;i<q;i++){
cin>>x1>>y1>>z1>>x2>>y2>>z2;
for(int j=x1;j<=x2;j++){
for(int k=y1;k<=y2;k++){
for(int t=z1;t<=z2;t++){
if(arr[j][k][t]==0){
arr[j][k][t]=1;
sum--;
}
}
}
}
}
cout<<sum<<endl;
return 0;
}
P2550 [AHOI2001] 彩票摇奖
题目描述
为了丰富人民群众的生活、支持某些社会公益事业,北塔市设置了一项彩票。该彩票的规则是:
每张彩票上印有 7 个各不相同的号码,且这些号码的取值范围为 1∼33。
每次在兑奖前都会公布一个由七个各不相同的号码构成的中奖号码。
共设置
7 个奖项,特等奖和一等奖至六等奖。
兑奖规则如下:
特等奖:要求彩票上 7 个号码都出现在中奖号码中。
一等奖:要求彩票上有 6 个号码出现在中奖号码中。
二等奖:要求彩票上有 5 个号码出现在中奖号码中。
三等奖:要求彩票上有 4 个号码出现在中奖号码中。
四等奖:要求彩票上有 3 个号码出现在中奖号码中。
五等奖:要求彩票上有 2 个号码出现在中奖号码中。
六等奖:要求彩票上有 1 个号码出现在中奖号码中。
注:兑奖时并不考虑彩票上的号码和中奖号码中的各个号码出现的位置。例如,中奖号码为
23 31 1 14 19 17 18,则彩票 12 8 9 23 1 16 7 由于其中有两个号码(23 和 1)出现在中奖号码中,所以该彩票中了五等奖。
现已知中奖号码和小明买的若干张彩票的号码,请你写一个程序帮助小明判断他买的彩票的中奖情况。
题解
我的做法是把正确的会中奖的号码存在0行数组里面,后面的依次存入,再另外开一个数组brr来记录每一个号码中有几个与中奖号码相同,用三重循环即可,然后再遍历brr,用另外一个数组记录每个等奖的情况。最后输出即可。
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
int main(void){
int n,i,j,k,f,t;
int arr[1002][7];
int brr[1002]={0};
int crr[8]={0};
cin>>n;
for(i=0;i<7;i++){
cin>>arr[0][i];
}
for(j=1;j<=n;j++){
for(k=0;k<7;k++){
cin>>arr[j][k];
}
}
for(j=1;j<=n;j++){
for(k=0;k<7;k++){
for(t=0;t<7;t++){
if(arr[j][k]==arr[0][t])
brr[j]++;
}
}if(brr[j]==7){
crr[1]++;
}else if(brr[j]==6){
crr[2]++;
}else if(brr[j]==5){
crr[3]++;
}else if(brr[j]==4){
crr[4]++;
}else if(brr[j]==3){
crr[5]++;
}else if(brr[j]==2){
crr[6]++;
}else if(brr[j]==1){
crr[7]++;
}
}
cout<<crr[1]<<" "<<crr[2]<<" "<<crr[3]<<" "<<crr[4]<<" "<<crr[5]<<" "<<crr[6]<<" "<<crr[7];
return 0;
}
P2615 [NOIP2015 提高组] 神奇的幻方
题目描述
(由于公式复制到这里都是乱码,而作者又懒得打,所以这个没有题目复制)
题解
为了方便起见,不超过数组范围,我从1行1列到n行n列记录整个n*n的行列。
按照规律填数,从2到n*n,单用一个Int hang记录行数,lie 记录列数,依题意变化即可,把数计入二维数组,最后遍历输出即可。
主要是用数学思维去想,用数学表达式去表示整一道题的思路,怎么去判断,怎么将行数列数加减,什么时候行列数变成1,什么时候变成n。
详细代码如下,有疑问的在评论区提出即可:
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
int arr[50][50]={0};
int main(){
int n;
cin>>n;
int hang=1;
int lie=n/2+1;
arr[hang][lie]=1;
for(int i=2;i<=n*n;i++){
if(hang==1&&lie!=n){
hang=n;
lie=lie+1;
arr[hang][lie]=i;
}else if(lie==n&&hang!=1){
lie=1;
hang=hang-1;
arr[hang][lie]=i;
}else if(hang==1&&lie==n){
hang=(hang+1);
arr[hang][lie]=i;
}else if(hang!=1&&lie!=n){
if(arr[hang-1][lie+1]==0){
hang=hang-1;
lie=lie+1;
arr[hang][lie]=i;
}else{
hang=hang+1;
arr[hang][lie]=i;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<arr[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
P5730 【深基5.例10】显示屏
题目描述
液晶屏上,每个阿拉伯数字都是可以显示成 3×5 的点阵的(其中 X 表示亮点,. 表示暗点)。现在给出数字位数(不超过100)和一串数字,要求输出这些数字在显示屏上的效果。数字的显示方式如同样例输出,注意每个数字之间都有一列间隔。
题解
输出用‘X’表示亮点,亮点所组成的数据,由于每个数组都可以是3*5的点阵,所以可以直接用五个字符串(你们不会用字符串的,就可以用五个字符数组来记录)来记录就很方便,每一个数是什么数字就相应地给每个字符串(或者字符数组)加上可以表示该数字的三个字符即可(用if else if,else或者switch都是一样效果)。最后遍历输出这五个字符串(或者这五个字符数组即可)。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<string>
using namespace std;
int main(){
int n;
string str,s1,s2,s3,s4,s5;
cin>>n;
cin>>str;
for(int i=0;i<n;i++){
if(str[i]=='0'){
s1+="XXX";
s2+="X.X";
s3+="X.X";
s4+="X.X";
s5+="XXX";
}else if(str[i]=='1'){
s1+="..X";
s2+="..X";
s3+="..X";
s4+="..X";
s5+="..X";
}else if(str[i]=='2'){
s1+="XXX";
s2+="..X";
s3+="XXX";
s4+="X..";
s5+="XXX";
}else if(str[i]=='3'){
s1+="XXX";
s2+="..X";
s3+="XXX";
s4+="..X";
s5+="XXX";
}else if(str[i]=='4'){
s1+="X.X";
s2+="X.X";
s3+="XXX";
s4+="..X";
s5+="..X";
}else if(str[i]=='5'){
s1+="XXX";
s2+="X..";
s3+="XXX";
s4+="..X";
s5+="XXX";
}else if(str[i]=='6'){
s1+="XXX";
s2+="X..";
s3+="XXX";
s4+="X.X";
s5+="XXX";
}else if(str[i]=='7'){
s1+="XXX";
s2+="..X";
s3+="..X";
s4+="..X";
s5+="..X";
}else if(str[i]=='8'){
s1+="XXX";
s2+="X.X";
s3+="XXX";
s4+="X.X";
s5+="XXX";
}else if(str[i]=='9'){
s1+="XXX";
s2+="X.X";
s3+="XXX";
s4+="..X";
s5+="XXX";
}
if(i!=n-1){
s1+=".";
s2+=".";
s3+=".";
s4+=".";
s5+=".";
}
}
cout<<s1<<endl;
cout<<s2<<endl;
cout<<s3<<endl;
cout<<s4<<endl;
cout<<s5<<endl;
return 0;
}
P1554 梦中的统计
题目描述
(由于公式复制到这里都是乱码,而作者又懒得打,所以这个没有题目复制)
题解
用while(a>0) 一直循环取出这个数字中的每一位数,然后就每一位数%10作为数组下标++,数组记得提前初始化为0哦!
然后将0-9这十个下标数字对应的数遍历输出即可。
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
int arr[10];
void reverse(int x){
int a=x;
while(a>0){
arr[a%10]++;
a=a/10;
}
}
int main(){
int m,n;
cin>>m>>n;
for(int i=m;i<=n;i++){
reverse(i);
}
for(int i=0;i<=9;i++){
cout<<arr[i]<<' ';
}
return 0;
}
P2141 [NOIP2014 普及组] 珠心算测验
题目描述
珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。
某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?
最近老师出了一些测验题,请你帮忙求出答案。
题解
三重循环即可,记得不要重复就行,数值范围小,可以用三循环,觉得这种方法过于简单的可以尝试一下使用桶排序,代码如下:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,a[100],b[100],bk=0;//首先,定义变量,n是数的数量,a是数字,b是为了排除掉重复的,bk是为了记录(book)
cin>>n;//读入
for(int i=0;i<n;i++){
cin>>a[i];//读入
b[i]=2;//注意,这里是重点,很多人没有满分都是因为这个,把重复的计算进去了,所以在这里我们需要一个类似开关的东西来表示它到底是否重复了,如果为2就是没动过的,如果为1就是动过的
}
for(int i=0;i<n;i++){//因为只需要两个数两个数地计算,所以可以简单地弄两个循环,这里是数学的规律,如:1,2,3,4这四个数中选择两个数相加,要所有的组合方式,我们有1,2、1,3、1,4、2,3、2,4、3,4
for(int o=i+1;o<n;o++){
for(int p=0;p<n;p++){//重复地把所有的数挨个测试一遍是不是所有组合的和
if(a[p]==a[i]+a[o]&&b[p]!=1){//判定是否是所有组合的和。为了唯一性,所以要测试a是不是被动过的,b就是在这里派上用场的
bk++;
b[p]=1;//如果没动过就把a对应的b设成动过的
}
}
}
}
cout<<bk;//输出
return 0;
}
P1614 爱与愁的心痛
题目描述
最近有 nnn 个不爽的事,每句话都有一个正整数刺痛值(心理承受力极差)。爱与愁大神想知道连续 mmm 个刺痛值的和的最小值是多少,但是由于业务繁忙,爱与愁大神只好请你编个程序告诉他。
题解
我用的队列,不知道什么叫队列的可以去查一下,队列可以两头出队入队,就很符合题意这种,我的建议是不用队列也可以,找一个int
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<queue>
using namespace std;
const int MAXN=3e3+5;
int arr[MAXN],brr[MAXN];
int main(){
int n,m,t=0;
cin>>n>>m;
queue<int>q;
int sum=0;
for(int i=1;i<=n;i++){
cin>>arr[i];
brr[i]=brr[i-1]+arr[i];
}
for(int i=1;i<=n;i++){
if(q.size()==m){
if((brr[i]-brr[q.front()])<sum){
sum=(brr[i]-brr[q.front()]);
}
q.pop();
}
q.push(i);
t++;
if(q.size()<m){
sum+=arr[q.back()];
}
if(t==m){
sum+=arr[q.back()];
}
}
cout<<sum<<endl;
}
P2911 [USACO08OCT] Bovine Bones G
题目描述
Bessie loves board games and role-playing games so she persuaded Farmer John to drive her to the hobby shop where she purchased three dice for rolling. These fair dice have S1, S2, and S3 sides
respectively (2 <= S1 <= 20; 2 <= S2 <= 20; 2 <= S3 <= 40).
Bessie rolls and rolls and rolls trying to figure out which three-dice sum appears most often.
Given the number of sides on each of the three dice, determine which three-dice sum appears most frequently. If more than one sum can appear most frequently, report the smallest such sum.
POINTS: 70
题意翻译
贝茜喜欢玩棋盘游戏和角色扮演游戏,所以她说服了约翰开车带她去小商店.在那里她买了三个骰子。这三个不同的骰子的面数分别为 s1,s2,s3s1,s2,s3。
对于一个有 SS 个面的骰子每个面上的数字是 1,2,3,…,S1,2,3,…,S。每个面(上的数字)出现的概率均等。贝茜希望找出在所有“三个面上的数字的和”中,哪个和的值出现的概率最大。
现在给出每个骰子的面数,需要求出哪个所有“三个面上的数字的和”出现得最频繁。如果有很多个和出现的概率相同,那么只需要输出最小的那个。
数据范围: 2≤s1≤202≤s1≤20,2≤s2≤202≤s2≤20,2≤s3≤402≤s3≤40。
题解
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
int arr[90]={0};
int main(){
int s1,s2,s3;
cin>>s1>>s2>>s3;
for(int i=1;i<=s1;i++){
for(int j=1;j<=s2;j++){
for(int k=1;k<=s3;k++){
arr[i+j+k]++;
}
}
}
int max=arr[3];
int t=3;
for(int i=4;i<=s1+s2+s3;i++){
if(max<arr[i]){
max=arr[i];
t=i;
}
}
cout<<t<<endl;
}
P1161 开灯
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<iomanip>
#include<cmath>
int a[2000004] = { 0 };
using namespace std;
int main(void) {
double b, s;
int t, n, k, i, j, h, f;
//让所有的灯都处于关灯状态
cin >> n;//读入操作次数
for (i = 0; i < n; i++) {
cin >> b>> t;
for (j = 1; j <= t; j++) { //计算每次是哪一盏灯开关,如果本身处于关灯状态变为开灯,开灯状态的改为关灯状态
s = (double)j * b;
f = floor(s);
if(a[f]==0){
a[f] = 1;
}
else {
a[f] = 0;
}
}
}
for (h = 1; h < 2000004; h++)//输出每盏灯,逐一查看哪一盏灯是亮着的
{
if (a[h] == 1) {
cout << h << endl;//亮的就输出
break;
}
}
return 0;
}
P5731 【深基5.习6】蛇形方阵
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<iomanip>
using namespace std;
int main(void){
int n;
cin>>n;
int x=1,y=1,mark=1;
int arr[15][15]={0};
arr[x][y]=1;
while(mark<n*n){
while(arr[x][y+1]==0&&y+1<=n){
y++;mark++;
arr[x][y]=mark;
}
while(arr[x+1][y]==0&&x+1<=n){
x++;mark++;
arr[x][y]=mark;
}
while(arr[x][y-1]==0&&y-1>=1){
y--;mark++;
arr[x][y]=mark;
}
while(arr[x-1][y]==0&&x-1>=1){
x--;mark++;
arr[x][y]=mark;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<setw(3)<<setfill(' ')<<arr[i][j];
}
cout<<endl;
}
return 0;
}
P5732 【深基5.习7】杨辉三角
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
int fun(int n,int m){
if(m==0||n==m){
return 1;
}
else{
return fun(n-1,m-1)+fun(n-1,m);
}
}
int main(void){
int n;
cin>>n;
for(int i=0;i<n;i++){
for(int j=0;j<=i;j++){
cout<<fun(i,j)<<" ";
}cout<<endl;
}
return 0;
}
P1789 【Mc生存】插火把
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
int arr[150][150]={0};
int main(){
int n,m,k,x,y;
cin>>n>>m>>k;
for(int i=0;i<m;i++){
cin>>x>>y;
for(int j=x-1;j<=x+1;j++){
for(int t=y-1;t<=y+1;t++){
if(arr[j][t]==0&&j>0&&t>0){
arr[j][t]=1;
}
//不注意范围就很容易re
}//上下动,可能会超过0的界限,变成复数
//所以需要先判断为0则是在界限范围内
}
if(x-2>0&&y>0){
if(arr[x-2][y]==0){
arr[x-2][y]=1;
}
}
if(x+2>0&&y>0){
if(arr[x+2][y]==0)
arr[x+2][y]=1;
}
if(x>0&&y+2>0){
if(arr[x][y+2]==0)
arr[x][y+2]=1;
}
if(x>0&&y-2>0){
if(arr[x][y-2]==0)
arr[x][y-2]=1;
}
}
for(int i=0;i<k;i++){
cin>>x>>y;
for(int j=x-2;j<=x+2;j++){
for(int t=x-2;t<=x+2;t++){
if(j>0&&t>0){
if(arr[j][t]==0)
arr[j][t]=1;
}
}
}
}
int count=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(arr[i][j]==0){
count++;
}
}
}
cout<<count<<endl;
return 0;
}
P1319 压缩技术
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
int arr[205][205]={0};
int b[200];
int main(){
int n,x,t;
cin>>n;
x=n*n;
int i=0;
while(x>0){
i++;
cin>>b[i];
x=x-b[i];
}
x=0;
for(int j=1;j<=i;j++){
if(j%2==0){
for(int p=1;p<=b[j];p++){
if((p+x)%n==0){
arr[(p+x)/n][n]=1;
}else{
arr[(p+x)/n+1][(p+x)%n]=1;
}
}
}
x+=b[j];
}
for(int j=1;j<=n;j++){
for(int k=1;k<=n;k++){
cout<<arr[j][k];
}
cout<<endl;
}
}
P1320 压缩技术(续集版)
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int n;
char str1[40000]={0};
char str2[200]={0};
cin>>str2;
int len=strlen(str2);
strcat(str1,str2);
int ch = '0';//上一次的字符,用来与现在字符作比较
for(int i=2;i<=len;i++){
cin>>str2;
strcat(str1,str2);//将每一次读到的一行数接到同一行str1;
}
cout<<len<<' ';
int sum=0;
int i;//每一次的相同数字的数量
for(i=0;i<=len*len;i++){
if(ch==str1[i]){
sum++;
}else{
ch=str1[i];//把字符换一下
cout<<sum<<' ';
sum=1;
}
}
return 0;
}
P1205 [USACO1.2] 方块转换 Transformations
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;//需要判断有几种方法时,可以用函数
char arr[20][20],brr[20][20];
int n;
bool f1(char h[20][20],char e[20][20])// 翻转九十度
{
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(h[i][j]!=e[j][n-i+1]){
return 0;
}
}
}
return 1;
}
bool f2(char h[20][20],char e[20][20]){//翻转180度
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(h[i][j]!=e[n-i+1][n-j+1]){
return 0;
}
}
}
return 1;
}
bool f3(char h[20][20],char e[20][20]){//翻转270度
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(h[i][j]!=e[n-j+1][i]){
return 0;
}
}
}
return 1;
}
bool f4(char h[20][20],char e[20][20]){//反射,水平翻转
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(h[i][j]!=e[i][n-j+1]){
return 0;
}
}
}
return 1;
}
bool f5a(char h[20][20],char e[20][20]){//水平翻转加九十度
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(h[i][j]!=e[n-j+1][n-i+1]){
return 0;
}
}
}
return 1;
}
bool f5b(char h[20][20],char e[20][20]){//水平翻转加180度
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(h[i][j]!=e[n-i+1][j]){
return 0;
}
}
}
return 1;
}
bool f5c(char h[20][20],char e[20][20]){//水平翻转加270度
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(h[i][j]!=e[j][i]){
return 0;
}
}
}
return 1;
}
bool f6(char h[20][20],char e[20][20]){// 判断是否相等
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(h[i][j] != e[i][j])
return 0;
}
}
return 1;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>arr[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>brr[i][j];
}
}
//判断7种情况
if(f1(arr,brr)) cout<<1;
else if(f2(arr,brr)) cout<<2;
else if(f3(arr,brr)) cout<<3;
else if(f4(arr,brr)) cout<<4;
else if( f5a(arr,brr) || f5b(arr,brr) || f5c(arr,brr))
cout<<5;
else if(f6(arr,brr)){
cout<<6;
}
else cout<<7;
return 0;
}
标签:std,arr,using,int,题解,namespace,洛谷题,103,include
From: https://blog.csdn.net/Zhtsj/article/details/143580289