(原题直通车)https://codeforces.com/contest/1167
难过的我又掉了19分!!!!
A题:
难度仅仅比Hello world难一点。问可不可以变成电话号码必须满足8开头11位数,就看一下距离第一个8 有多远,如果总长度减去该长度不满11则输出NO。
#include <iostream>
#include <algorithm>
#include <string.h>
using namespace std;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
char s[2000];
cin>>s;
int uu=n-11;
if(uu<0)
{
cout<<"NO"<<endl;
continue;
}
else if(uu==0)
{
if(s[0]=='8')cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
else
{
int i;
for(i=0;i<=uu;i++)
{
if(s[i]=='8')break;
}
if(i==uu+1)cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
}
return 0;
}
B题:
第一次遇见的交互题,被Idleness limit exceeded on test 1整懵逼(未刷新输出,endl自动刷新输出,但你要保证你要看懂题目意思了,否则刷新输出了,还是这个错误,或者是WA)!!听学长解释一波,瞬间明白了。所谓交互题就是你的输入是系统给你的输出,系统给你的输出是你的输入。跟机器形成对话。猜一猜序列“4, 8, 15, 16, 23, 42”的排列顺序。你只能问4次,每一次问两个数的乘积,你要保证你的代码可以推出这个序列的排序。则你必须在四次提问的过程中问到5个数。所以你可以问他1*2,2*3,3*4,4*5分别是多少。然后你的代码就是对这6个数进行全排列,看看哪一种排列顺序符合你问的答案。
#include<bits/stdc++.h>
using namespace std;
int a[6] = {4, 8, 15, 16, 23, 42},ans[7],mm[6];
int vis[5],f;
void dfs(int step)
{
if(step==7)
{
if(ans[1]*ans[2]==mm[1]&&ans[2]*ans[3]==mm[2]&&ans[3]*ans[4]==mm[3]&&ans[4]*ans[5]==mm[4])
{
cout<<"! "<<ans[1]<<" "<<ans[2]<<" "<<ans[3]<<" "<<ans[4]<<" "<<ans[5]<<" "<<ans[6]<<endl;
}
}
for(int i=0;i<6;i++)
{
if(!vis[i])
{
ans[step]=a[i];
vis[i]=1;
dfs(step+1);
vis[i]=0;
}
}
}
int main()
{
for(int i=1;i<5;i++)
{
cout<<"? "<<i<<" "<<i+1<<endl;
scanf("%d",&mm[i]);
}
dfs(1);
}
C题:
并查集的板子题。问一个集合内有多少人。直接贴代码:
#include<iostream>
using namespace std;
int father[500005];
int pp[500005];
int q[500005];
int find(int x)
{
if(x!=father[x])
father[x] = find(father[x]);
return father[x];
}
void combine(int a,int b)
{
int ffa=find(a);
int ffb=find(b);
if(ffa==ffb)
{
return;
}
father[ffb]=ffa;
q[ffa]+=q[ffb];
}
int main()
{
int n,m,i,j;
cin>>n>>m;
for(i=1;i<=n;i++){
father[i]=i;
q[i]=1;
}
int a,b;
for(j=0;j<m;j++)
{
cin>>a;
for(i=0;i<a;i++)
{
cin>>pp[i];
if(i>=1)
combine(pp[i-1],pp[i]);
}
}
for(i=1;i<=n;i++)
{
if(i==1)
cout<<q[find(i)];
else
cout<<" "<<q[find(i)];
}
return 0;
}