考试时间:2024/10/4 9:00~12:00三个小时
独木桥(bridge):AC 100
移动棋子(chess):80
摧毁 (destroy):AC 100
动物园 (zoo): 0 爆内存了
进步了230分(上次50分)……
一、时间分配
先做第二题(用了55分)有点长了
在做第三题(有了50分)还可以
后面的两个题(<60分)
过程
我第一个题没有思路,所以把四个题全看了一遍 最终确定了环节 : 第二题------第三题--------有时间思考另外两个题。一开始我看第二题的时候,就想到了大模拟的思路,思考+写代码用了55分钟,再做了第三题,第三题调试中发现1,2两种情况需要特判,做完了第三题,我再做的是第一题,我第一遍被一条信息迷惑了,后面我想先从中间往两边算,第三题没有头绪,我先骗分,(但是0分)……………………
第一题 AC
题目
我的思路:从中间劈开,左边往左,右边往右,这个题很水(但是一开始我没思路)
给你他的从左往右的位置,从右往左可以用总长-从左往右的
我的代码:(正解也是这样的)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n,m,b[10000005],a[1000005],maxx;
int main(){
//freopen("bridge.in","r",stdin);
//freopen("bridge.out","w",stdout);
cin>>n>>m;//输入,赋值
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];//把a数组的值给b数组,存一下
}
for(int i=1;i<=n;i++){
if(m-b[i]<m/2){//看哪边近
b[i]=m-b[i];
}
maxx=max(maxx,b[i]);//看最大值
}
cout<<maxx;
//fclose(stdin);
//fclose(stdout);
return 0;
}
第二题 80
题目:
我的思路:把所有情况枚举出来 x正y正:x<y,x>y; x正y负 x>y,x<y 有一个0 : x=0 x<y;x>y; y=0 x>y ,x<y x负y负 x>y ,x<y x负y正 x>y,x<y
但是我少了两种情况,因为我写的太乱了,没法检查。
我的代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int x,y;
int cnt;
int main(){
// freopen("chess.in","r",stdin);
// freopen("chess.out","w",stdout);
cin>>x>>y;
if(x>=0&&y>=x){
cnt+=x-y;
}
else if((x>=0&&y<0)||(x>=0&&y<x)){
x=x-x-x;
if(x<=y){
cnt+=1;
cnt+=y-x;
}
}
else if(x<0&&y>=0){
int u=abs(x);
int i=max(u,y)-min(u,y);
int j=y-x;
if(i<=j){
cnt+=1;
cnt+=i;
}
else{
cnt+=j;
}
}
else if(x<0&&y<0){
int q=abs(y);
// cout<<"q:"<<q<<endl;
int w=abs(x);
// cout<<"w:"<<w<<endl;
if(x==y){
cnt=0;
}
else if(x>y){
cnt+=q-w+1+1;
}
else{
cnt+=x-y;
}
}
cout<<abs(cnt);
// fclose(stdin);
// fclose(stdout);
return 0;
}
AC代码:老师的代码好短……
老师是分成三大类同号,异号,有一个0;再分成若干小类
(但是正解和我的代码差不多)
#include<bits/stdc++.h>
using namespace std;
int main(){
long long x,y,ans=0;
cin>>x>>y;
if(x*y<0){
ans=abs(abs(x)-abs(y))+1;
}
else if(x*y>0){
if(x>y){
ans=x-y+2;
}
else if(x<y){
ans=y-x;
}
}
else{
ans=abs(x-y);
if(x<y){
ans=ans+1;
}
}
cout<<ans<<endl;
return 0;
}
第三题AC
题目:
我的思路:这个题目是个大模拟,无限判断就行,我试过了,1和2要单独判断
其他的先sort排序再判断如果相邻两个数(同一条线上的)相等,cnt++,如果不相等cnt=1
注意:cnt一定要赋值1!!!!!!!!!!!
让cnt和m比较,选最优的放sum里
这是我的代码:中间是我查错的过程
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,sum;
int a[1000005];
int cnt;
int main(){
// freopen("destroy.in","r",stdin);
// freopen("destroy.out","w",stdout);
int k;
cin>>k;
while(k--){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);//排序
// for(int i=1;i<=n;i++){
// cout<<a[i]<<" ";
// }
// cout<<endl;
sum=0,cnt=1;
for(int i=1;i<=n;i++){
if(n==2){//2的情况
if(2>=m){
sum+=m;
}
else{
sum+=2;
}
break;
}
if(n==1){//1的情况
sum+=1;
break;
}
if(a[i]==a[i+1]){//其他情况
cnt++;
}
else{
if(cnt>=m){
sum+=m;
}
else{
sum+=cnt;
}
cnt=1;
}
// cout<<"cnt:"<<cnt<<endl;
}
cout<<sum<<endl;
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
正解是用桶标记 :
#include<bits/stdc++.h>
using namespace std;
const int N=5e6+5;
int cnt[N],t;
int main(){
cin>>t;
while(t--){
int n,c,x,ans=0;
memset(cnt,0,sizeof cnt);
cin>>n>>c;
for(int i=1;i<=n;i++){
cin>>x;
cnt[x]++;//桶标记
}
for(int i=1;i<=N;i++){
ans+=min(c,cnt[i]);//找最优解
}
cout<<ans<<endl;//输出
}
return 0;
}
第四题我0分
题目:
我写的时候没看出来他用什么东西写。用4个for循环,只能说乱写的,我想看看能不能骗分
但是……………………………………………………
这是我丑陋的代码(不要截图)(不要嘲讽)
//毫无逻辑可言
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
long long n,m,a[10000006],flag[10000006];
int main(){
// freopen("zoo.in","r",stdin);
// freopen("zoo.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n-m;i++){
for(int j=i;j<=i+m;j++){
for(int z=1;z<=m;z++){
if(a[j]==z){
flag[z]=1;
}
}
}
for(int k=1;k<=m;k++){
if(flag[k]==1){
cout<<10*m;
return 0;
}
else{
flag[k]=0;
}
}
}
// fclose(stdin);
// fclose(stdout);
return 0;
}
这是AC代码:
思路:用D2的双指针的思路(我D3没想起来,太丢人了)把L,R都放在一端,先把m个不同的动物框起来,在调整找一个min最后别忘了乘10!!!!!!!
上代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,m,a[1000005],vis[1000005];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int l=1,r=0,cnt=0,ans=0x3f3f3f3f;
while(r<n){
while(cnt<m&&r<n){
r++;
vis[a[r]]++;
if(vis[a[r]]==1) cnt++;
}
while(cnt==m){
ans=min(ans,r-l+1);
vis[a[l]]--;
if(vis[a[l]]==0) cnt--;
l++;
}
}
cout<<ans*10;
return 0;
}
总结
总体来说还可以,但是很多知识点都忘了,所以要多复习呀!!!!!
---------S11037杨镇豪