A
变化最小的字符,只有a b,a-b可互换,问换最小的位置使得偶数前缀里a-b数量同。
判断每一个偶数位置上及其前面一个位置上即可。
#include <algorithm>������ //STLͨ���㷨
#include <bitset>����������//STL�����
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>�������� //������
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>���������� //STL˫�˶�������
#include <exception>������ //�쳣������
#include <fstream>
#include <functional>������//STL�������㺯���������������
#include <limits>
#include <list>������������//STL���������
#include <map>������������ //STL ӳ������
#include <iomanip>
#include <ios>������������//�������룯���֧��
#include<iosfwd>����������//���룯���ϵͳʹ�õ�ǰ������
#include <iostream>
#include <istream>�������� //����������
#include <ostream>�������� //���������
#include <queue>���������� //STL��������
#include <set>������������ //STL ��������
#include <sstream>��������//�����ַ�������
#include <stack>���������� //STL��ջ������������
#include <stdexcept>������ //���쳣��
#include <streambuf>������//�ײ����룯���֧��
#include <string>����������//�ַ�����
#include <utility>�������� //STLͨ��ģ����
#include <vector>����������//STL��̬��������
#include <cwchar>
#include <cwctype>
#define ll long long
using namespace std;
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
#define dep(i,a,b) for(register int i=(a);i>=(b);i--)
//priority_queue<int,vector<int>,less<int> >q;
int dx[]= {-1,1,0,0,-1,-1,1,1};
int dy[]= {0,0,-1,1,-1,1,1,-1};
const int maxn = 200000+6;
const ll mod=1e9+7;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
const int INF=99999999;
char ch[maxn];
char ch1[maxn];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
scanf("%s",ch+1);
int ans=0;
rep(i,1,n)
{
if(i%2==0)
{
if(ch[i]==ch[i-1])
{
ans++;
if(ch[i-1]=='a')
{
ch1[i-1]='a';
ch1[i]='b';
}
else
{
ch1[i-1]='b';
ch1[i]='a';
}
}else
{
ch1[i]=ch[i];
ch1[i-1]=ch[i-1];
}
}
}
printf("%d\n",ans);
rep(i,1,n)
{
printf("%c",ch1[i]);
}
printf("\n");
}
}
B
给出一组数,求ai*x+1的最小值,x是选ai之前已经选择的个数。
从大到小排序即可。
#include <algorithm>������ //STLͨ���㷨
#include <bitset>����������//STL�����
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>�������� //������
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>���������� //STL˫�˶�������
#include <exception>������ //�쳣������
#include <fstream>
#include <functional>������//STL�������㺯���������������
#include <limits>
#include <list>������������//STL���������
#include <map>������������ //STL ӳ������
#include <iomanip>
#include <ios>������������//�������룯���֧��
#include<iosfwd>����������//���룯���ϵͳʹ�õ�ǰ������
#include <iostream>
#include <istream>�������� //����������
#include <ostream>�������� //���������
#include <queue>���������� //STL��������
#include <set>������������ //STL ��������
#include <sstream>��������//�����ַ�������
#include <stack>���������� //STL��ջ������������
#include <stdexcept>������ //���쳣��
#include <streambuf>������//�ײ����룯���֧��
#include <string>����������//�ַ�����
#include <utility>�������� //STLͨ��ģ����
#include <vector>����������//STL��̬��������
#include <cwchar>
#include <cwctype>
#define ll long long
using namespace std;
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
#define dep(i,a,b) for(register int i=(a);i>=(b);i--)
//priority_queue<int,vector<int>,less<int> >q;
int dx[]= {-1,1,0,0,-1,-1,1,1};
int dy[]= {0,0,-1,1,-1,1,1,-1};
const int maxn = 2500+6;
const ll mod=1e9+7;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
const int INF=99999999;
struct node
{
int v;
int id;
}a[maxn];
bool cmp(node a,node b)
{
return a.v>b.v;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
rep(i,1,n)
{
scanf("%d",&a[i].v);
a[i].id=i;
}
sort(a+1,a+1+n,cmp);
ll ans=0;
ll s=0;
rep(i,1,n)
{
ans+=s*a[i].v+1;
s+=1;
//printf("%d%c",a[i].id,i==n?'\n':' ');
}
printf("%lld\n",ans);
rep(i,1,n)
{
printf("%d%c",a[i].id,i==n?'\n':' ');
}
}
return 0;
}
C
给出一个白色长方形,两个黑色的,他们的左下、右上顶点坐标,问黑的覆盖了白色的没有。
对于白色,对于每一个xi x1<=xi<=x2,判断横纵坐标是否在黑色的之间,再判断y坐标。
完全覆盖输出NO
#include <algorithm>������ //STLͨ���㷨
#include <bitset>����������//STL�����
#include <cmath>
#include <cstdio>
#include <cstring>
#include <deque>���������� //STL˫�˶�������
#include <exception>������ //�쳣������
#include <fstream>
#include <functional>������//STL�������㺯���������������
#include <limits>
#include <list>������������//STL���������
#include <map>������������ //STL ӳ������
#include <iomanip>
#include <ios>������������//�������룯���֧��
#include<iosfwd>����������//���룯���ϵͳʹ�õ�ǰ������
#include <iostream>
#include <istream>�������� //����������
#include <ostream>�������� //���������
#include <queue>���������� //STL��������
#include <set>������������ //STL ��������
#include <sstream>��������//�����ַ�������
#include <stack>���������� //STL��ջ������������
#include <string>����������//�ַ�����
#include <vector>����������//STL��̬��������
#define ll long long
using namespace std;
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
#define dep(i,a,b) for(register int i=(a);i>=(b);i--)
//priority_queue<int,vector<int>,less<int> >q;
int dx[]= {-1,1,0,0,-1,-1,1,1};
int dy[]= {0,0,-1,1,-1,1,1,-1};
const int maxn = 1000000+66;
const int maxm=100000+66;
const ll mod=1e9+7;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
const int INF=99999999;
double x1,x2,x3,x4,x5,x6;
double y1,y2,y3,y4,y5,y6;
bool ok1(double x,double y)
{
return (x>=x3&&x<=x4&&y>=y3&&y<=y4);
}
bool ok2(double x,double y)
{
return (x>=x5&&x<=x6&&y>=y5&&y<=y6);
}
int main()
{
while(scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2)!=EOF)
{
scanf("%lf %lf %lf %lf",&x3,&y3,&x4,&y4);
scanf("%lf %lf %lf %lf",&x5,&y5,&x6,&y6);
bool flag=0;
for(double i=x1; i<=x2; i+=0.5)
{
//(ok1(i,y1)||ok1(i,y2))&&(ok2(i,y1)||ok2(i,y2))
if(!((ok1(i,y1)||ok2(i,y1))&&(ok1(i,y2)||ok2(i,y2))))
{
flag=1;
break;
}
}
for(double i=y1; i<=y2; i+=0.5)
{
if(!((ok1(x1,i)||ok2(x1,i))&&(ok1(x2,i)||ok2(x2,i))))//没有被完全覆盖
{
flag=1;
break;
}
}
if(!flag)
printf("NO\n");
else
printf("YES\n");
}
}
D
给出一个n,以及一组数,代表剩余的量。原来他们的量都为x,现在可能有y人,每个人都会拿走z,可能拿ai,也可能拿aj,z<=x,求最小的y以及z,满足题意。
先求出最大值ax,求ax-ai的差值公约数。
#include <algorithm>������ //STLͨ���㷨
#include <bitset>����������//STL�����
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>�������� //������
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>���������� //STL˫�˶�������
#include <exception>������ //�쳣������
#include <fstream>
#include <functional>������//STL�������㺯���������������
#include <limits>
#include <list>������������//STL���������
#include <map>������������ //STL ӳ������
#include <iomanip>
#include <ios>������������//�������룯���֧��
#include<iosfwd>����������//���룯���ϵͳʹ�õ�ǰ������
#include <iostream>
#include <istream>�������� //����������
#include <ostream>�������� //���������
#include <queue>���������� //STL��������
#include <set>������������ //STL ��������
#include <sstream>��������//�����ַ�������
#include <stack>���������� //STL��ջ������������
#include <stdexcept>������ //���쳣��
#include <streambuf>������//�ײ����룯���֧��
#include <string>����������//�ַ�����
#include <utility>�������� //STLͨ��ģ����
#include <vector>����������//STL��̬��������
#include <cwchar>
#include <cwctype>
#define ll long long
using namespace std;
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
#define dep(i,a,b) for(register int i=(a);i>=(b);i--)
//priority_queue<int,vector<int>,less<int> >q;
int dx[]= {-1,1,0,0,-1,-1,1,1};
int dy[]= {0,0,-1,1,-1,1,1,-1};
const int maxn = 200500+6;
const ll mod=1e9+7;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
const int INF=99999999;
int a[maxn];
ll Gcd(ll x,ll y)
{
return y==0?x:Gcd(y,x%y);
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int maxx=-1;
rep(i,1,n)
{
scanf("%d",&a[i]);
maxx=max(maxx,a[i]);
}
ll ans=0;//�ҷ�0�������Լ��
int cnt=0;
ll gcd=1;
int flag=0;
rep(i,1,n)
{
ans+=maxx-a[i];
if(maxx-a[i]!=0&&!flag)
{
flag=1;
gcd=maxx-a[i];
//gcd=Gcd(gcd,a[i]);
}
else if(maxx-a[i]!=0)
{
gcd=Gcd(gcd,maxx-a[i]);
}
}
printf("%lld %lld\n",ans/gcd,gcd);
}
return 0;
}
F
给出一些点,每个点需要联网的费用为ai,有些点是路由器,路由器覆盖的范围已经给出,求所有点联网的最小费用。
dp
fi记录的是距离i点 最近的 右边的那个点的标号。
dpi记录的是1-i所用的最小费用。
如果v<=min(n,i+k),那么
max(1,v-i)代表v点作用不到的位置,再加上v,就能作用到i-i啦。
#include <algorithm>������ //STLͨ���㷨
#include <bitset>����������//STL�����
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>�������� //������
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>���������� //STL˫�˶�������
#include <exception>������ //�쳣������
#include <fstream>
#include <functional>������//STL�������㺯���������������
#include <limits>
#include <list>������������//STL���������
#include <map>������������ //STL ӳ������
#include <iomanip>
#include <ios>������������//�������룯���֧��
#include<iosfwd>����������//���룯���ϵͳʹ�õ�ǰ������
#include <iostream>
#include <istream>�������� //����������
#include <ostream>�������� //���������
#include <queue>���������� //STL��������
#include <set>������������ //STL ��������
#include <sstream>��������//�����ַ�������
#include <stack>���������� //STL��ջ������������
#include <stdexcept>������ //���쳣��
#include <streambuf>������//�ײ����룯���֧��
#include <string>����������//�ַ�����
#include <utility>�������� //STLͨ��ģ����
#include <vector>����������//STL��̬��������
#include <cwchar>
#include <cwctype>
#define ll long long
using namespace std;
#define rep(i,a,b) for(register int i=(a);i<=(b);i++)
#define dep(i,a,b) for(register int i=(a);i>=(b);i--)
//priority_queue<int,vector<int>,less<int> >q;
int dx[]= {-1,1,0,0,-1,-1,1,1};
int dy[]= {0,0,-1,1,-1,1,1,-1};
const int maxn = 200500+6;
const ll mod=1e9+7;
const ll inf=0x3f3f3f3f3f3f3f3fLL;
const int INF=99999999;
int a[maxn];
char ch[maxn];
int f[maxn];
ll dp[maxn];
int main()
{
int n, k;
while(scanf("%d %d",&n,&k)!=EOF)
{
rep(i,1,n)dp[i]=0;
scanf("%s",ch+1);
f[n+1]=3*n+k;
dep(i,n,1)
{
f[i]=ch[i]=='1'?i:f[i+1];
}
rep(i,1,n)
{
dp[i]=dp[i-1]+i;
int v=f[max(1,i-k)];
if(v<=min(n,i+k))
{
dp[i]=min(dp[i],dp[max(1,v-k)-1]+v);
}
}
printf("%lld\n",dp[n]);
}
}