A 题意
二进制数串就是只有01的十进制,给一个十进制,拆成最少数量的二进制数串和
A 思路
水题,各数位最大值
A 代码
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<unordered_map>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<chrono>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
//#define int long long
//#define double long double
using namespace std;
typedef long long ll;
const int maxn=400505;
const int inf=0x3f3f3f3f;
int n,m,k;
void YES(){
cout<<"YES"<<endl;
}
void NO(){
cout<<"NO"<<endl;
}
void solve(){
string s;
cin>>s;
int ans=0;
for(auto i:s){
ans=max(ans,i-'0');
}
cout<<ans<<endl;
}
signed main(){
IOS
#ifndef ONLINE_JUDGE
freopen("IO\\in.txt","r",stdin);
freopen("IO\\out.txt","w",stdout);
#endif
int tn=1;
cin>>tn;
while(tn--){
solve();
}
}
B 题意
nm方格,只有外边一圈可以是1,1的周围八个格子不能是1,最大化1数量,输出方案。
B 思路
分类讨论下就行,简单构造
B 代码
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<unordered_map>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<chrono>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
//#define int long long
//#define double long double
using namespace std;
typedef long long ll;
const int maxn=45;
const int inf=0x3f3f3f3f;
int n,m,k;
int mp[maxn][maxn];
void YES(){
cout<<"YES"<<endl;
}
void NO(){
cout<<"NO"<<endl;
}
void solve(){
memset(mp,0,sizeof mp);
cin>>n>>m;
if(n%2&&m%2){
for(int i=1;i<=m;i+=2)
mp[1][i]=mp[n][i]=1;
for(int i=3;i<n;i+=2)
mp[i][1]=mp[i][m]=1;
}
else if(m%2){
for(int i=1;i<=m;i+=2)
mp[1][i]=mp[n][i]=1;
for(int i=3;i<n-1;i+=2)
mp[i][1]=mp[i][m]=1;
}
else if(n%2){
for(int i=1;i<=m;i+=2){
mp[1][i]=mp[n][i]=1;
}
for(int i=3;i<n;i+=2)
mp[i][1]=mp[i][m]=1;
}
else{
for(int i=1;i<=m;i+=2)
mp[1][i]=mp[n][i]=1;
for(int i=3;i<n-1;i+=2)
mp[i][1]=mp[i][m]=1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) cout<<mp[i][j];
cout<<endl;
}
cout<<endl;
}
signed main(){
IOS
#ifndef ONLINE_JUDGE
freopen("IO\\in.txt","r",stdin);
freopen("IO\\out.txt","w",stdout);
#endif
int tn=1;
cin>>tn;
while(tn--){
solve();
}
}
C 题意
假设比了k场,会取最高k-k/4下取整的最高分和为总分,给出你的成绩和对手成绩,问最少再比多少轮你的分有希望比他高。
C 思路
贪心的想,肯定要自己加100,对手加0.我们把我们的分数递增排序,对手递减排序,维护两个指针。算出初始的分数。每次递增轮次k,我们的队尾插100,对手插0.如果发现k递增后k-k/4增加了,就把我们的分数更新成原来的分数+100-指针1指向的分,对手的分数变为原来的+指针2的分,指针12后移。如果k-k/4没有变化,我们的分数还是要更新成原来的分数+100-指针1指向的分,更新指针1,对手的不用管。稍微想一下就明白这个k不会递增很多次。
C 代码
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<unordered_map>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<chrono>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
//#define int long long
//#define double long double
using namespace std;
typedef long long ll;
const int maxn=400505;
const int inf=0x3f3f3f3f;
int n,m,k;
vector<int>v1,v2;
void YES(){
cout<<"YES"<<endl;
}
void NO(){
cout<<"NO"<<endl;
}
bool cmp(int a,int b){
return a>b;
}
void solve(){
cin>>n;
v1.clear(),v2.clear();
for(int i=1;i<=n;i++){
int t;
cin>>t;
v1.push_back(t);
}
for(int i=1;i<=n;i++){
int t;
cin>>t;
v2.push_back(t);
}
sort(v1.begin(),v1.end());
sort(v2.begin(),v2.end(),cmp);
m=n-n/4;
int ans=0;
int c1=0,c2=0;
int p1=n-m,p2=m;
for(int i=n-m;i<n;i++){
c1+=v1[i];
}
for(int i=0;i<m;i++){
c2+=v2[i];
}
while(c1<c2){
ans++;
n++;
v1.push_back(100);
v2.push_back(0);
if(n-n/4!=m){
m++;
c1+=100;
c2+=v2[p2];
p2++;
}
else{
c1+=100;
c1-=v1[p1];
p1++;
}
}
cout<<ans<<endl;
}
signed main(){
IOS
#ifndef ONLINE_JUDGE
freopen("IO\\in.txt","r",stdin);
freopen("IO\\out.txt","w",stdout);
#endif
int tn=1;
cin>>tn;
while(tn--){
solve();
}
}
D 题意
每个人有一个想送礼物的人,合理分配送礼物的方案,使得
- 每个人都收到,每个人都送
- 每个人都不送给自己
D 思路
转化成图论问题,人向他想送礼的人连边,我们先跑个拓扑删去环路,环上各点答案就是原来答案。之后我们重新建图,之前环路删去,且一个点最多只有一条入边,多的话直接忽略点剩下的。最后新图是一堆链或者点。跑一下连通块,记录每个块的起点和终点。之后每个块的终点答案设置为下一个块的起点就好了。注意特判只有一个块且是孤立点的情况,这种情况要暴力断一个环。
D 代码
#include<cstdio>
#include<iostream>
#include<iomanip>
#include<map>
#include<unordered_map>
#include<string>
#include<queue>
#include<stack>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<chrono>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define endl "\n"
//#define int long long
//#define double long double
using namespace std;
typedef long long ll;
const int maxn=200005;
const int inf=0x3f3f3f3f;
int n,m,k,q;
vector<int>e[maxn],e2[maxn];
bool ansed[maxn];
int ans[maxn];
int a[maxn];
int in[maxn],out[maxn];
int cnt;
int bein[maxn],ed[maxn];
void init(){
for(int i=0;i<=n;i++){
e[i].clear(),e2[i].clear();
in[i]=0,out[i]=0;
ansed[i]=0;cnt=0;
}
}
void dfs(int x){
int son=0;
for(auto y:e2[x]){
dfs(y);
son++;
}
if(!son)
ed[cnt]=x;
}
void solve(){
cin>>n;
init();
for(int i=1;i<=n;i++){
cin>>ans[i];
a[i]=ans[i];
e[i].push_back(ans[i]);
in[ans[i]]++;
}
queue<int>q;
for(int i=1;i<=n;i++){
if(!in[i]) q.push(i);
}
while(q.size()){
int x=q.front();q.pop();
for(auto y:e[x]){
in[y]--;
if(!in[y])
q.push(y);
}
}
for(int i=1;i<=n;i++)
if(in[i])
ansed[i]=1;
int as=n;
for(int i=1;i<=n;i++) in[i]=out[i]=0;
for(int i=1;i<=n;i++){
if(ansed[i]) continue;
if(!ansed[a[i]]&&!in[a[i]]){
e2[i].push_back(a[i]);
in[a[i]]=1;
out[i]=1;
//ansed[i]=1;
}
}
for(int i=1;i<=n;i++){
if(!ansed[i]&&!in[i]){
cnt++;
bein[cnt]=i;
dfs(i);
}
}
if(cnt==1){
as-=1;
ans[ed[1]]=a[ed[1]];
for(int i=1;i<=n;i++){
if(ansed[i]){
if(ans[i]==a[ed[1]]){
ans[i]=bein[1];
break;
}
}
}
}
else{
for(int i=1;i<=cnt;i++){
int j=i+1;
if(i==cnt) j=1;
ans[ed[i]]=bein[j];
as--;
}
}
cout<<as<<endl;
for(int i=1;i<=n;i++) cout<<ans[i]<<' ';
cout<<endl;
}
signed main(){
IOS
#ifndef ONLINE_JUDGE
freopen("IO\\in.txt","r",stdin);
freopen("IO\\out.txt","w",stdout);
#endif
int tn=1;
cin>>tn;
while(tn--){
solve();
}
}