A冰墩墩和奖牌
依次比较,一旦不相同就能分出胜负
#include
#define ll long long
int a[2][5];
int main()
{
int t;
scanf("%d",&t);
for (int i=1;i<=t;i++)
{
for (int j=1;j<=3;j++)
scanf("%d",&a[0][j]);
for (int j=1;j<=3;j++)
scanf("%d",&a[1][j]);
bool p=0;
for (int j=1;j<=3;j++)
{
if (a[0][j]>a[1][j])
{
printf("former\n");
p=1;
break;
}
if (a[0][j]<a[1][j])
{
printf("latter\n");
p=1;
break;
}
}
if (!p)
printf("same\n");
}
return 0;
}
B冰墩墩和冰壶
将坐标转换为离原点的距离存储,找到红黄队中最小的距离,分别枚举即可
#include
#define ll long long
using namespace std;
int a[20],b[20];
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
int n;
int cntb=0,cnta=0,minna=1e9,minnb=1e9;
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
int x,y;
char ch;
scanf(" %c %d %d",&ch,&x,&y);
if (ch=='Y')
{
b[++cntb]=x*x+y*y;
if (minnb>b[cntb])
minnb=b[cntb];
}
else
{
a[++cnta]=x*x+y*y;
if (minna>a[cnta])
minna=a[cnta];
}
}
if (minna<=minnb)
{
printf("Win ");
int sum=0;
for (int i=1;i<=cnta;i++)
{
if (a[i]<minnb)
sum++;
}
printf("%d\n",sum);
}
else
{
printf("Lose ");
int sum=0;
for (int i=1;i<=cntb;i++)
{
if (b[i]<minna)
sum++;
}
printf("%d\n",sum);
}
}
return 0;
}
C冰墩墩666
枚举每个进制,进制转换出现连续3个6即可。
要保证转换进制后位数至少有3位,枚举进制时只需枚举到 i ∗ i < = n i*i<=n i∗i<=n
#include
#define ll long long
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
int n;
scanf("%d",&n);
bool flag=0;
for (int i=2;i*i<=n;i++)
{
int temp=n,sum=0;
while (temp)
{
if (temp%i==6)
sum++;
else
sum=0;
if (sum==3)
{
if (flag==1)
printf(" ");
printf("%d",i);
flag=1;
break;
}
temp/=i;
}
}
if (!flag)
printf("-1");
printf("\n");
}
return 0;
}
D冰墩墩和徽章
统计冰墩墩和志愿者拥有的徽章编号(a,b存储),再将某个编号出现的次数用suma,sumb存储。最后:
1.枚举 b i b_i bi ,志愿者编号为 b i b_i bi的徽章数 s u m b b i > = 2 sumb_{b_i}>=2 sumbbi>=2且冰墩墩没有这个徽章 s u m a b i = = 0 suma_{b_i}==0 sumabi==0
2.同理枚举 a I a_I aI
最后取较小值,每次结束将suma,sumb初始化
#include
#define ll long long
using namespace std;
int a[1005],b[1005];
int suma[100005],sumb[100005];
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
int tola=0,tolb=0,cnta=0,cntb=0;
int na,nb;
scanf("%d",&na);
for (int i=1;i<=na;i++)
{
int x;
scanf("%d",&x);
suma[x]++;
if (suma[x]==1)
a[++cnta]=x;
}
scanf("%d",&nb);
for (int i=1;i<=nb;i++)
{
int x;
scanf("%d",&x);
sumb[x]++;
if (sumb[x]==1)
b[++cntb]=x;
}
for (int i=1;i<=cntb;i++)
{
if (suma[b[i]]==0&&sumb[b[i]]>1)
tola++;
}
for (int i=1;i<=cnta;i++)
{
if (sumb[a[i]]==0&&suma[a[i]]>1)
tolb++;
}
printf("%d\n",tola>tolb?tolb:tola);
for (int i=1;i<=cnta;i++)
suma[a[i]]=0;
for (int i=1;i<=cntb;i++)
sumb[b[i]]=0;
}
return 0;
}
E冰墩墩和玩偶
菜鸡只会用stl的map打暴力,做法就是递归分别找所有排列,然后用map打标记判重,不写递归也可以:直接循环枚举长度就好了
详细看代码
#include
#define ll long long
using namespace std;
int sum;
string s;
map<string,int> mp;
string dfs(int l,int r)
{
string ss="";
if (l==r)
ss+=s[l];//排列中只有一个字符
else
ss=dfs(l,(l+r)/2)+dfs((l+r)/2+1,r);//递归左右排列
if (mp[ss]==0)
mp[ss]=1,sum++;
return ss;
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
mp.clear();//清空map
sum=0;
cin>>s;//c++读入字符串方法
dfs(0,s.length()-1);//递归整个排列
printf("%d\n",sum);
}
return 0;
}
F冰墩墩与颜色
有 n n n个位置,假设取 n − 1 n-1 n−1位,这种颜色选法为 3 ∗ 2 ∗ 2... ∗ 2 3*2*2...*2 3∗2∗2...∗2,(2的数目为n-2个)
剩下一个位要与旁边颜色相同,共 n − 1 n-1 n−1种情况
打表把 3*2^(n-2)求出(你用快速幂直接在循环里求也是可以的 ),最后输出答案即可(记得取余)
#include
#define ll long long
const int mod=1e9+7;
int f[1000005];
int main()
{
f[2]=3;
for (int i=3;i<=1000000;i++)
f[i]=f[i-1]*2%mod;
int t;
scanf("%d",&t);
while (t--)
{
int n;
scanf("%d",&n);
printf("%d\n",(ll)f[n]*(n-1)%mod);
}
return 0;
}