A. Likes
思路
最大就是把正数都放前面
最小就是如果能减少就减少
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#define fir(i,a,b) for(int i=a;i<b;i++)
#define dug cout<<"ceshi"<<endl;
typedef long long LL;
#define met(x,y) memset(x,y,sizeof x)
//#define read(x) scanf("%d",&x)
using namespace std;
const int N = 110;
int a[N];
typedef pair<int,int> PII;
inline int read()
{
char c = getchar();int x = 0,s = 1;
while(c < '0' || c > '9') {if(c == '-') s = -1;c = getchar();}//是符号
while(c >= '0' && c <= '9') {x = x*10 + c -'0';c = getchar();}//是数字
return x*s;
}
int main()
{
//freopen("test.txt", "r", stdin);
int t=read();
while(t--)
{
int n=read(),l=0,r=0;
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=n;i++)if(a[i]>0)l++;else r++;
for(int i=1;i<=l;i++)cout<<i<<" ";
for(int i=1;i<=r;i++)cout<<l-i<<" ";
puts("");
int sum=0;
for(int i=1;i<=n;i++)
{
if(r==0||sum==0)
{
sum++;
l--;
}
else sum--,r--;
cout<<sum<<" ";
}
puts("");
}
//freopen("CON", "r", stdin);
//system("pause");
return 0;
}
B. Settlement of Guinea Pigs
思路
如果有3只,可以确定一定有两只一样性别的住一起,如果是4只,可以确定一定两只一样性别的住一起,5只的话可以类推。
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#define fir(i,a,b) for(int i=a;i<b;i++)
#define dug cout<<"ceshi"<<endl;
typedef long long LL;
#define met(x,y) memset(x,y,sizeof x)
//#define read(x) scanf("%d",&x)
using namespace std;
const int N = 110;
int a[N];
typedef pair<int,int> PII;
inline int read()
{
char c = getchar();int x = 0,s = 1;
while(c < '0' || c > '9') {if(c == '-') s = -1;c = getchar();}//是符号
while(c >= '0' && c <= '9') {x = x*10 + c -'0';c = getchar();}//是数字
return x*s;
}
int main()
{
//freopen("test.txt", "r", stdin);
int t=read();
while(t--)
{
int n=read(),l=0,r=0;
int sum=0,si=0,zhu=0;
for(int i=1;i<=n;i++)
{
int tem=read();
if(tem==1)
{
si++;
sum=max(sum,zhu+si);
}
else
{
zhu+=(si-1)/2;
if(si==0)continue;
if(si&1)si=1;
else si=2;
}
//cout<<si<<endl;
}
cout<<sum<<endl;
}
//freopen("CON", "r", stdin);
//system("pause");
return 0;
}
C. The Very Beautiful Blanket
坑点
一般来说看案例可以得到提示,所以看案例,应该是后缀是 0,1,2,3,然后就嘎嘎难受,可能能搞出来,但我不会。。
思路
g[i][j] 的数字直接根据i和j进行构造 设h(i)为i的二进制排列 g[i][j]=h(i)0000h(j)
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#define fir(i,a,b) for(int i=a;i<b;i++)
#define dug cout<<"ceshi"<<endl;
typedef long long LL;
#define met(x,y) memset(x,y,sizeof x)
//#define read(x) scanf("%d",&x)
using namespace std;
const int N = 210;
int a[N];
typedef pair<int,int> PII;
inline int read()
{
char c = getchar();int x = 0,s = 1;
while(c < '0' || c > '9') {if(c == '-') s = -1;c = getchar();}//是符号
while(c >= '0' && c <= '9') {x = x*10 + c -'0';c = getchar();}//是数字
return x*s;
}
string h(int x)
{
string tem;
while(x)
{
if(x&1)tem+='1';
else tem+='0';
x>>=1;
}
reverse(tem.begin(),tem.end());
return tem;
}
LL g[N][N];
int main()
{
//freopen("test.txt", "r", stdin);
int t=read();
while(t--)
{
int tem=1<<15;
int n=read(),m=read();
for(LL i=1;i<=n;i++)
{
for(LL j=1;j<=m;j++)g[i][j]=i*tem+j;
}
cout<<n*m<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)cout<<g[i][j]<<" ";
puts("");
}
}
//freopen("CON", "r", stdin);
//system("pause");
//if(12001^12000^16003^16002==0)cout<<"kkk";
return 0;
}
D. Buying gifts
思路
将数据读成pair,再排序
从大到小进行遍历
显然在a中选取为i时,对应的bi就没有,一定要选择,设其中最大值为bai
可以随意选择,但最后的最大值一定要和bai比较
代码
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
#include <cmath>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 5e5+10;
PII wa[N];
map<int,int> cf;
int n;
inline int read()
{
char c = getchar();int x = 0,s = 1;
while(c < '0' || c > '9') {if(c == '-') s = -1;c = getchar();}//是符号
while(c >= '0' && c <= '9') {x = x*10 + c -'0';c = getchar();}//是数字
return x*s;
}
int h()
{
sort(wa+1,wa+1+n);
int bai=-0x3f3f3f3f;
int sum=0x3f3f3f3f;
cf[-0x3f3f3f3f]++,cf[0x3f3f3f3f]++;
for(int i=1;i<=n;i++)cf[wa[i].y]++;
for(int i=n;i>0;i--)
{
cf[wa[i].y]--;
if(cf[wa[i].y]==0)cf.erase(wa[i].y);
auto a=cf.lower_bound(wa[i].x);
auto b=a--;;
int tem=abs(wa[i].x-bai);
//cout<<a->first<<" "<<b->first<<endl;
if(a->first>=bai)tem=min(tem,wa[i].x-a->first);
if(b->first>=bai)tem=min(tem,b->first-wa[i].x);
sum=min(sum,tem);
bai=max(bai,wa[i].y);
}
return sum;
}
int main()
{
int t=read();
while(t--)
{
n=read();
for(int i=1;i<=n;i++)wa[i].x=read(),wa[i].y=read();
cout<<h()<<endl;
}
}