Codeforces Round #401 (Div. 2)【A,B,C,D】
最近状态极差。。水题不想写,难题咬不动。。哎,CF的题那么简单,还搞崩了= =、真是巨菜无比。
题意:略。
思路:
构造出3!次变换,然后输出就好。
Code:
#include <bits/stdc++.h>
using namespace std;
int a[6][4]={{1,2,3},{2,1,3},{2,3,1},{3,2,1},{3,1,2},{1,3,2}};
int main()
{
int n,x;
scanf("%d",&n);
scanf("%d",&x);
n%=6;
int ans=a[n][x];
ans--;
printf("%d\n",ans);
return 0;
}
题意:
比较一下,小的数字的那个人要打一下。求第二串的最少,第一串的最多。
思路:(弱弱觉得有点意思)
两个数组,先排下序.
(1)我要少一些,我从大的去匹配对方,而且先与对方大的去匹配最优,如果不行,最小的来匹配。
(2)我要多一些,那么我小的尽可能去贴小的,同理不行的话,我拿最大的过去
Code:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
char s1[1010],s2[1010];
int s[1010];
int m[1010];
int n;
void solve1()
{
int k1=0,k2=0;
int t1=n-1,t2=n-1;
int ans1=0;
while(k1<=t1&&k2<=t2)
{
if(m[t2]>=s[t1])
{
t1--;
t2--;
}
else
{
t1--;
k2++;
ans1++;
}
}
printf("%d\n",ans1);
}
void solve2()
{
int k1=0,k2=0;
int t1=n-1,t2=n-1;
int ans2=0;
while(k1<=t1&&k2<=t2) //小的贴小的,不行的话我最大的贴小的。
{
if(s[k1]<m[k2])
{
k1++;
k2++;
ans2++;
}
else
{
t1--;
k2++;
}
}
printf("%d\n",ans2);
}
int main()
{
scanf("%d",&n);
scanf("%s%s",s1,s2);
for(int i=0;i<n;i++)
s[i]=s1[i]-'0';
for(int i=0;i<n;i++)
m[i]=s2[i]-'0';
sort(s,s+n);
sort(m,m+n);
solve1();
solve2();
return 0;
}
/*
4
1234
2345
*/Codeforces777C:
就是直接搞就好了,对于每列可以尺取,也可以拿个临时变量作为当前最远位置,这里是预处理出一个数组存每个位置的最远距离。
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e6+10;
vector<int>xs[100010];
int num[100010];
int n,m;
void solve()
{
for(int i=0;i<m;i++)
{
int tmp=-1;
int L;
for(int j=0;j<xs[i].size();j++)
{
int a=xs[i][j];
if(tmp==-1)
L=j+1;
else if(tmp>a)
{
num[L]=max(num[L],j);
L=j+1;
}
tmp=a;
}
num[L]=max(num[L],n);
}
int tmp=-1;
for(int i=1;i<=n;i++)
{
num[i]=max(num[i],tmp);
tmp=max(num[i],tmp);
}
}
int main()
{
int x,y;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
scanf("%d",&x);
xs[j].push_back(x);
}
solve();
int Q;
scanf("%d",&Q);
while(Q--)
{
scanf("%d%d",&x,&y);
if(num[x]>=y)
puts("Yes");
else
puts("No");
}
return 0;
}Codeforces777D:
大水题。。
Code:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
vector<char>xs[500010];
int n;
int len[500010];
char ss[500010];
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%s",ss);
int yy=strlen(ss);
for(int j=0;j<yy;j++)
xs[i].push_back(ss[j]);
}
int t1,t2;
len[n-1]=xs[n-1].size();
for(int i=n-2;i>=0;i--)
{
t1=0;t2=0;
bool flag=true;
if(len[i+1]==1)
{
len[i]=1;
continue;
}
while(t1<len[i+1]&&t2<xs[i].size())
{
if(xs[i+1][t1]==xs[i][t2])
{
t1++;
t2++;
}
else if(xs[i+1][t1]>xs[i][t2])
{
len[i]=xs[i].size();
flag=false;
break;
}
else
break;
}
if(flag)
len[i]=t2;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<len[i];j++)
cout<<xs[i][j];
puts("");
}
return 0;
}
/*
3
#sima
#simb
#sima
*/
浙公网安备 33010602011771号