没什么好说的
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <cctype>
#include <string>
#include <queue>
#define debug printf("debug\n")
#define mst(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
const int maxn=1e4+5;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int cnt[105];
int arr[105];
int ans[105];
int main()
{
int n,k;
cin>>n>>k;
mst(cnt,0);
mst(arr,0);mst(ans,0);
for(int i=1;i<=n;i++){
cin>>arr[i];
cnt[arr[i]]++;
}
int tot=0;int idx=0;
for(int i=1;i<=n;i++){
if(cnt[arr[i]]){
tot++;
cnt[arr[i]]=0;
ans[idx++]=i;
if(tot>=k) break;
}
}
if(tot>=k){
cout<<"YES"<<endl;
for(int i=0;i<idx;i++){
if(!i)
printf("%d",ans[i]);
else
printf(" %d",ans[i]);
}
printf("\n");
}else{
cout<<"NO"<<endl;
}
return 0;
}
先根据字符串长度排个序,再用find找一下是否有子串即可
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <cctype>
#include <string>
#include <queue>
#define debug printf("debug\n")
#define mst(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
const int maxn=1e4+5;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
string strs[105];
bool cmp(string sa,string sb)
{
return sa.size()>sb.size();
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
cin>>strs[i];
sort(strs,strs+n,cmp);
bool flag=1;
for(int i=0;i<n-1;i++){
if(strs[i].find(strs[i+1])==-1){
flag=0;break;
}
}
if(!flag){
cout<<"NO"<<endl;
}else{
cout<<"YES"<<endl;
for(int i=n-1;i>=0;i--)
cout<<strs[i]<<endl;
}
return 0;
}
对于一个序列,将总和减去某个元素所得到的数放进map中,map的key是这个元素,value是这个元素出现的次数,然后进行到后面的序列时再用map查找即可
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <cctype>
#include <string>
#include <queue>
#define debug printf("debug\n")
#define mst(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
const int maxn=1e5+5;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
map<int,pair<int,int>> mp; //序列序号,元素序号
int arr[2*maxn];
int main()
{
int k;
cin>>k;
pair<int,int> ansp;
int ansi,ansj;
bool flag=0;
for(int i=1;i<=k;i++){
int sum=0;
int n;cin>>n;
for(int j=1;j<=n;j++){
cin>>arr[j];
if(!flag)
sum+=arr[j];
}
if(!flag)
{
for(int idx=1;idx<=n;idx++){
if(mp.count(sum-arr[idx])!=0&&mp[sum-arr[idx]].first!=i){
flag=1;
ansp=mp[sum-arr[idx]];
ansi=i;ansj=idx;
break;
}
else
mp[sum-arr[idx]]=make_pair(i,idx);
}
}
}
if(flag){
printf("YES\n");
printf("%d %d\n",ansi,ansj);
printf("%d %d\n",ansp.first,ansp.second);
}else{
printf("NO\n");
}
return 0;
}
988D - Points and Powes of Two
这道题有一个结论,就是符合要求的数字不超过三个,且它们之间满足一个关系,即三个数之间成等差数列,公差为2的n次幂(具体怎么来的,可以看这篇文章->Codeforces 988D(STL运用+思维))
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <cctype>
#include <string>
#include <queue>
#define debug printf("debug\n")
#define mst(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
const int maxn=1e5+5;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
ll arr[2*maxn];
set<ll> st;
int main()
{
ll n;
cin>>n;
for(ll i=0;i<n;i++){
scanf("%lld",&arr[i]);
st.insert(arr[i]);
}
for(ll i=0;i<n;i++){
for(ll j=1;j<2e9+5;j<<=1){
if(st.count(arr[i]+j)&&st.count(arr[i]+2*j)){
printf("3\n");
printf("%lld %lld %lld\n",arr[i],arr[i]+j,arr[i]+2*j);
goto end;
}
}
}
for(ll i=0;i<n;i++){
for(ll j=1;j<2e9+5;j<<=1){
if(st.count(arr[i]+j)){
printf("2\n");
printf("%lld %lld\n",arr[i],arr[i]+j);
goto end;
}
}
}
printf("1\n%lld\n",arr[0]);
end:;
return 0;
}
因为能被25整除的数其末尾两位数一定是00,25,50,75中的其中一个,所以对于暴力模拟即可,得到四个交换次数,最后取最小的那个。对于前导0的处理,方法是若完成模拟后出现了前导0,就将这个0与数字中第一个(从高位开始数)非零的数交换,并将交换步数加到答案上。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <cctype>
#include <string>
#include <queue>
#define debug printf("debug\n")
#define mst(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
const int maxn=1e5+5;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
//00,25,50,75
void swap_(char a,char b)
{
char tmp;
tmp=a;
a=b;
b=tmp;
}
int solve(char ch1,char ch2,string str)
{
int len=str.size();
int cnt=0;
for(int i=len-1;i>=0;i--){
if(str[i]==ch2){
for(int j=i;j<len-1;j++){
cnt++;
swap_(str[j],str[j+1]);
}
}
break;
}
for(int i=len-2;i>=0;i--){
if(str[i]==ch1){
for(int j=i;j<len-2;j++){
cnt++;
swap_(str[j],str[j+1]);
}
}
break;
}
int pos=0;
if(str[0]=='0'){
for(int i=0;i<len;i++){
if(str[i]!=0){
pos=i;break;
}
}
cnt+=pos;
}
return cnt;
}
int main()
{
string num;
cin>>num;
int ans1,ans2,ans3,ans4;
ans1=solve('0','0',num);
ans2=solve('2','5',num);
ans3=solve('5','0',num);
ans4=solve('7','5',num);
int ans=min(ans1,min(ans2,min(ans3,ans4)));
cout<<ans<<endl;
return 0;
}