题意:给定一个数n,求大于等于n并且是7的倍数且不是4的倍数。
思路:模拟。
#include<cstdio>
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i=n;;i++){
if(i%7==0&&i%4!=0){
printf("%d\n",i);
break;
}
}
}
}
题意:给定字符串,求删除元音字母加上‘y'的字符。
思路:模拟。
#include<bits/stdc++.h>
using namespace std;
char s1[7]="aeiyou";
int main(){
int T;
scanf("%d",&T);
while(T--){
string s;
cin>>s;
printf("%c",s[0]);
for(int i=1;i<s.size();i++){
int f=0;
for(int j=0;j<6;j++){
if(s[i]==s1[j]){
f=1;
break;
}
}
if(f==0)
printf("%c",s[i]);
}
printf("\n");
}
}
题意:给定数组,如果ai>ai-1&&ai>ai+1那么这是不好的,每次能删一个数,求最少的不好的数的数量。
思路:如果遇到一个不好的数并且ai+2>=ai那么通过删除ai+1能减少一个,如果ai-1==ai+1,通过删除ai能减少一个,反之不能减少。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll a[100005];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
int sum=0;
a[n+1]=-1e10;
int f=0,f1=0;
for(int i=2;i<=n-1;i++){
if(a[i]>a[i-1]&&a[i]>a[i+1])
sum++;
if(a[i]>a[i-1]&&a[i]>a[i+1]&&a[i+2]>a[i]){
f1=1;
}
if(a[i]>a[i-1]&&a[i]>a[i+1]&&a[i+2]==a[i]&&!f){
f=1;
sum--;
a[i+1]=a[i];
}
if(sum<0)
sum=0;
}
if(f1&&f==0)
sum--;
printf("%d\n",sum);
}
}
题意:给定a,b求a,b区间内斐波拉契数列的和是奇数还是偶数。
思路:打表,找规律,发现跟a,b,的数位和模3有关,一共有9种情况.
#include<bits/stdc++.h>
using namespace std;
long long f[100],f1[100];
int main(){
/*f[1]=1;
f[2]=1;
for(int i=3;i<=20;i++)
f[i]=f[i-1]+f[i-2];
f1[1]=1;
f1[0]=0;
for(int i=2;i<=20;i++)
f1[i]=f1[i-1]+f[i];
for(int i=1;i<=20;i++)
for(int j=i+1;j<=20;j++){
if((f1[j]-f1[i-1])%2==0)
printf("%d %d %d %lld\n",i,j,0,f1[j]-f1[i-1]);
else printf("%d %d %d %lld\n",i,j,1,f1[j]-f1[i-1]);
}*/
int T;
scanf("%d",&T);
while(T--){
string s,s1;
cin>>s>>s1;
int t=0,t1=0;
for(int i=0;i<s.size();i++)
t+=(s[i]-'0');
for(int i=0;i<s1.size();i++)
t1+=(s1[i]-'0');
t1%=3;
t%=3;
if(t%3==0&&t1%3==0)
puts("0");
else if(t%3==0&&t1%3==1)
puts("1");
else if(t%3==0&&t1%3==2)
puts("0");
else if(t%3==1&&t1%3==1)
puts("1");
else if(t%3==1&&t1%3==2)
puts("0");
else if(t%3==1&&t1%3==0)
puts("0");
else if(t%3==2&&t1%3==2)
puts("1");
else if(t%3==2&&t1%3==1)
puts("0");
else if(t%3==2&&t1%3==0)
puts("1");
}
}
题意:给定一个数组,每次能把一个数放到最前面,问最少操作数使得数组从小到大有序。
思路:排序,从后往前枚举需要操作的数。
#include<bits/stdc++.h>
using namespace std;
int a[100005],b[100005];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(a+1,a+1+n);
int pos=n;
for(int i=n;i>=1;i--){
if(b[i]==a[pos])
pos--;
}
printf("%d\n",pos);
}
}
题意:n个人进会展,每个人都有一些朋友一起来参加,如果一个人进展时发现他的朋友一个都没来,他会很尴尬,问使得最少的人尴尬的进展顺序以及尴尬的人数(按字典序最少输出)。
思路:用并查集连通,优先队列存尴尬的人,及人数,然后遍历优先队列,求得进展顺序。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int vis[maxn],ans[maxn];
int fa[maxn];
vector<int>g[maxn];
int find(int x){
if(x!=fa[x])
return fa[x]=find(fa[x]);
return fa[x];
}
priority_queue<int,vector<int>,greater<int> >q;
int main(){
int T;
scanf("%d",&T);
while(T--){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
fa[i]=i;
g[i].clear();
vis[i]=0;
}
int u,v;
int cnt=0,sum=0;
while(!q.empty())
q.pop();
for(int i=0;i<m;i++){
scanf("%d%d",&u,&v);
g[u].push_back(v);
g[v].push_back(u);
int fu=find(u),fv=find(v);
if(fu!=fv){
if(fu<fv)
fa[fv]=fu;
else fa[fu]=fv;
}
}
for(int i=1;i<=n;i++){
if(fa[i]==i){
sum++;
q.push(i);
vis[i]=1;
}
}
while(!q.empty()){
int u=q.top();
q.pop();
ans[++cnt]=u;
for(int i=0;i<g[u].size();i++){
int v=g[u][i];
if(vis[v]==0){
vis[v]=1;
q.push(v);
}
}
}
printf("%d\n",sum);
for(int i=1;i<=n;i++){
printf("%d",ans[i]);
if(i!=n)
printf(" ");
}
printf("\n");
}
}