2023年中国高校计算机大赛

总结:本场比赛总共A了两题,主要是因为是在课上做的,老师一直比比个不停,还让关上手机电脑,静不下心去做,做题感觉很差
A A Xor B
两个数异或和为零则两个数相等!!!
思路:使用数组记录每个数的个数,可以先输入,然后再对数组进行逐个遍历,可通过计算得出数对个数等于每个数的平方和 。也可以边输入边处理,每输入一个数便更新数对的结果数
赛场AC代码:
#include#include#define int long longusing namespace std;int a[100005];int b[114520];signed main(){int n,ans=0;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];ans-=(b[a[i]]*b[a[i]]);b[a[i]]++;ans+=(b[a[i]]*b[a[i]]);}cout<
另一种思路:
#include#define int long longusing namespace std;const int N=1000005;int a[N];signed main(){int x,n,ans;cin>>n;for(int i=0;i>x;a[x]++;}for(int i=0;i<=N;i++){ans+=a[i]*a[i];}cout<
B 吃苹果
思路:贪心算法,计算早上和晚上愉悦值的差并进行排序,差值越小(可能为负值)则代表晚上的愉悦值相对早上的更多,先选晚上的,剩下的则为早上的
注意对结构体的定义和结构体的排序!!!
赛场AC代码:
【2023年中国高校计算机大赛】#include#include#include#define int long longusing namespace std;const int N=100005;struct Node{int a;int b;int c;}ap[N];bool cmp(Node x,Node y){returnx.c>n>>k;for(int i=0;i>ap[i].a>>ap[i].b;ap[i].c=ap[i].a-ap[i].b;}sort(ap,ap+n,cmp);for(int i=0;i 另一种思路:(也可以反过来)
#include#includeusing namespace std;const int N=100005;int a[N];int main(){int n,k,x,y;cin>>n>>k;int ans=0;for(int i=1;i<=n;i++){cin>>x>>y;ans+=x;a[i]=y-x;} sort(a+1,a+n+1,greater());for(int i=1;i<=k;i++){ans+=a[i];} cout<
#include#includeusing namespace std;const int N=100005;int a[N];int main(){int n,k,x,y;cin>>n>>k;int ans=0;for(int i=0;i>x>>y;ans+=x;a[i]=x-y;;}sort(a,a+n);for(int i=0;i
Cn皇后问题
思路:用四个数组分别表示横竖左斜右斜
注意超时问题!!!
cin/cout会超时,需要用:
ios::(false);
cin.tie(0);
cout.tie(0);
或者使用scanf!!!
#include#includeusing namespace std;const int N=3000005;bool h[N],l[N],a[N],b[N];int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int n,T;cin>>n>>T;while(T--){int x,y;cin>>x>>y;if(h[x]||l[y]||a[x-y+1000000]||b[x+y]){cout<<"No"<
D 分苹果
思路:数学知识,将坐标分别带入直线方程,结果大于零和小于零位于直线两侧
#include#include#define int long longusing namespace std;int ans[5];signed main(){int n,ae,be,ce,ar,br,cr;cin>>n;cin>>ae>>be>>ce;cin>>ar>>br>>cr;int x,y,a,b;while(n--){cin>>x>>y;a=ae*x+be*y+ce;b=ar*x+br*y+cr;if(a>0&&b>0){ans[0]++;}else if(a>0&&b<0){ans[1]++;}else if(a<0&&b>0){ans[2]++;}else{ans[3]++;}}sort(ans,ans+4);for(int i=0;i<4;i++){cout<
E完型填空
思路:动态规划,用数组dp[i][j][k][p]分别表示有ijkp道题选ABCD
887260fdeb82d59f4c7f3809b2b61a23
#includeusing namespace std;const int N=30;int dp[N][N][N][N];int a[105][5];int main(){int n,h;cin>>n;for(int i=1;i<=n;i++){for(int j=1;j<=4;j++){cin>>a[i][j];}}for(int i=0;i<=n/4;i++){for(int j=0;j<=n/4;j++){for(int k=0;k