我的代码
- #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都不是中间的点 ,含一个是边上的点,含两个是四角的点
- #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后是不是两个人到达队伍两端
- #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
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<
- }
- }

J题 黑暗爆炸 - 1218
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;
- }
