本来抱着升rating的心情打一场div3,结果div3好像意料之外地难了一点..
热身题。将a,b,c升序排序一下,分类讨论一下即可
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
int T;
ll a[4];
inline int read();
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
T=read();
while(T--){
for(int i=1;i<=3;++i) scanf("%I64d\n",&a[i]);
sort(a+1,a+4);
if(a[3]<=a[2]-a[1]) printf("%I64d\n",a[1]+a[3]);
else{
a[3]-=(a[2]-a[1]); a[1]=a[2];
printf("%I64d\n",a[1]+(a[3]>>1));
}
}
return 0;
}
inline int read(){
char tmp=getchar(); int sum=0; bool flag=false;
while(tmp<‘0‘||tmp>‘9‘){
if(tmp==‘-‘) flag=true;
tmp=getchar();
}
while(tmp>=‘0‘&&tmp<=‘9‘){
sum=(sum<<1)+(sum<<3)+tmp-‘0‘;
tmp=getchar();
}
return flag?-sum:sum;
}
数列中的偶数没有什么太大的贡献。统计一下奇数的个数,比较一下即ok
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAX=3e5+5;
int T,n,k,line[MAX],cnt,rec[MAX];
inline int read();
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
T=read();
while(T--){
n=read(); k=read();
cnt=0;
for(int i=1;i<=n;++i) line[i]=read();
for(int i=1;i<=n;++i) if(line[i]%2==1) cnt++;
if(k>cnt) {printf("NO\n"); continue;}
if((k%2)!=(cnt%2)) {printf("NO\n"); continue;}
printf("YES\n");
rec[0]=0;
for(int i=1;i<=n;++i) if(line[i]%2==1) rec[++rec[0]]=i;
for(int i=1;i<k;++i) printf("%d ",rec[i]);
printf("%d\n",n);
}
return 0;
}
inline int read(){
char tmp=getchar(); int sum=0; bool flag=false;
while(tmp<‘0‘||tmp>‘9‘){
if(tmp==‘-‘) flag=true;
tmp=getchar();
}
while(tmp>=‘0‘&&tmp<=‘9‘){
sum=(sum<<1)+(sum<<3)+tmp-‘0‘;
tmp=getchar();
}
return flag?-sum:sum;
}
起初认为能同时处理横纵坐标,但写了100行+之后还没有丝毫要写完的迹象之后感觉有点不对劲.其实分别处理一下横纵坐标**,最后汇总即可。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAX=1e5+5,TOP=1e5;
int T,n;
int pos[MAX][2],mov[MAX][5],bor[5];
inline int read();
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
T=read();
while(T--){
n=read();
for(int i=1;i<=n;++i){
pos[i][0]=read(); pos[i][1]=read();
for(int j=1;j<=4;++j) mov[i][j]=read();
}
bor[1]=TOP; bor[2]=-TOP; bor[3]=-TOP; bor[4]=TOP;
bool flag=false;
int l,r; r=1; l=3;
for(int i=1;i<=n;++i){
if(mov[i][l]&&mov[i][r]) continue;
if(mov[i][l]){
if(bor[r]<pos[i][0]) {flag=true; break;}
bor[l]=max(bor[l],pos[i][0]);
}
if(mov[i][r]){
if(bor[l]>pos[i][0]) {flag=true; break;}
bor[r]=min(bor[r],pos[i][0]);
}
if(!mov[i][l]&&!mov[i][r]){
if(bor[l]>pos[i][0]||bor[r]<pos[i][0]) {flag=true; break;}
bor[l]=bor[r]=pos[i][0];
}
}
if(flag) {printf("0\n"); continue;}
l=2; r=4;
for(int i=1;i<=n;++i){
if(mov[i][l]&&mov[i][r]) continue;
if(mov[i][l]){
if(bor[r]<pos[i][1]) {flag=true; break;}
bor[l]=max(bor[l],pos[i][1]);
}
if(mov[i][r]){
if(bor[l]>pos[i][1]) {flag=true; break;}
bor[r]=min(bor[r],pos[i][1]);
}
if(!mov[i][l]&&!mov[i][r]){
if(bor[l]>pos[i][1]||bor[r]<pos[i][1]) {flag=true; break;}
bor[l]=bor[r]=pos[i][1];
}
}
if(flag) {printf("0\n"); continue;}
printf("%d %d %d\n",1,bor[3],bor[2]);
}
return 0;
}
inline int read(){
char tmp=getchar(); int sum=0; bool flag=false;
while(tmp<‘0‘||tmp>‘9‘){
if(tmp==‘-‘) flag=true;
tmp=getchar();
}
while(tmp>=‘0‘&&tmp<=‘9‘){
sum=(sum<<1)+(sum<<3)+tmp-‘0‘;
tmp=getchar();
}
return flag?-sum:sum;
}
bool judge(int a,int b,int c,int d,int x,int y){
if(x>=a&&x<=c&&y<=b&&y>=d) return true;
return false;
}
简单版,数据范围友善,暴力模拟就好
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int MAX=2e3+5;
int T,n,k,line[MAX];
inline int read();
inline int getc();
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
T=read();
while(T--){
n=read(); k=read(); int ans=k;
for(int i=1;i<=n;++i) line[i]=getc();
for(int i=1;i<=n-k+1;++i){
int cur;
for(int t=0;t<=2;++t){
cur=t; int tmp=0;
for(int j=0;j<=k-1;++j){
if(line[i+j]!=((cur+j)%3)) tmp++;
}
ans=min(ans,tmp);
}
}
printf("%d\n",ans);
}
return 0;
}
inline int read(){
char tmp=getchar(); int sum=0; bool flag=false;
while(tmp<‘0‘||tmp>‘9‘){
if(tmp==‘-‘) flag=true;
tmp=getchar();
}
while(tmp>=‘0‘&&tmp<=‘9‘){
sum=(sum<<1)+(sum<<3)+tmp-‘0‘;
tmp=getchar();
}
return flag?-sum:sum;
}
inline int getc(){
char tmp=getchar();
while(tmp!=‘R‘&&tmp!=‘B‘&&tmp!=‘G‘) tmp=getchar();
if(tmp==‘R‘) return 1;
if(tmp==‘G‘) return 2;
if(tmp==‘B‘) return 0;
}
困难版,其实也没有难到哪里。由于是“RGB”的无限循环序列,答案必将于以不同的字母开头的循环序列重合,枚举一下就好。(再多10分钟,肯定能多做出来这道题(>人<;))
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAX=2e5+5;
int T,n,k,ans;
int col[MAX],line[MAX];
inline int read();
inline int getc();
int main(){
#ifndef ONLINE_JUDGE
freopen("test.in","r",stdin);
#endif
T=read();
while(T--){
n=read(); k=read();
ans=k;
for(int i=1;i<=n;++i) col[i]=getc();
int cur=0;
for(int i=1;i<=n;++i) line[i]=((col[i]==((0+i)%3))?1:0);
for(int i=1;i<k;++i) if(line[i]) cur++;
for(int i=k;i<=n;++i){
if(line[i]) cur++;
if(line[i-k]) cur--;
ans=min(k-cur,ans);
}
cur=0;
for(int i=1;i<=n;++i) line[i]=((col[i]==((1+i)%3))?1:0);
for(int i=1;i<k;++i) if(line[i]) cur++;
for(int i=k;i<=n;++i){
if(line[i]) cur++;
if(line[i-k]) cur--;
ans=min(k-cur,ans);
}
cur=0;
for(int i=1;i<=n;++i) line[i]=((col[i]==((2+i)%3))?1:0);
for(int i=1;i<k;++i) if(line[i]) cur++;
for(int i=k;i<=n;++i){
if(line[i]) cur++;
if(line[i-k]) cur--;
ans=min(k-cur,ans);
}
printf("%d\n",ans);
}
return 0;
}
inline int read(){
char tmp=getchar(); int sum=0; bool flag=false;
while(tmp<‘0‘||tmp>‘9‘){
if(tmp==‘-‘) flag=true;
tmp=getchar();
}
while(tmp>=‘0‘&&tmp<=‘9‘){
sum=(sum<<1)+(sum<<3)+tmp-‘0‘;
tmp=getchar();
}
return flag?-sum:sum;
}
inline int getc(){
char tmp=getchar();
while(tmp!=‘R‘&&tmp!=‘G‘&&tmp!=‘B‘) tmp=getchar();
if(tmp==‘R‘) return 1;
if(tmp==‘G‘) return 2;
if(tmp==‘B‘) return 0;
}
Codeforces Round #575 (Div. 3)
原文:https://www.cnblogs.com/ticmis/p/13210871.html