Codeforces Round 857 (Div. 2)(A~D)

319 阅读1分钟

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,再排序
从大到小进行遍历

image.png 显然在a中选取为i时,对应的bi就没有,bi+1...bn b_{i+1}...b_{n}一定要选择,设其中最大值为bai
b1...bi1 b_{1}...b_{i-1}可以随意选择,但最后的最大值一定要和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;
    }

}