思路:直接使用了一个map
代码:
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
int main(){
int T;
scanf("%d",&T);
while(T--){
int N;
scanf("%d",&N);
map<int,int> mp;
while(N--){
int temp;
scanf("%d",&temp);
mp[temp]++;
}
int min=0;int num=-1;
for(map<int,int>::iterator i=mp.begin();i!=mp.end();i++){
if(i->second>min ||( i->second==min )&&(i->first<num)){
min=i->second;
num=i->first;
}
}
printf("%d\n",num);
}
return 0;
}
思路:对应好旋转后的数组位置即可,只需要得出旋转90度的情况,180,270分别为旋转两次和三次
代码:
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
const int MAXV=60;
int G[MAXV][MAXV];
int tempG[MAXV][MAXV];
int N,M,angle;
void rotate(){
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
tempG[j][N-i-1]=G[i][j];
}
}
int temp=N;
N=M;
M=temp;
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
G[i][j]=tempG[i][j];
}
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&N,&M);
fill(G[0],G[0]+MAXV*MAXV,-1);
fill(tempG[0],tempG[0]+MAXV*MAXV,-1);
char buf[100];
for(int i=0;i<N;i++){
scanf("%s",buf);
for(int j=0;j<M;j++){
G[i][j]=buf[j]-'0';
}
}
scanf("%d",&angle);
int count=angle/90;
for(int i=0;i<count;i++){
rotate();
}
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
printf("%d",G[i][j]);
}
printf("\n");
}
}
return 0;
}
思路:
套用Dijkstra即可。
代码:
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
const int MAXV=60;
int N,M;
int G[MAXV][MAXV];
bool vis[MAXV]={false};
int d[MAXV];
void Dijkstra(int s){
fill(d,d+MAXV,N);
fill(vis,vis+MAXV,false);
d[s]=0;
for(int i=1;i<=N;i++){
int u=-1,MIN=N;
for(int j=1;j<=N;j++){
if(vis[j]==false && d[j]<MIN){
u=j;
MIN=d[j];
}
}
if(u==-1)return;
vis[u]=true;
for(int v=1;v<=N;v++){
if(vis[v]==false && G[u][v]!=N && d[u]+G[u][v]<d[v]){
d[v]=d[u]+G[u][v];
}
}
}
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&N,&M);
fill(G[0],G[0]+MAXV*MAXV,N);
for(int i=0;i<M;i++){
int u,v;
scanf("%d%d",&u,&v);
G[u][v]=1;
G[v][u]=1;
}
int min=MAXV*MAXV;
int num=MAXV;
for(int i=1;i<=N;i++){
Dijkstra(i);
int count=0;
for(int j=1;j<=N;j++){
count+=d[j];
}
if(count<min || (count==min && i<num)){
min=count;
num=i;
}
}
printf("%d\n",num);
}
return 0;
}
思路:
其实就是字符串操作+使用一个map,挺简单的
代码:
#include<cstdio>
#include<bits/stdc++.h>
using namespace std;
vector<string> getInfo(string s){
vector<string> result;
if(s.find('.')!=string::npos){
int index=s.find('.');
string sub=s.substr(0,index);
result.push_back(sub);
string sub2=s.substr(index);
if(sub2.find('a')!=string::npos){
result.push_back("append");
int index1=s.find('(');
int index2=s.find(')');
result.push_back(s.substr(index1+1,index2-index1-1));
}else{
result.push_back("sort");
}
}else if(s.find('=')!=string::npos){
int index=s.find('=');
string sub=s.substr(0,index);
result.push_back(sub);
result.push_back("clear");
}else{
int index1=s.find('[');
result.push_back(s.substr(0,index1));
int index2=s.find(']');
result.push_back("find");
result.push_back(s.substr(index1+1,index2-index1-1));
}
return result;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
int N;
scanf("%d",&N);
map<string,vector<int> > mp;
while(N--){
char buf[100];
scanf("%s",buf);
string s(buf);
vector<string> vinfo=getInfo(s);
string name=vinfo[0];
string order=vinfo[1];
if(order=="append"){
int x;
string num=vinfo[2];
sscanf(num.c_str(),"%d",&x);
mp[name].push_back(x);
// printf("name=%s,size=%d,x=%d\n",name.c_str(),mp[name].size(),x);
}else if(order=="sort"){
sort(mp[name].begin(),mp[name].end());
}else if(order=="clear"){
if(mp.find(name)!=mp.end()){
mp[name].clear();
}else{
vector<int> vt;
mp.insert(make_pair(name,vt));
}
}else if(order=="find"){
int x;
string num=vinfo[2];
sscanf(num.c_str(),"%d",&x);
// printf("name=%s,size=%d,x=%d\n",name.c_str(),mp[name].size(),x);
if(x<mp[name].size()){
printf("%d\n",mp[name][x]);
}else{
printf("ERROR\n");
}
}
}
}
return 0;
}
(注:题目图片摘自大神博客,侵权删)