这题就是3*3的表格里需要找出成为一行,一列,对角线的大写字母组合,直接暴力即可,但是要注意细节,不能错过特例。
#include
#include
#include
#include
#include
using namespace std;
char s[4][4];
bool can1()
{
int j,k;
for (j=0;j<=2;j++)
if (s[j][0]!='.'&&s[j][1]!='.'&&s[j][2]!='.') return true;
for (k=0;k<=2;k++)
if (s[0][k]!='.'&&s[1][k]!='.'&&s[2][k]!='.') return true;
if (s[0][0]!='.'&&s[1][1]!='.'&&s[2][2]!='.') return true;
if (s[0][2]!='.'&&s[1][1]!='.'&&s[2][0]!='.') return true;
return false;
}
bool can2()
{
int j,k;
for (j=0;j<=2;j++)
if (s[j][0]!='.'&&s[j][1]!='.'&&s[j][2]!='.'&&(s[j][0]==s[j][1]&&s[j][1]==s[j][2])==false) return true;
for (k=0;k<=2;k++)
if ((s[0][k]!='.'&&s[1][k]!='.'&&s[2][k]!='.')&&(s[0][k]==s[1][k]&&s[1][k]==s[2][k])==false) return true;
if ((s[0][0]!='.'&&s[1][1]!='.'&&s[2][2]!='.')&&(s[0][0]==s[1][1]&&s[1][1]==s[2][2])==false )return true;
if ((s[0][2]!='.'&&s[1][1]!='.'&&s[2][0]!='.')&&(s[0][2]==s[1][1]&&s[1][1]==s[2][0])==false )return true;
return false;
}
int main()
{
int i,j,k,a,b,ans1=0,ans2=0;
scanf("%s",s[0]);
scanf("%s",s[1]);
scanf("%s",s[2]);
char member[27][4][4];
for (i=0;i<=25;i++)
for (j=0;j<=2;j++)
for (k=0;k<=2;k++)
member[i][j][k]='.';
for (i=0;i<=2;i++)
for (j=0;j<=2;j++)
member[s[i][j]-'A'][i][j]=s[i][j];
for (i=0;i<=25;i++)
{
for (j=0;j<=2;j++)
{
for (k=0;k<=2;k++)
s[j][k]=member[i][j][k];
}
if (can1())
ans1++;
}
for (a=0;a<=25;a++)
for (b=a;b<=25;b++)
{
for (j=0;j<=2;j++)
for (k=0;k<=2;k++)
if (member[a][j][k]!='.') s[j][k]=member[a][j][k];else s[j][k]=member[b][j][k];
if (can2())
ans2++;
}
printf("%d\n%d\n",ans1,ans2);
return 0;
}
这题就是3*3的表格里需要找出成为一行,一列,对角线的大写字母组合,直接暴力即可,但是要注意细节,不能错过特例。
#include
#include
#include
#include
#include
using namespace std;
int main()
{
int i,j,n,ans=0;
int a[100005];
scanf("%d",&n);
for (i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
for (j=n;j>=1;j--)
{
if (a[j]>=ans) ans++;
}
printf("%d\n",ans);
return 0;
}
这两题我好像双wa(哭),但是我赛后认真学习并理解了大佬的代码:
见:https://blog.csdn.net/qq_43333395/article/details/88544602
原来师兄讲的时候误了,我想了好长时间都没满带,后来问师兄发现了,原来只要先离散化,找到被动的元素,把他利用冒牌排序加上bit储存下来交换的位置倒推即可。(哭,当时只想了一半),以下是大佬的代码:
转载自上链接
#include
#include
#include
#include
#include
#define INF 0x3f3f3f3f
using namespace std;
int n,sum[100006];//这里不能开100005,不然会wa
struct node{
int id,x;
}a[100006];
bool cmp(const node&b,const node&c){
if(b.x!=c.x)return b.x>n;
memset(sum,0,sizeof(sum));
for(int i=1;i<=n;i++){
cin>>a[i].x;
a[i].id=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++){
add(a[i].id);
ans=max(ans,i-querry(i));
}
cout<
A题较简单,就删去向右的大数操作即可,见https://blog.csdn.net/qq_43333395/article/details/88412339
这题我还是跪了,既然已经学习了,就再看看吧:
https://blog.csdn.net/qq_43333395/article/details/88412558
我讨厌树上作业!!!!我之前和队员讨论过伪树的数据结构,但是比赛的时候怎么敢写?
不过这题实际上是可以化简的,因为它数据较小,邻接表是容得下,但是如果数据较大,可以用前向星在线储存,同样是字符离散化,然后把下面这段改成sort即可。总之,这是道编程复杂度挺高的题。
#include
#include
#include
#include
#include
#define INF 0x3f3f3f3f
using namespace std;
#define maxn 105
string f[maxn],cow[maxn];
int n;
string Find(string a){
for(int i=1;i<=n;i++){
if(a==cow[i]) return f[i];
}
return "";
}
int is(string a,string b){
int cnt=0;
while(b!=""){
if(a==b) return cnt;
b=Find(b);
cnt++;
}
return -1;
}
int main(){
string a,b;
cin>>n>>a>>b;
for(int i=1;i<=n;i++){
cin>>f[i]>>cow[i];
}
string now=a;
int cnta=0;
while(now!=""){
if(is(now,b)!=-1)
break;
now=Find(now);
cnta++;
}
if(now==""){
cout<<"NOT RELATED"<1&&cntb>1){
cout<<"COUSINS"<1&&cntb==0)
cout<<"grand-";
if(cntb==0)
cout<<"mother";
else
cout<<"aunt";
cout<<" of "<