错误分析
T1 旅游 / travel 90分
代码实现过程中没有仔细看题,导致把动车原本的ABCDF座,写成了ABCDE座 正解:
#include
using namespace std;
string c1,s1,c2,s2;
bool check1(){if(((s1[2]>='A'&&s1[2]<='C')&&(s2[2] >='A'&&s2[2]<='C'))||((s1[2]>='D'&&s1[2]<='F')&&(s2[2]>='D'&&s2[2]<='F'))){return true;}else return false;
}
int main(){cin >> c1 >> s1 >> c2 >> s2;if(c1==c2){cout << "1";if(s1[0]==s2[0]&&s1[1]==s2[1]){cout << "1";if(check1()){cout << "1";if((s1[2]>='A'&&s1[2]<='C'&&abs(s1[2]-s2[2])==1)||((s1[2]=='D'&&s2[2]=='F')||(s1[2]=='F'&&s2[2]=='D'))) cout << "1";else cout << "0";}else cout << "00";}else cout << "000";}else cout << "0000";return 0;
}
T2 回文串 / string 48分
考场开始想的是区间覆盖问题,测完小数据后全对,就去做T3,T4了,后检查时发现T2大数据出错,然后造了个hack电脑死机了40分钟,最后只交了了一题暴力 正解如下:
#include
#define int long long
using namespace std;
const int N=2e5+10;
int a[N],ans;
char c[N];
int n;
signed main(){cin >> n;for(int i=1;i<=n;i++) cin >> a[i] >> c[i];int l=1,r=n;while(l
T3按位与 / and 90分
稳定特判加正解拿分,正解对了一个特判写错了,导致减了10分 正解:
#include
#define int long long
using namespace std;
const int N=2e5+10;
int n,k,a[N];
bool st[N];
signed main(){cin >> n >> k;k=n-k;int res=0;for(int i=1;i<=n;i++){cin >> a[i];res|=a[i];}int ans=0;for(int p=31;p>=0;p--){if(!(res>>p&1)) continue;int t=0;for(int i=1;i<=n;i++){if(st[i]) continue;if(!(a[i]>>p&1)) t++;}if(t>k) continue;for(int i=1;i<=n;i++){if(!(a[i]>>p&1)) st[i]=true;}k-=t;ans|=1<
T4 纸牌游戏 / card 48分
没想到特殊性质,写了个暴力草草拿了48分 正解发现一个数i只要他是最后一个i,那么他后面的j第二个数字,按性质推导得到解
#include
using namespace std;
const int N=5e5+10;
int n,m;
int a[N],p[N],ans[N];
int main(){cin >> n >> m;for(int i=1;i<=n;i++){cin >> a[i];p[a[i]]=i;//记录出现位置}for(int i=1;i<=n;i++){ans[a[i]]++;if(p[a[i-1]]==i-1) ans[a[i]]+=ans[a[i-1]];//如果某个数字 j 的前一个数字 i 是最后一个 i那么ans[j]=ans[i]+ans[j]因为不管如何,只要前一个数字是 i,后面一个一定是 j}for(int i=1;i<=m;i++) cout << ans[i] << ' ';return 0;
}