第一次打线下欢乐赛!机房的电脑还是很好用的,不卡。有点紧张,赛时只A了A题,B、C没码,D、E、F没看,22名,160分(……)
A:方块消消乐
具体题目指路 :NKOJ p5919
唯一一个A的题,感动,思路很简单,用string字符串做,是0就cnt++,是1就ans++,最后比较个数,ans = min(ans,cnt)*2;解决。直接判断个数就行,不要想复杂。
#include<bits/stdc++.h>
using namespace std;
string n;
int ans=0,cnt=0;
int main(){
cin>>n;
int a = n.length();
for(int i = 0;i <= a;i ++){
if(n[i] == '1') cnt ++;
if(n[i] == '0') ans ++;
}
ans = min(ans,cnt);
cout<<ans*2;//……想复杂了,可以直接判断个数!!
return 0;
}
B:相同的整数
具体题目指路 : NKOJ p8147
还是比较easy的,考试的时候只想到了特判,没有想到普遍情况,WA 40。
#include<bits/stdc++.h>
using namespace std;
int a,b,c;
int main(){
cin>>a>>b>>c;
int n = max(a,max(b,c));
int ax = 3*n-a-b-c;
if(ax%2 == 1) cout<<ax/2+2;
else cout<<ax/2;
return 0;
}
C 数列+1
具体题目指路 :NKOJ p5234
这个题和上面的有丝丝相似……
赛后看了旁边大佬的思路,用了递归判断,悟了……代码不算很长……
#include<bits/stdc++.h>
using namespace std;
int n;
int a[20005];
int ans = 0;
int cmp(int x[],int n){
if(x[n+1] == 0) return n+1;
else return cmp(x,n+1);
}
int main(){
cin>>n;
for(int i = 1;i <= n;i ++) {
int x;
cin>>x;
a[x+10000] ++;
}
for(int i = 0;i <= 20000;i ++){
if(a[i]>1){
for(int j = 1;;j ++){
int m = cmp(a,i);
ans += m-i;
a[m] ++;
a[i] --;
if(a[i] == 1) break;
}
}
}
cout<<ans;
return 0;
}
D:涂颜色
具体题目指路 :NKOJ p5236
!!这个的思路也是炒鸡简单,赛时想复杂了(其实是因为紧张没有看懂题意)
先sort,只需要判断最多的一堆与最少的差是否大于k,大于返回NO,小于等于返回YES
A掉它!!
#include<bits/stdc++.h>
using namespace std;
int n,k,t;
int main(){
cin>>t;
for(int i = 1;i <= t;i ++){
cin>>n>>k;
int a[108];
for(int h = 1;h <= n;h ++) cin>>a[h];
sort(a+1,a+n+1);
if(a[n]-a[1] <= k)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;//:)考试的时候根本没有看懂题目……
//现在想来就是有点紧张!!所以没有认真想解法
}
还有EF ,实在是我不擅长的部分……图论几何……(?)
等老师讲完我来复盘,讲过的题必须A掉!!
2023.5.21