- A
#include<stdio.h>//这个题主要是结构体排序,用冒泡会超时,只能快排,桶排之类的,个人感觉快排挺不错
typedef struct _XI{//定义一个结构体存数据,做完发现有点傻了,可以直接用结构体赋值来,没必要设置一个指针来搞事情,唉
char *p;//指向名字
int v;//存成绩
char ch[105];//存名字
}XI;
void Qs(XI* x,int low,int high);
int main()
{
int n;
scanf("%d",&n);
XI x[n];
int i,j;
for(i=0;i<n;i++){
scanf("%s%d",x[i].ch,&(x[i].v));//存数据
x[i].p=x[i].ch;
}
Qs(x,0,n-1);
for(i=0;i<n;i++){
printf("%s ",x[i].p);
}
}
void Qs(XI* x,int low,int high)
{
int i=low;
int j=high;
int key=x[low].v;
char *k=x[low].p;
if(low>=high){
return;
}
while(low<high){
for(;low<high&&key<=x[high].v;high--);
if(key>x[high].v){
x[low].v=x[high].v;
x[low].p=x[high].p;
}
for(;low<high&&key>=x[low].v;low++);
if(key<x[low].v){
x[high].v=x[low].v;
x[high].p=x[low].p;
}
}
x[low].v=key;
x[low].p=k;
Qs(x,i,low-1);
Qs(x,low+1,j);
}
- C
#include<stdio.h>//这个题的数据都很大,不用long long很容易炸
long long a[1020][1020];//先把数组定义好
long long dp[1020][1020];
int main()
{
long long n,m;
scanf("%lld%lld",&n,&m);
long long i,j,k;
for(i=1;i<n+1;i++){
for(j=1;j<m+1;j++){
scanf("%lld",&a[i][j]);//填充一下初始数据
}
}
for(i=0;i<n+1;i++){//清空dp数组的行和列
dp[i][0]=0;
}
for(i=0;i<m+1;i++){
dp[0][i]=0;
}
for(i=1;i<=n;i++){//填充dp数组
for(j=1;j<=m;j++){
dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+a[i][j];
}
}
long long q;//读取测试次数
scanf("%lld",&q);
long long num[q];//存储测试结果
for(i=0;i<q;i++){
long long pt1[4];
long long pt2[4];
long long x1,y1,x2,y2,x3,y3,x4,y4;
long long sum1,sum2,sum3;
scanf("%lld%lld%lld%lld%lld%lld%lld%lld",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4);
pt1[0]=x1;pt1[1]=x2;pt1[2]=x3;pt1[3]=x4;//存所有的横坐标
pt2[0]=y1;pt2[1]=y2;pt2[2]=y3;pt2[3]=y4;//存所有的纵坐标
sum1=dp[x2][y2]-dp[x2][y1-1]-dp[x1-1][y2]+dp[x1-1][y1-1];//第一个矩形的和
sum2=dp[x4][y4]-dp[x4][y3-1]-dp[x3-1][y4]+dp[x3-1][y3-1];//第二个矩形的和
sum3=sum1+sum2;//总和
if(x3>x2||x1>x4||y3>y2||y1>y4){//如果矩形分开,就不用减
}else{//如果有重叠就要减
for(j=0;j<3;j++){//给横纵坐标排序
for(k=0;k<4-j-1;k++){
if(pt1[k]>pt1[k+1]){
long long temp1=pt1[k];
pt1[k]=pt1[k+1];
pt1[k+1]=temp1;
}
if(pt2[k]>pt2[k+1]){
long long temp2=pt2[k];
pt2[k]=pt2[k+1];
pt2[k+1]=temp2;
}
}
}
long long x_1=pt1[1],x_2=pt1[2];//取中间两个坐标确定需要减去的矩形
long long y_1=pt2[1],y_2=pt2[2];
long long sum4=dp[x_2][y_2]-dp[x_2][y_1-1]-dp[x_1-1][y_2]+dp[x_1-1][y_1-1];//需要减去的矩形
sum3=sum3-sum4;//减去矩形
}
num[i]=sum3;//储存测试数据
}
for(i=0;i<q;i++){
printf("%lld\n",num[i]);//输出数据
}
return 0;
}
- I
#include<stdio.h>
int main()//因为只要被叫奇数次就会站起来,如果是平方数A=a*a,则在a左边和右边 x1*x2=A 相互抵消,只有a孤单一人构成奇数
{
long long n;
scanf("%lld",&n);
long long i=1;
for(i=1;i*i<=n;i++){
printf("%lld ",i*i);
}
return 0;
}
- J
#include<stdio.h>//先快排排序,应该用结构体的,唉,懒的改了
void Qs(int(*num)[2],int low,int high)
{
if(low>=high){
return;
}
int i=low;
int j=high;
int key1=num[low][1];
int key2=num[low][0];
while(low<high){
for(;low<high&&key1<=num[high][1];high--);
if(key1>num[high][1]){
num[low][1]=num[high][1];
num[low][0]=num[high][0];
}
for(;low<high&&key1>=num[low][1];low++);
if(key1<num[low][1]){
num[high][1]=num[low][1];
num[high][0]=num[low][0];
}
}
num[low][1]=key1;
num[low][0]=key2;
Qs(num,low+1,j);
Qs(num,i,low-1);
}
int main()
{
int n;
scanf("%d",&n);
int num[n][2];
int i,j;
for(i=0;i<n;i++){
scanf("%d%d",&num[i][0],&num[i][1]);//读数据
}
Qs(num,0,n-1);//按照结束时间从小到大排完序
int a=num[0][1],count=1;//判定条件是下一个的起始时间要大于等于上一个的结束时间,而且最少也有一个题通过
for(i=0;i<n-1;i++){
if(num[i+1][0]>=a){//条件成立了就计入
count++;
a=num[i+1][1];//更新判定条件
}
}
printf("%d",count);
return 0;
}
- K
#include<stdio.h>//因为冒泡排序的最坏情况就是交换(n-1)*n/2次,所以只要不是全部都是反着的就YES
int main()
{
int t;
scanf("%d",&t);
int i,j;
int num[t];
for(i=0;i<t;i++){
int n;
scanf("%d",&n);
int max=(n-1)*n/2-1;
int x[n];
int count=0;
for(j=0;j<n;j++){
scanf("%d",&x[j]);
if(j>0&&x[j]<x[j-1]){
count++;
}
}
if(count==n-1){
num[i]=0;
}else{
num[i]=1;
}
}
for(i=0;i<t;i++){
if(num[i]){
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}
- L
#include<stdio.h>//异或运算,记住用long long
int main()
{
int n;
scanf("%d",&n);
int i;
long long num[1010]={0};
for(i=0;i<n;i++){
scanf("%lld",&num[i]);
}
long long sum=num[0];
for(i=0;i<n-1;i++){
sum=sum^num[i+1];
}
printf("%lld",sum);
return 0;
}
// 如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。
// 0异或任何数=任何数
// 1异或任何数->任何数取反
- M
#include<stdio.h>
int main()
{
int t;
scanf("%d",&t);
int i,j;
int num[t];
for(i=0;i<t;i++){
int n,k;
scanf("%d%d",&n,&k);
if(k>=n){
num[i]=k-n;//就是A点只有往右走(k-n)下才能到理论位置
}else{
num[i]=(n-k)%2;//在左边就只要满足(n-k)是偶数,它中点就是B点
}
}
for(i=0;i<t;i++){
printf("%d\n",num[i]);
}
return 0;
}
- F
#include<stdio.h>
int main()
{
printf("Win");
return 0;
}
这道题实在不太会,希望有大佬能讲解下,谢谢了。