https://codeforces.com/contest/1506/problem/A
有意思。
输入n,m,k,n为行,m为列,k为数
问你n行m列的数组,竖着分别为这样
问你改成横着放
这样之后,k对应的数现在是什么。
分离行列,行数为 k%n 如果为0,加上n 列数为 (k-1)/ n
再根据行列转化为数就好了
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
ll n,m,k;
inline ll read()
{
ll x=0,w=1; char ch=0;ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
return x*w;
}
inline void print(ll x)
{
if(x<0){x=-x;putchar('-');}
if(x>9)print(x/10);
putchar(x%10+48);
}
void solve()
{
cin>>n>>m>>k;
ll column=(k-1)/n+1,row=k%n;if(row==0)row+=n;
cout<<(row-1)*m+column<<endl;
}
int main()
{
ios
int t;
cin>>t;
while(t--)
solve();
return 0;
}
https://codeforces.com/contest/1506/problem/B
给你一个包含" . "和" * "的字符串,把*替换为x,第一个和最后一个*一定要替换为x,两个x之间的距离不超过k,问如何替换。
贪心。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int maxn=1e3+5;
int t,n,m,k; char str[maxn];
inline ll read()
{
ll x=0,w=1; char ch=0;ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
return x*w;
}
inline void print(ll x)
{
if(x<0){x=-x;putchar('-');}
if(x>9)print(x/10);
putchar(x%10+48);
}
void solve()
{
int cnt=0;
cin>>n>>k;
cin>>str+1;
for(int i=1;i<=n;i++)
{
if(str[i]=='*')
{
str[i]='x';
cnt++;
break;
}
}
for(int i=n;i>=1;i--)
{
if(str[i]=='*')
{
str[i]='o';
cnt++;
break;
}
}
for(int i=1;i<=n;i++)
{
if(str[i]=='x')
{
for(int j=i+k;j>=i;j--)
{
if(str[j]=='o')
{
break;
}
if(str[j]=='*')
{
str[j]='x';
cnt++;
break;
}
}
}
}
//cout<<str+1<<endl;
cout<<cnt<<endl;
}
int main()
{
ios
cin>>t;
while(t--)solve();
return 0;
}
https://codeforces.com/contest/1506/problem/C
任意给两个字符串,你可以从他们的头尾各删掉字符,令他们相等,问要删掉多少个字符。
暴力枚举,对每个第一个字符都相等的字符试试。
本来以为是最长公共子序列的题,学了之后发现两个子序列的元素有不一样的字符,然后再细看题目原来是道签到题。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
inline ll read()
{
ll x=0,w=1; char ch=0;ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
return x*w;
}
inline void print(ll x)
{
if(x<0){x=-x;putchar('-');}
if(x>9)print(x/10);
putchar(x%10+48);
}
const int maxn=1e3+5;
int t; char stra[maxn],strb[maxn];
void solve()
{
cin>>stra+1; cin>>strb+1;
int lena=strlen(stra+1),lenb=strlen(strb+1);
int ans=0;
for(int i=1;i<=lena;i++)
{
for(int j=1;j<=lenb;j++)
{
int topa=i,cnt=0;
if(stra[topa]==strb[j])
{
cnt++; topa++;
for(int k=j+1;k<=lenb;k++)
{
if(stra[topa]==strb[k])
{
cnt++;topa++;
}
else
{
break;
}
}
ans=max(ans,cnt);
}
}
}
//cout<<ans<<endl;
cout<<lena+lenb-ans*2<<endl;
}
int main()
{
ios
cin>>t;
while(t--)solve();
return 0;
}
https://codeforces.com/contest/1506/problem/D
水题,这不是A题的难度吗?不能开桶计数就排序技术就好了。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define ll long long
#define ull unsigned long long
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
inline ll read()
{
ll x=0,w=1; char ch=0;ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
return x*w;
}
inline void print(ll x)
{
if(x<0){x=-x;putchar('-');}
if(x>9)print(x/10);
putchar(x%10+48);
}
const int maxn=2e5+5;
int t,n,num[maxn];
void solve()
{
n=read();
for(int i=1;i<=n;i++)
{
num[i]=read();
}
sort(num+1,num+n+1);
int ans=0,cnt=1;
for(int i=1;i<=n;i++)
{
if(num[i]==num[i-1])
{
cnt++;
ans=max(cnt,ans);
}
else cnt=1;
}
if(ans<=n/2)
{
if(n%2)cout<<1<<endl;
else cout<<0<<endl;
return;
}
else if(ans>n/2)
{
cout<<n-(n-ans)*2<<endl;
}
}
int main()
{
ios
t=read();
while(t--)solve();
return 0;
}