A. Dice Rolling
题目:
题意:
就是求任意需要筛几次达到目标值
代码如下:
#include <bits/stdc++.h>
using namespace std;
int t;
int x;
int main()
{
scanf("%d",&t);
while (t--)
{
scanf("%d",&x);
if(x%7==0)
{
printf("%d\n",x/7);
}
else
{
printf("%d\n",x/7+1);
}
}
return 0;
}
B. Letters Rearranging
题目:
传送门B
题意:
给出一个字符串,将其中任意一个不为回文字符串的输出。
思路:
首先,看看是否都由一个字符组成,如果是,则直接输出-1.
接下来就判断是否为回文字符串,若为,则交换任意两个不同的字符,然后输出即可。
代码如下:
#include <bits/stdc++.h>
using namespace std;
int t;
char s[1005];
map<char,int>ma;
bool judge ()
{
int len=strlen(s);
for (int i=0;i<len/2;i++)
{
if(s[i]!=s[len-1-i])
return false;
}
return true;
}
int main()
{
scanf("%d",&t);
while (t--)
{
scanf("%s",s);
int len=strlen(s);
ma.clear();
for (int i=0;i<len;i++)
{
ma[s[i]]=1;
}
if(ma.size()==1)
{
printf("-1\n");
continue;
}
if(!judge())
{
printf("%s\n",s);
}
else
{
for (int i=1;i<=len/2;i++)
{
if(s[0]!=s[i])
{
swap(s[0],s[i]);
break;
}
}
printf("%s\n",s);
}
}
return 0;
}
C. Mishka and the Last Exam
题目:
传送门C
题意:
给出一个b数组和a数组的长度n,其中b[i]=a[i]+a[n-1-i];
输出任意一个满足条件的a数组
a数组是非递减排序的。
思路:
一开始令a[0]=0,a[n-1]=b[0],然后遍历b数组元素。
(1)如果b[i]>=b[i-1],a[i]等于在加上a[i-1]的基础上加上b[i]-b[i-1]的差值
(2) 如果b[i]<b[i-1],则a[i]=a[i-1].
a[n-1-i]=b[i]-a[i];
代码如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2*1e+5+5;
ll b[maxn];
ll a[maxn];
int n;
int main()
{
scanf("%d",&n);
for (int i=0;i<n/2;i++)
{
scanf("%lld",&b[i]);
}
a[0]=0;
a[n-1]=b[0]-a[0];
for (int i=1;i<n/2;i++)
{
if(b[i]>=b[i-1])
{
a[i]=a[i-1]+b[i]-b[i-1];
a[n-1-i]=b[i]-a[i];
}
else
{
a[i]=a[i-1];
a[n-1-i]=b[i]-a[i];
}
}
for (int i=0;i<n;i++)
{
printf("%lld%c",a[i],i==n-1?'\n':' ');
}
return 0;
}
D. Beautiful Graph
题目:
题意:
给出n个顶点,m条边,每个顶点有1,2,3个值可以选择,要求每条边所连的两个顶点的和必须为奇数,
求有多少种方法满足条件。
思路:
dfs,这题卡vector,vector建图会超时,得优化优化。就是用多少个顶点,清理多少个vector数组。
代码如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn=3*1e5+5;
int t;
typedef long long ll;
const ll mod=998244353;
vector<int>v[maxn],re;
int n,m;
int vis[maxn];
int visnum;
int edge;
int flag;
ll ans;
int visa,visb;
void dfs (int x,int num)
{
vis[x]=num;
if(num%2)
visa++;
else
visb++;
int Size=v[x].size();
for (int i=0;i<Size;i++)
{
int e=v[x][i];
if(vis[e]!=-1)
{
if(vis[e]==num)
{
flag=1;
}
}
else
dfs(e,num^1);
}
}
ll pow_mod(ll a, ll b)
{
ll ans = 1;
while(b){
if(b&1){
ans = (ans * a) % mod;
}
a = (a * a) % mod;
b >>= 1;
}
return ans;
}
int main()
{
scanf("%d",&t);
while (t--)
{
ans=1;
scanf("%d%d",&n,&m);
for (int i=0;i<=n;i++)
{
v[i].clear();
vis[i]=-1;
}
for (int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
flag=0;
for (int i=1;i<=n;i++)
{
if(vis[i]==-1)
{
visa=0;visb=0;
dfs(i,1);
ans*=(pow_mod(2,visa)+pow_mod(2,visb))%mod;
ans%=mod;
}
}
if(flag)
{
printf("0\n");
}
else
{
printf("%I64d\n",ans);
}
}
return 0;
}