AI智工作室11.19练习题解

CodeForces - 710A 

 训练1(共12题) - Virtual Judge

 我的代码

#include<iostream>
using namespace std;
int main()
{
	char arr[10][10],a;
	int b,c,k=0;
	cin>>a>>c; b=a-'a'+1;
//	cout<<b<<" "<<c<<endl; 
	for(int i=0;i<=9;i++)
	{
		for(int j=0;j<=9;j++) 
		{
			arr[i][j]='0';
		}
	}
		for(int i=1;i<=8;i++)
	{
		for(int j=1;j<=8;j++) 
		{
			arr[i][j]='*';
		}
	}
/*	for(int i=0;i<=9;i++)
	{
		for(int j=0;j<=9;j++) 
		{
			cout<<arr[i][j];
		}
		cout<<endl;
	}*/
	 
	
	if(arr[b-1][c+1]=='*') k++;
	if(arr[b][c+1]=='*') k++;
	if(arr[b][c-1]=='*') k++;
	if(arr[b+1][c]=='*') k++;
	if(arr[b-1][c]=='*') k++;
	if(arr[b+1][c+1]=='*') k++;
	if(arr[b+1][c-1]=='*') k++;
	if(arr[b-1][c-1]=='*') k++;
	cout<<k<<endl;
	
	
}

 陈杨的

#include<stdio.h>
int main(){
	char c;
	int d;
	int val=0;
	scanf("%c",&c);
	scanf("%d",&d);
	if(c=='a'||c=='h'){
		val+=1;
	}
	if(d==1||d==8){
		val+=1;
	}
	if(val==0){
		printf("8");
	}
	if(val==1){
		printf("5");
	}
	if(val==2){
		printf("3");
	}
	return 0;
}//不在棋盘边上点 输出都是8;
//边上的点 除了四个角都是8-3
//四个角的点8-3-2
//坐标(x,y)里含a、h、1、8都不是中间的点 ,含一个是边上的点,含两个是四角的点 

CodeForces - 1257A 

#include<iostream>
using namespace std;
#include<bits/stdc++.h>
int main()
{
	int k,n,x,a,b,j=0;
	cin>>k;
	while(k--)
	{
		cin>>n>>x>>a>>b;
		j=abs(a-b);
		
		 if(x==0) cout<<j<<endl;
		else if(j==n-1)
		{cout<<n-1<<endl;
		continue;
		}
		else 
		{
			if((j+x)<n-1)
			cout<<j+x<<endl;
			else cout<<n-1<<endl;
		}
		
		 
	}
}

 陈杨的

#include<stdio.h>
#include<math.h>
int main(){
	int t;
	int n,x,a,b;
	int dist;
	scanf("%d",&t);
	while(t--){
		scanf("%d%d%d%d",&n,&x,&a,&b);
		dist=abs(a-b);
		dist+=x;
		if(dist>n-1){
			dist=n-1;
		}
		printf("%d\n",dist);
	}
	
} 
//每次交换操作 位置能加一或减一
//题干里的原话是“你能交换的次数”,可以理解为如果达到最远的距离就可以停止操作 
//一个if判断就能得出答案了,也就是判断一下操作x次+1后是不是两个人到达队伍两端 

 H CodeForces - 988A 

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n,k,a[9999]={0},b[9999],ai,j=0;
	cin>>n>>k; 
	for(int i=0;i<n;i++) 
	{
		cin>>ai;
		if(a[ai]==0) 
		{
		a[ai]=1;b[j++]=i; 
		}
		
	}
	if(j<k)cout<<"NO"<<endl;
	else 
	{
		cout<<"YES"<<endl;
		for(int i=0;i<k;i++) 
		{
			if(i==j-1)
			{
			cout<<b[i]+1<<" ";	return 0;
			}
			else
			{
			cout<<b[i]+1<<" ";	
			}
			
		}
	}
	
} 
 			 			  	  	 			 			 	  	 		

 陈杨的

#include<stdio.h>
int b[101]={0};
int a[101];
int j=1;
int n=0;
int k=0;
int s=0;
int temp=0;
int main(){
	scanf("%d%d",&n,&k);
	for(int i=1;i<=n;i++){
		scanf("%d",&temp);
		if(b[temp]==0){
			b[temp]+=i;
			s++;
		}
	}
	if(s<k){
		printf("NO\n");
		
	}else{
		int cnt=0;
		printf("YES\n");
		for(int i=1;i<=100&&k;i++){
			
			if(b[i]!=0){
			printf("%d ",b[i]);	
			cnt++;
			if(cnt==k)return 0;
			}
			
		}
    
	}
} 
//可以将题目概括为:输入 一个变量n和一个变量k,n代表接下来将会有一组个数为n的数据,
// 每个数据范围(1-100),这个数值代表一个人的性格值;
//k代表性格种类个数,
//题目要求判断这n个性格值的数据组中能否分成k个以上的类 
//例如1 1 2 3能分成3类、1 2 3 4能分成四类
//判断完后,如果类别数能达到k,再输出k个个性不同的人对应数组里的位置 ;例如{15 13 15 15 12} 中输出{1 2 5 } 
//利用一个桶数组b[i],作用是记录i性格的人有没有出现过,b[i]存储性格i第一次出现时是位置也就是 当时n个人中的第几个
//读入数据时 例如此时输入的性格为temp 判断b[temp]是否为零,如果为零 说明此时的temp是全新的性格,
//需要用b[]记录,及b[temp]=i,同时当前出现的性格种类+1 
//如果不为零 说明之前已经出现过性格为temp的人,不做任何改变
//到最后输入完成,cnt计数器统计完成了性格类别的个数,同时数组b[]中已经记录了出现过的且第一次出现性别的位置
// 最后输出判断cnt是否大于k,如果是,再将k和数组b的信息输出即可
//注意题目说只需要输出k种,多出来的cnt-k不能输出 

 CodeForces - 1539Bhttps://vjudge.net/contest/528020#problem/FCodeForces - 1539B

训练1(共12题) - Virtual Judge

I题

佩蒂娅曾经写过一首悲伤的情歌,并将它分享给瓦莎。这首歌是一串由小写英文字母组成的字符串。瓦莎就这首歌编了q个问题。每个问题都是关于歌曲中第 l 个字母到第 r 个字母的一个子段。Vasya按照这个子段的字符串的顺序从左到右歌唱,对于每个字母我们会对这个字母重复唱k次,其中k是字母表中对应这个字母的索引。
例如,如果问题是关于子字符串“abbcb”,那么Vasya歌唱字母“a”一次,对于每个字母“b”歌唱两次,字母“c”歌唱三次,这样结果唱出来的字符串就为“abbbbcccbb”,其长度为10。Vasya对结果字符串具体是什么不感兴趣,但是对于结果的字符串长度感兴趣。

所以请你帮助Petya,对于每次Vasya的询问,给出每次询问的子字符串的结果字符串的长度。

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
char arr[99999],c;
int main()
{
	int n,q,l,r=0,b[99999],a[99999];
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	{
		cin>>c;
		a[i]=(c-'a'+1);// 对题目中这句话“对于每个字母我们会对这个字母重复唱k次,其中k是字母表中对应这个字母的索引。” 
	}//k是每个字母对应26个英文字母表的索引,举例就是A=1 B=2 C=3 D=4 E=5 F=6 G=7 ,将每个字符串中每个字母对应的索引号存储到数组a中 
	//题目要求每次询问一个区间内的结果字符串的长度
		for(int i=1;i<=n;i++)//记录i是从1开始的,因为下面要用到他的前一项i==0
		//对应每一个数组b[n],存储着从a[1]、a[2]、a[3]、到a[n]内每一个数组的 
	{
		//使用前缀和公式 
		b[i]=b[i-1]+a[i];
	}
	for(int i=0;i<q;i++)//求区间范围内的长度 
	{
		cin>>l>>r; cout<<b[r]-b[l-1]<<endl;
	}
}
 			 			  	  	 			 			 	  	 		

 

 

J题  黑暗爆炸 - 1218 

训练1(共12题) - Virtual Judge

https://darkbzoj.cc/problem/1218

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5005;//防止越界 
int a[N][N]={0},s[N][N]={0};
int main(void)
{
	int n,r,ans,res,x,y,w;//
	scanf("%d%d",&n,&r);
	while(n--)
	{
		//输入每个坐标和它的价值 
		scanf("%d%d%d",&x,&y,&w);
		x++;
		y++; 
		a[x][y]+=w;
	}
	for(int i=1;i<N;i++)
	{
		for(int j=1;j<N;j++)
		{//套用公式,遍历,s[i][j]表示的是从[0,0]到 [i][j]这两个点所构成矩形面积内亮度的大小(a[x][y]的大小) 
			s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
		}
	}
	
		for(int i=r;i<N;i++)
	{
		for(int j=r;j<N;j++)
	{
		//输入两个坐标点求两个坐标点所构成矩形面积内亮度的大小 
		//scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
		
		//sum=pre_sum[i][j]-pre_sum[i][j-r]-pre_sum[i-r][j]+pre_sum[i-r][j-r];
	    ans=s[i][j]-s[i-r][j]-s[i][j-r]+s[i-r][j-r]; 
	  res=max(ans,res); 	
	 // if(ans>max) max=ans;
	   
	}	

    } 
 	if(res>32767)res=32767;
     printf("%d\n",res); 
	return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值