目录
A - 《关于我
给你一个长度为 n(n≥3) 的正整数数组 a,该数组内除了一个数之外的所有数都相同 (例如数组 [4, 11, 4, 4] 除了 11 之外的所有数都等于 4).
输出不等于别的数的下标. 下标均从 1开始编号.
Input
第一行一个整数 t(1≤t≤100). 接下来有 t个测试样例.
每一个测试样例第一行是一个整数 n (3≤n≤100) — 数组 aa 的长度.
每个测试样例第二行有 nn 个整数a1,a2,…,an (1≤ai≤100).
保证 a 中除了一个数外的所有数都相同.
Output
对于每个测试样例输出一个整数 — 不等于别的数的下标
Example
Input
Output
解题思路:注意简化代码,避免时间超限
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t,a[102],n;
scanf ("%d",&t);//t为测试样例
while (t--)
{
int cnt[102]={0};//用cnt数组来标记这个数出现的次数,设置初始值为0
注意初始值要紧跟其所在的循环
scanf ("%d",&n);//n为数组长度
for (int i=1;i<=n;i++)
{
scanf ("%d",&a[i]);
cnt[a[i]]++;//输入时顺便标记,降低时间复杂度
}
for (int i=1;i<=n;i++)
{
if (cnt[a[i]]==1)
{
printf ("%d\n",i);//注意输出格式,要换行
break;
}
}
}
return 0;
}
B - 在上厕所,
OHgg 获得了一个大小等于 n×n 的正方形方阵,方针内有两个单元格被画上了星星,也就是被标记了. 这两个单元格可以在相同的位置(即同行同列).
他需要再给两个单元格画上星星,让这四个带星星的单元格表示为与坐标轴平行的矩形的四个角
例如,如果 n=4 并且这个矩阵看起来是这样的 (用星号标记了两个单元格)
那么他可以这样再多给两个单元格画上星星
如果有多个解决方案,输出任意一个都可以。
Input
第一行有一个整数 t (1≤t≤400). 接下来是 tt 个测试样例.
每个测试用例的第一行包含一个整数 n (2≤n≤400) — 矩阵的行和列的数量
接下来 nn 行分别包含 n个字符 '.' 或者 '*' 表示空单元格和标记单元格.
保证所有测试样例 n 的和不超过 400400.
保证矩阵上正好有两个星号。它们可以在同一行或同一列.
保证存在解决方案.
Output
对于每个测试样里,输出 nn 行,每行 nn 个字符 — 与输入内容相对应且带有四个星号的矩阵. 如果有多个正确答案输出任意一个即可.
Example
Input
Output
解题思路:
#include <bits/stdc++.h>
using namespace std;
char a[402][402];
int main()
{
int t;
cin>>t;
while (t--)
{
int n;
cin>>n;
int x1,y1,x2,y2,cnt=0;
getchar ();//防止换行被输入
for (int i=1;i<=n;i++)
{
for (int j=1;j<=n;j++)
{
scanf ("%c",&a[i][j]);
if (a[i][j]=='*'&&cnt<2)
{
if (cnt==0)x1=i,y1=j;//x1,y1代表第一个星号的行列位置
else x2=i,y2=j;//x2,y2代表第二个
cnt++;
}
}
getchar ();//防止换行符被输入
}
if (x1==x2)//行相等时
{
if (x1==n)a[1][y1]='*',a[1][y2]='*';//另外两个星号的列应该与其一致
else a[x1+1][y1]='*',a[x1+1][y2]='*';//另外两个的行数随意~
}
else if (y1==y2)/列相等时
{
if (y1==n)a[x1][1]='*',a[x2][1]='*';
else a[x1][y1+1]='*',a[x2][y1+1]='*';
}
else
{
a[x2][y1]='*';//另外两个星号的行列数固定啦~画图就可知
a[x1][y2]='*';
}
for (int i=1;i<=n;i++)//输出
{
for (int j=1;j<=n;j++)
cout <<a[i][j];
cout<<endl;//记得换行哦,注意格式
}
}
return 0;
}
D - 燕尾服
OHgg 是一个情趣高雅的人,他经常和他的朋友们打扑克. 今天他们去了一个赌场,那里有 n 个玩家 (包括 OHgg 自己) 并且他们现在桌子上都有一些筹码. 他们第 i个人有 ai 的筹码.
每个人有任意次操作,每次操作都可以让自己的筹码数量 ×2 或 ×3. 如果所有人的筹码都可以变得相同,那么 OHgg 就赢了. OHgg 有可能赢吗?
Input
第一行一个正整数 n (2 ≤ n ≤ 10的5次方), 玩家的数量.
第二行有 n 个整数 a1, a2, ..., an (1 ≤ ai ≤ 10的9次方) — 玩家手里的筹码数量.
Output
如果所有玩家可以让手里的筹码数量相同,输出 "Yes" (不带引号) ,否则输出"No"
Examples
Input
Output
Input
Output
Note
第一个样例中第一个和第三个玩家可以让自己手里的筹码乘两次 2, 第二个玩家可以乘一次 2 并且第四个玩家乘一次 2和一次 3.
可以看出第二个样例几个玩家无法让筹码相同.
解题思路:
将乘法转换为除法,如果各玩家最终能够x2,x3转化为相等的数,那么他们除2,除3的数也是相等的~
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int N =1e5+5;
int main()
{
int n;
int a[N];
scanf ("%d",&n);
for (int i=0;i<n;i++)
{
scanf ("%d",&a[i]);
while (a[i]%2==0||a[i]%3==0)//如果a【i】是2,3的倍数
{
if (a[i]%2==0) a[i]/=2;
else if (a[i]%3==0) a[i]/=3;
}
}
int flag=0;
for (int i=1;i<n;i++)
{
if (a[i]==a[i-1])
continue;
else
{
flag=1;
break;
}
}
if (flag==0) printf ("Yes\n");
else printf ("No\n");
return 0;
}